From ed3581092363a1bb8b6549905aaf1d0ca969da7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E6=B3=89?= <80071319@qq.com> Date: Mon, 9 Dec 2019 10:23:56 +0800 Subject: [PATCH] Initial commit --- .gitignore | 7 + CHANGELOG | 22 + README.md | 23 + SDK/EasyLanguageSdk2.0.ec | Bin 0 -> 112320 bytes SDK/SDK2.0.e | Bin 0 -> 112775 bytes admin/.DS_Store | Bin 0 -> 6148 bytes admin/admin.html | 201 + admin/ajax.php | 1640 + admin/dialogs/anchor/anchor.html | 57 + admin/dialogs/attachment/attachment.css | 713 + admin/dialogs/attachment/attachment.html | 61 + admin/dialogs/attachment/attachment.js | 761 + .../attachment/fileTypeImages/icon_chm.gif | Bin 0 -> 923 bytes .../fileTypeImages/icon_default.png | Bin 0 -> 841 bytes .../attachment/fileTypeImages/icon_doc.gif | Bin 0 -> 1012 bytes .../attachment/fileTypeImages/icon_exe.gif | Bin 0 -> 949 bytes .../attachment/fileTypeImages/icon_jpg.gif | Bin 0 -> 950 bytes .../attachment/fileTypeImages/icon_mp3.gif | Bin 0 -> 986 bytes .../attachment/fileTypeImages/icon_mv.gif | Bin 0 -> 1001 bytes .../attachment/fileTypeImages/icon_pdf.gif | Bin 0 -> 996 bytes .../attachment/fileTypeImages/icon_ppt.gif | Bin 0 -> 1001 bytes .../attachment/fileTypeImages/icon_psd.gif | Bin 0 -> 1009 bytes .../attachment/fileTypeImages/icon_rar.gif | Bin 0 -> 1007 bytes .../attachment/fileTypeImages/icon_txt.gif | Bin 0 -> 970 bytes .../attachment/fileTypeImages/icon_xls.gif | Bin 0 -> 1005 bytes admin/dialogs/attachment/images/alignicon.gif | Bin 0 -> 1051 bytes admin/dialogs/attachment/images/alignicon.png | Bin 0 -> 3714 bytes admin/dialogs/attachment/images/bg.png | Bin 0 -> 2810 bytes .../dialogs/attachment/images/file-icons.gif | Bin 0 -> 20097 bytes .../dialogs/attachment/images/file-icons.png | Bin 0 -> 44070 bytes admin/dialogs/attachment/images/icons.gif | Bin 0 -> 453 bytes admin/dialogs/attachment/images/icons.png | Bin 0 -> 2678 bytes admin/dialogs/attachment/images/image.png | Bin 0 -> 1672 bytes admin/dialogs/attachment/images/progress.png | Bin 0 -> 1269 bytes admin/dialogs/attachment/images/success.gif | Bin 0 -> 445 bytes admin/dialogs/attachment/images/success.png | Bin 0 -> 1621 bytes admin/dialogs/background/background.css | 192 + admin/dialogs/background/background.html | 63 + admin/dialogs/background/background.js | 377 + admin/dialogs/background/images/bg.png | Bin 0 -> 2810 bytes admin/dialogs/background/images/success.png | Bin 0 -> 1621 bytes admin/dialogs/charts/chart.config.js | 65 + admin/dialogs/charts/charts.css | 165 + admin/dialogs/charts/charts.html | 94 + admin/dialogs/charts/charts.js | 519 + admin/dialogs/charts/images/charts0.png | Bin 0 -> 25306 bytes admin/dialogs/charts/images/charts1.png | Bin 0 -> 19263 bytes admin/dialogs/charts/images/charts2.png | Bin 0 -> 23016 bytes admin/dialogs/charts/images/charts3.png | Bin 0 -> 7823 bytes admin/dialogs/charts/images/charts4.png | Bin 0 -> 8344 bytes admin/dialogs/charts/images/charts5.png | Bin 0 -> 47084 bytes admin/dialogs/emotion/emotion.css | 129 + admin/dialogs/emotion/emotion.html | 70 + admin/dialogs/emotion/emotion.js | 186 + admin/dialogs/emotion/images/0.gif | Bin 0 -> 43 bytes admin/dialogs/emotion/images/bface.gif | Bin 0 -> 27167 bytes admin/dialogs/emotion/images/cface.gif | Bin 0 -> 8603 bytes admin/dialogs/emotion/images/fface.gif | Bin 0 -> 18479 bytes admin/dialogs/emotion/images/jxface2.gif | Bin 0 -> 40706 bytes .../emotion/images/neweditor-tab-bg.png | Bin 0 -> 216 bytes admin/dialogs/emotion/images/tface.gif | Bin 0 -> 19805 bytes admin/dialogs/emotion/images/wface.gif | Bin 0 -> 49850 bytes admin/dialogs/emotion/images/yface.gif | Bin 0 -> 28409 bytes admin/dialogs/gmap/gmap.html | 109 + admin/dialogs/help/help.css | 37 + admin/dialogs/help/help.html | 82 + admin/dialogs/help/help.js | 57 + admin/dialogs/image/image.css | 930 + admin/dialogs/image/image.html | 126 + admin/dialogs/image/image.js | 1150 + admin/dialogs/image/images/alignicon.jpg | Bin 0 -> 16101 bytes admin/dialogs/image/images/bg.png | Bin 0 -> 2810 bytes admin/dialogs/image/images/icons.gif | Bin 0 -> 453 bytes admin/dialogs/image/images/icons.png | Bin 0 -> 2678 bytes admin/dialogs/image/images/image.png | Bin 0 -> 1672 bytes admin/dialogs/image/images/progress.png | Bin 0 -> 1269 bytes admin/dialogs/image/images/success.gif | Bin 0 -> 445 bytes admin/dialogs/image/images/success.png | Bin 0 -> 1621 bytes admin/dialogs/insertframe/insertframe.html | 134 + admin/dialogs/internal.js | 81 + admin/dialogs/link/link.html | 142 + admin/dialogs/map/map.html | 170 + admin/dialogs/map/show.html | 116 + admin/dialogs/music/music.css | 146 + admin/dialogs/music/music.html | 32 + admin/dialogs/music/music.js | 193 + admin/dialogs/preview/preview.html | 45 + admin/dialogs/scrawl/images/addimg.png | Bin 0 -> 628 bytes admin/dialogs/scrawl/images/brush.png | Bin 0 -> 608 bytes admin/dialogs/scrawl/images/delimg.png | Bin 0 -> 516 bytes admin/dialogs/scrawl/images/delimgH.png | Bin 0 -> 578 bytes admin/dialogs/scrawl/images/empty.png | Bin 0 -> 519 bytes admin/dialogs/scrawl/images/emptyH.png | Bin 0 -> 657 bytes admin/dialogs/scrawl/images/eraser.png | Bin 0 -> 43271 bytes admin/dialogs/scrawl/images/redo.png | Bin 0 -> 454 bytes admin/dialogs/scrawl/images/redoH.png | Bin 0 -> 536 bytes admin/dialogs/scrawl/images/scale.png | Bin 0 -> 435 bytes admin/dialogs/scrawl/images/scaleH.png | Bin 0 -> 330 bytes admin/dialogs/scrawl/images/size.png | Bin 0 -> 775 bytes admin/dialogs/scrawl/images/undo.png | Bin 0 -> 444 bytes admin/dialogs/scrawl/images/undoH.png | Bin 0 -> 511 bytes admin/dialogs/scrawl/scrawl.css | 324 + admin/dialogs/scrawl/scrawl.html | 95 + admin/dialogs/scrawl/scrawl.js | 677 + .../dialogs/searchreplace/searchreplace.html | 137 + admin/dialogs/searchreplace/searchreplace.js | 168 + admin/dialogs/snapscreen/snapscreen.html | 90 + admin/dialogs/spechars/spechars.html | 42 + admin/dialogs/spechars/spechars.js | 86 + admin/dialogs/table/dragicon.png | Bin 0 -> 304 bytes admin/dialogs/table/edittable.css | 85 + admin/dialogs/table/edittable.html | 69 + admin/dialogs/table/edittable.js | 241 + admin/dialogs/table/edittd.html | 62 + admin/dialogs/table/edittip.html | 33 + admin/dialogs/template/config.js | 42 + admin/dialogs/template/images/bg.gif | Bin 0 -> 84 bytes admin/dialogs/template/images/pre0.png | Bin 0 -> 250 bytes admin/dialogs/template/images/pre1.png | Bin 0 -> 291 bytes admin/dialogs/template/images/pre2.png | Bin 0 -> 394 bytes admin/dialogs/template/images/pre3.png | Bin 0 -> 485 bytes admin/dialogs/template/images/pre4.png | Bin 0 -> 393 bytes admin/dialogs/template/template.css | 99 + admin/dialogs/template/template.html | 26 + admin/dialogs/template/template.js | 53 + admin/dialogs/video/images/bg.png | Bin 0 -> 2810 bytes admin/dialogs/video/images/center_focus.jpg | Bin 0 -> 11795 bytes admin/dialogs/video/images/file-icons.gif | Bin 0 -> 20097 bytes admin/dialogs/video/images/file-icons.png | Bin 0 -> 44070 bytes admin/dialogs/video/images/icons.gif | Bin 0 -> 453 bytes admin/dialogs/video/images/icons.png | Bin 0 -> 2678 bytes admin/dialogs/video/images/image.png | Bin 0 -> 1672 bytes admin/dialogs/video/images/left_focus.jpg | Bin 0 -> 11423 bytes admin/dialogs/video/images/none_focus.jpg | Bin 0 -> 11546 bytes admin/dialogs/video/images/progress.png | Bin 0 -> 1269 bytes admin/dialogs/video/images/right_focus.jpg | Bin 0 -> 11334 bytes admin/dialogs/video/images/success.gif | Bin 0 -> 445 bytes admin/dialogs/video/images/success.png | Bin 0 -> 1621 bytes admin/dialogs/video/video.css | 799 + admin/dialogs/video/video.html | 104 + admin/dialogs/video/video.js | 803 + admin/dialogs/webapp/webapp.html | 70 + .../dialogs/wordimage/fClipboard_ueditor.swf | Bin 0 -> 1908 bytes admin/dialogs/wordimage/imageUploader.swf | Bin 0 -> 62857 bytes admin/dialogs/wordimage/tangram.js | 1488 + admin/dialogs/wordimage/wordimage.html | 153 + admin/dialogs/wordimage/wordimage.js | 159 + admin/html/czkm.html | 263 + admin/html/ddgl.html | 205 + admin/html/dlgl.html | 302 + admin/html/dljb.html | 287 + admin/html/fksz.html | 201 + admin/html/ktsq.html | 113 + admin/html/sqgl.html | 192 + admin/html/tckm.html | 256 + admin/html/tclb.html | 130 + admin/html/tjtc.html | 140 + admin/html/tjyy.html | 196 + admin/html/userset.html | 90 + admin/html/welcome.html | 303 + admin/html/xjsz.html | 153 + admin/html/xqbj.html | 286 + admin/html/xtsz.html | 488 + admin/html/yhxt.html | 150 + admin/html/yxrz.html | 71 + admin/html/yygl.html | 206 + admin/index.php | 33 + admin/lang/en/en.js | 762 + admin/lang/en/images/addimage.png | Bin 0 -> 3373 bytes .../lang/en/images/alldeletebtnhoverskin.png | Bin 0 -> 743 bytes admin/lang/en/images/alldeletebtnupskin.png | Bin 0 -> 743 bytes admin/lang/en/images/background.png | Bin 0 -> 3854 bytes admin/lang/en/images/button.png | Bin 0 -> 4929 bytes admin/lang/en/images/copy.png | Bin 0 -> 1222 bytes admin/lang/en/images/deletedisable.png | Bin 0 -> 649 bytes admin/lang/en/images/deleteenable.png | Bin 0 -> 664 bytes admin/lang/en/images/listbackground.png | Bin 0 -> 3750 bytes admin/lang/en/images/localimage.png | Bin 0 -> 3083 bytes admin/lang/en/images/music.png | Bin 0 -> 91561 bytes admin/lang/en/images/rotateleftdisable.png | Bin 0 -> 719 bytes admin/lang/en/images/rotateleftenable.png | Bin 0 -> 952 bytes admin/lang/en/images/rotaterightdisable.png | Bin 0 -> 754 bytes admin/lang/en/images/rotaterightenable.png | Bin 0 -> 1007 bytes admin/lang/en/images/upload.png | Bin 0 -> 3941 bytes admin/lang/zh-cn/images/copy.png | Bin 0 -> 4319 bytes admin/lang/zh-cn/images/localimage.png | Bin 0 -> 6979 bytes admin/lang/zh-cn/images/music.png | Bin 0 -> 23106 bytes admin/lang/zh-cn/images/upload.png | Bin 0 -> 6608 bytes admin/lang/zh-cn/zh-cn.js | 739 + admin/login.html | 141 + admin/php/Uploader.class.php | 375 + admin/php/action_crawler.php | 44 + admin/php/action_list.php | 97 + admin/php/action_upload.php | 66 + admin/php/config.json | 251 + admin/php/controller.php | 61 + admin/themes/default/css/ueditor.css | 1957 + admin/themes/default/css/ueditor.min.css | 8 + admin/themes/default/dialogbase.css | 100 + admin/themes/default/images/anchor.gif | Bin 0 -> 184 bytes admin/themes/default/images/arrow.png | Bin 0 -> 1173 bytes admin/themes/default/images/arrow_down.png | Bin 0 -> 1610 bytes admin/themes/default/images/arrow_up.png | Bin 0 -> 1649 bytes admin/themes/default/images/button-bg.gif | Bin 0 -> 1114 bytes admin/themes/default/images/cancelbutton.gif | Bin 0 -> 1227 bytes admin/themes/default/images/charts.png | Bin 0 -> 518 bytes admin/themes/default/images/cursor_h.gif | Bin 0 -> 253 bytes admin/themes/default/images/cursor_h.png | Bin 0 -> 175 bytes admin/themes/default/images/cursor_v.gif | Bin 0 -> 370 bytes admin/themes/default/images/cursor_v.png | Bin 0 -> 177 bytes .../themes/default/images/dialog-title-bg.png | Bin 0 -> 938 bytes admin/themes/default/images/filescan.png | Bin 0 -> 4282 bytes admin/themes/default/images/highlighted.gif | Bin 0 -> 111 bytes admin/themes/default/images/icons-all.gif | Bin 0 -> 3750 bytes admin/themes/default/images/icons.gif | Bin 0 -> 20947 bytes admin/themes/default/images/icons.png | Bin 0 -> 19694 bytes admin/themes/default/images/loaderror.png | Bin 0 -> 3209 bytes admin/themes/default/images/loading.gif | Bin 0 -> 734 bytes admin/themes/default/images/lock.gif | Bin 0 -> 1062 bytes .../default/images/neweditor-tab-bg.png | Bin 0 -> 216 bytes admin/themes/default/images/pagebreak.gif | Bin 0 -> 54 bytes admin/themes/default/images/scale.png | Bin 0 -> 167 bytes admin/themes/default/images/sortable.png | Bin 0 -> 2851 bytes admin/themes/default/images/spacer.gif | Bin 0 -> 43 bytes admin/themes/default/images/sparator_v.png | Bin 0 -> 122 bytes .../default/images/table-cell-align.png | Bin 0 -> 1847 bytes .../default/images/tangram-colorpicker.png | Bin 0 -> 17355 bytes admin/themes/default/images/toolbar_bg.png | Bin 0 -> 170 bytes admin/themes/default/images/unhighlighted.gif | Bin 0 -> 111 bytes admin/themes/default/images/upload.png | Bin 0 -> 6608 bytes admin/themes/default/images/videologo.gif | Bin 0 -> 1604 bytes admin/themes/default/images/word.gif | Bin 0 -> 1019 bytes admin/themes/default/images/wordpaste.png | Bin 0 -> 6467 bytes admin/themes/iframe.css | 1 + admin/third-party/SyntaxHighlighter/shCore.js | 3535 ++ .../SyntaxHighlighter/shCoreDefault.css | 1 + admin/third-party/codemirror/codemirror.css | 206 + admin/third-party/codemirror/codemirror.js | 4255 +++ .../highcharts/adapters/mootools-adapter.js | 13 + .../adapters/mootools-adapter.src.js | 316 + .../highcharts/adapters/prototype-adapter.js | 15 + .../adapters/prototype-adapter.src.js | 320 + .../adapters/standalone-framework.js | 17 + .../adapters/standalone-framework.src.js | 584 + .../third-party/highcharts/highcharts-more.js | 50 + .../highcharts/highcharts-more.src.js | 2436 ++ admin/third-party/highcharts/highcharts.js | 283 + .../third-party/highcharts/highcharts.src.js | 16994 +++++++++ .../highcharts/modules/annotations.js | 7 + .../highcharts/modules/annotations.src.js | 401 + .../highcharts/modules/canvas-tools.js | 133 + .../highcharts/modules/canvas-tools.src.js | 3189 ++ admin/third-party/highcharts/modules/data.js | 17 + .../highcharts/modules/data.src.js | 582 + .../highcharts/modules/drilldown.js | 11 + .../highcharts/modules/drilldown.src.js | 448 + .../highcharts/modules/exporting.js | 22 + .../highcharts/modules/exporting.src.js | 709 + .../third-party/highcharts/modules/funnel.js | 12 + .../highcharts/modules/funnel.src.js | 286 + .../third-party/highcharts/modules/heatmap.js | 1 + .../highcharts/modules/heatmap.src.js | 54 + admin/third-party/highcharts/modules/map.js | 27 + .../third-party/highcharts/modules/map.src.js | 1007 + .../highcharts/modules/no-data-to-display.js | 12 + .../modules/no-data-to-display.src.js | 128 + .../highcharts/themes/dark-blue.js | 254 + .../highcharts/themes/dark-green.js | 255 + admin/third-party/highcharts/themes/gray.js | 257 + admin/third-party/highcharts/themes/grid.js | 103 + admin/third-party/highcharts/themes/skies.js | 89 + admin/third-party/jquery-1.10.2.js | 9820 +++++ admin/third-party/jquery-1.10.2.min.js | 6 + admin/third-party/jquery-1.10.2.min.map | 1204 + .../snapscreen/UEditorSnapscreen.exe | Bin 0 -> 519936 bytes admin/third-party/video-js/font/vjs.eot | Bin 0 -> 3536 bytes admin/third-party/video-js/font/vjs.svg | 76 + admin/third-party/video-js/font/vjs.ttf | Bin 0 -> 3372 bytes admin/third-party/video-js/font/vjs.woff | Bin 0 -> 4228 bytes admin/third-party/video-js/video-js.css | 855 + admin/third-party/video-js/video-js.min.css | 5 + admin/third-party/video-js/video-js.swf | Bin 0 -> 16745 bytes admin/third-party/video-js/video.dev.js | 7283 ++++ admin/third-party/video-js/video.js | 129 + admin/third-party/webuploader/Uploader.swf | Bin 0 -> 49382 bytes admin/third-party/webuploader/webuploader.css | 31 + .../webuploader/webuploader.custom.js | 5685 +++ .../webuploader/webuploader.custom.min.js | 2 + .../webuploader/webuploader.flashonly.js | 4178 +++ .../webuploader/webuploader.flashonly.min.js | 2 + .../webuploader/webuploader.html5only.js | 5561 +++ .../webuploader/webuploader.html5only.min.js | 2 + admin/third-party/webuploader/webuploader.js | 6748 ++++ .../webuploader/webuploader.min.js | 2 + .../webuploader/webuploader.withoutimage.js | 4595 +++ .../webuploader.withoutimage.min.js | 2 + admin/third-party/xss.min.js | 1 + .../zeroclipboard/ZeroClipboard.js | 1262 + .../zeroclipboard/ZeroClipboard.min.js | 9 + .../zeroclipboard/ZeroClipboard.swf | Bin 0 -> 3933 bytes admin/ueditor.all.js | 29948 ++++++++++++++++ admin/ueditor.all.min.js | 18 + admin/ueditor.config.js | 496 + admin/ueditor.parse.js | 1034 + admin/ueditor.parse.min.js | 7 + admin/welcome.html | 303 + agent/agent.html | 167 + agent/ajax.php | 1231 + agent/html/buy.page.inc.php | 151 + agent/html/czkm.html | 264 + agent/html/ddjl.html | 189 + agent/html/jbts.html | 140 + agent/html/ktsq.html | 121 + agent/html/ktxj.html | 158 + agent/html/sqgl.html | 189 + agent/html/tckm.html | 256 + agent/html/userset.html | 90 + agent/html/welcome.html | 184 + agent/html/xjgl.html | 125 + agent/html/zxcz.html | 139 + agent/index.php | 33 + agent/login.html | 124 + ajax.php | 1162 + api.php | 391 + api/Communication.php | 238 + api/monitor.php | 54 + auth.php | 122 + change.php | 252 + function/Encryption.class.php | 311 + function/GetVerification.php | 13 + function/MailTipsTemplate.php | 29 + function/Tips.php | 62 + function/VerificationCode.class.php | 66 + function/api.class.php | 29 + function/code.php | 0 function/color.inc.html | 1 + function/communication.php | 93 + function/db.class.php | 423 + function/function_app.php | 32 + function/function_auth.php | 291 + function/function_core.php | 1 + function/function_page.php | 11 + function/setname.inc.php | 37 + function/trade.inc.php | 121 + function/ver.inc.php | 9 + img/backdrop/micro_carbon.png | Bin 0 -> 117 bytes img/backdrop/tactile_noise.png | Bin 0 -> 1197 bytes index.php | 323 + mdl/LICENSE | 212 + mdl/bower.json | 29 + mdl/dog.png | Bin 0 -> 496632 bytes mdl/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2 | Bin 0 -> 60832 bytes mdl/jquery.min.js | 6 + mdl/material.css | 13487 +++++++ mdl/material.js | 4010 +++ mdl/material.light_blue-purple.min.css | 8 + mdl/material.min.css | 35 + mdl/material.min.css.map | 84 + mdl/material.min.js | 1022 + mdl/material.min.js.map | 630 + mdl/package.json | 77 + mdl/timg.jpg | Bin 0 -> 65618 bytes openagent.php | 249 + pay/epay/epay.config.php | 9 + pay/epay/lib/epay_core.function.php | 177 + pay/epay/lib/epay_md5.function.php | 41 + pay/epay/lib/epay_notify.class.php | 121 + pay/epay/lib/epay_submit.class.php | 97 + pay/epay/notify_url.php | 52 + pay/epay/return_url.php | 52 + payment.php | 163 + payresult.php | 37 + query.php | 130 + static/canvas-particle.js | 168 + static/frame/echarts/echarts.min.js | 36 + static/frame/layui/css/layui.css | 2 + static/frame/layui/css/layui.mobile.css | 2 + static/frame/layui/css/modules/code.css | 2 + .../css/modules/laydate/default/laydate.css | 2 + .../css/modules/layer/default/icon-ext.png | Bin 0 -> 5911 bytes .../layui/css/modules/layer/default/icon.png | Bin 0 -> 11493 bytes .../layui/css/modules/layer/default/layer.css | 2 + .../css/modules/layer/default/loading-0.gif | Bin 0 -> 5793 bytes .../css/modules/layer/default/loading-1.gif | Bin 0 -> 701 bytes .../css/modules/layer/default/loading-2.gif | Bin 0 -> 1787 bytes static/frame/layui/font/iconfont.eot | Bin 0 -> 40144 bytes static/frame/layui/font/iconfont.svg | 468 + static/frame/layui/font/iconfont.ttf | Bin 0 -> 39968 bytes static/frame/layui/font/iconfont.woff | Bin 0 -> 26328 bytes static/frame/layui/lay/modules/carousel.js | 2 + static/frame/layui/lay/modules/code.js | 2 + static/frame/layui/lay/modules/colorpicker.js | 2 + static/frame/layui/lay/modules/element.js | 2 + static/frame/layui/lay/modules/flow.js | 2 + static/frame/layui/lay/modules/form.js | 2 + static/frame/layui/lay/modules/jquery.js | 5 + static/frame/layui/lay/modules/laydate.js | 2 + static/frame/layui/lay/modules/layedit.js | 2 + static/frame/layui/lay/modules/layer.js | 2 + static/frame/layui/lay/modules/laypage.js | 2 + static/frame/layui/lay/modules/laytpl.js | 2 + static/frame/layui/lay/modules/mobile.js | 2 + static/frame/layui/lay/modules/rate.js | 2 + static/frame/layui/lay/modules/slider.js | 2 + static/frame/layui/lay/modules/table.js | 2 + static/frame/layui/lay/modules/tree.js | 2 + static/frame/layui/lay/modules/upload.js | 2 + static/frame/layui/lay/modules/util.js | 2 + static/frame/layui/layui.all.js | 5 + static/frame/layui/layui.js | 2 + static/frame/static/css/style.css | 604 + static/frame/static/image/bg.png | Bin 0 -> 5932 bytes static/frame/static/image/code.png | Bin 0 -> 2108 bytes static/frame/static/js/vip_comm.js | 309 + static/frame/static/js/vip_nav.js | 73 + static/frame/static/js/vip_tab.js | 29 + static/frame/static/js/vip_table.js | 115 + static/jquery-3.3.1.js | 10328 ++++++ static/jquery-3.3.1.min.map | 1219 + static/js/index.js | 11 + 420 files changed, 181538 insertions(+) create mode 100644 .gitignore create mode 100644 CHANGELOG create mode 100644 README.md create mode 100644 SDK/EasyLanguageSdk2.0.ec create mode 100644 SDK/SDK2.0.e create mode 100644 admin/.DS_Store create mode 100644 admin/admin.html create mode 100644 admin/ajax.php create mode 100644 admin/dialogs/anchor/anchor.html create mode 100644 admin/dialogs/attachment/attachment.css create mode 100644 admin/dialogs/attachment/attachment.html create mode 100644 admin/dialogs/attachment/attachment.js create mode 100644 admin/dialogs/attachment/fileTypeImages/icon_chm.gif create mode 100644 admin/dialogs/attachment/fileTypeImages/icon_default.png create mode 100644 admin/dialogs/attachment/fileTypeImages/icon_doc.gif create mode 100644 admin/dialogs/attachment/fileTypeImages/icon_exe.gif create mode 100644 admin/dialogs/attachment/fileTypeImages/icon_jpg.gif create mode 100644 admin/dialogs/attachment/fileTypeImages/icon_mp3.gif create mode 100644 admin/dialogs/attachment/fileTypeImages/icon_mv.gif create mode 100644 admin/dialogs/attachment/fileTypeImages/icon_pdf.gif create mode 100644 admin/dialogs/attachment/fileTypeImages/icon_ppt.gif create mode 100644 admin/dialogs/attachment/fileTypeImages/icon_psd.gif create mode 100644 admin/dialogs/attachment/fileTypeImages/icon_rar.gif create mode 100644 admin/dialogs/attachment/fileTypeImages/icon_txt.gif create mode 100644 admin/dialogs/attachment/fileTypeImages/icon_xls.gif create mode 100644 admin/dialogs/attachment/images/alignicon.gif create mode 100644 admin/dialogs/attachment/images/alignicon.png create mode 100644 admin/dialogs/attachment/images/bg.png create mode 100644 admin/dialogs/attachment/images/file-icons.gif create mode 100644 admin/dialogs/attachment/images/file-icons.png create mode 100644 admin/dialogs/attachment/images/icons.gif create mode 100644 admin/dialogs/attachment/images/icons.png create mode 100644 admin/dialogs/attachment/images/image.png create mode 100644 admin/dialogs/attachment/images/progress.png create mode 100644 admin/dialogs/attachment/images/success.gif create mode 100644 admin/dialogs/attachment/images/success.png create mode 100644 admin/dialogs/background/background.css create mode 100644 admin/dialogs/background/background.html create mode 100644 admin/dialogs/background/background.js create mode 100644 admin/dialogs/background/images/bg.png create mode 100644 admin/dialogs/background/images/success.png create mode 100644 admin/dialogs/charts/chart.config.js create mode 100644 admin/dialogs/charts/charts.css create mode 100644 admin/dialogs/charts/charts.html create mode 100644 admin/dialogs/charts/charts.js create mode 100644 admin/dialogs/charts/images/charts0.png create mode 100644 admin/dialogs/charts/images/charts1.png create mode 100644 admin/dialogs/charts/images/charts2.png create mode 100644 admin/dialogs/charts/images/charts3.png create mode 100644 admin/dialogs/charts/images/charts4.png create mode 100644 admin/dialogs/charts/images/charts5.png create mode 100644 admin/dialogs/emotion/emotion.css create mode 100644 admin/dialogs/emotion/emotion.html create mode 100644 admin/dialogs/emotion/emotion.js create mode 100644 admin/dialogs/emotion/images/0.gif create mode 100644 admin/dialogs/emotion/images/bface.gif create mode 100644 admin/dialogs/emotion/images/cface.gif create mode 100644 admin/dialogs/emotion/images/fface.gif create mode 100644 admin/dialogs/emotion/images/jxface2.gif create mode 100644 admin/dialogs/emotion/images/neweditor-tab-bg.png create mode 100644 admin/dialogs/emotion/images/tface.gif create mode 100644 admin/dialogs/emotion/images/wface.gif create mode 100644 admin/dialogs/emotion/images/yface.gif create mode 100644 admin/dialogs/gmap/gmap.html create mode 100644 admin/dialogs/help/help.css create mode 100644 admin/dialogs/help/help.html create mode 100644 admin/dialogs/help/help.js create mode 100644 admin/dialogs/image/image.css create mode 100644 admin/dialogs/image/image.html create mode 100644 admin/dialogs/image/image.js create mode 100644 admin/dialogs/image/images/alignicon.jpg create mode 100644 admin/dialogs/image/images/bg.png create mode 100644 admin/dialogs/image/images/icons.gif create mode 100644 admin/dialogs/image/images/icons.png create mode 100644 admin/dialogs/image/images/image.png create mode 100644 admin/dialogs/image/images/progress.png create mode 100644 admin/dialogs/image/images/success.gif create mode 100644 admin/dialogs/image/images/success.png create mode 100644 admin/dialogs/insertframe/insertframe.html create mode 100644 admin/dialogs/internal.js create mode 100644 admin/dialogs/link/link.html create mode 100644 admin/dialogs/map/map.html create mode 100644 admin/dialogs/map/show.html create mode 100644 admin/dialogs/music/music.css create mode 100644 admin/dialogs/music/music.html create mode 100644 admin/dialogs/music/music.js create mode 100644 admin/dialogs/preview/preview.html create mode 100644 admin/dialogs/scrawl/images/addimg.png create mode 100644 admin/dialogs/scrawl/images/brush.png create mode 100644 admin/dialogs/scrawl/images/delimg.png create mode 100644 admin/dialogs/scrawl/images/delimgH.png create mode 100644 admin/dialogs/scrawl/images/empty.png create mode 100644 admin/dialogs/scrawl/images/emptyH.png create mode 100644 admin/dialogs/scrawl/images/eraser.png create mode 100644 admin/dialogs/scrawl/images/redo.png create mode 100644 admin/dialogs/scrawl/images/redoH.png create mode 100644 admin/dialogs/scrawl/images/scale.png create mode 100644 admin/dialogs/scrawl/images/scaleH.png create mode 100644 admin/dialogs/scrawl/images/size.png create mode 100644 admin/dialogs/scrawl/images/undo.png create mode 100644 admin/dialogs/scrawl/images/undoH.png create mode 100644 admin/dialogs/scrawl/scrawl.css create mode 100644 admin/dialogs/scrawl/scrawl.html create mode 100644 admin/dialogs/scrawl/scrawl.js create mode 100644 admin/dialogs/searchreplace/searchreplace.html create mode 100644 admin/dialogs/searchreplace/searchreplace.js create mode 100644 admin/dialogs/snapscreen/snapscreen.html create mode 100644 admin/dialogs/spechars/spechars.html create mode 100644 admin/dialogs/spechars/spechars.js create mode 100644 admin/dialogs/table/dragicon.png create mode 100644 admin/dialogs/table/edittable.css create mode 100644 admin/dialogs/table/edittable.html create mode 100644 admin/dialogs/table/edittable.js create mode 100644 admin/dialogs/table/edittd.html create mode 100644 admin/dialogs/table/edittip.html create mode 100644 admin/dialogs/template/config.js create mode 100644 admin/dialogs/template/images/bg.gif create mode 100644 admin/dialogs/template/images/pre0.png create mode 100644 admin/dialogs/template/images/pre1.png create mode 100644 admin/dialogs/template/images/pre2.png create mode 100644 admin/dialogs/template/images/pre3.png create mode 100644 admin/dialogs/template/images/pre4.png create mode 100644 admin/dialogs/template/template.css create mode 100644 admin/dialogs/template/template.html create mode 100644 admin/dialogs/template/template.js create mode 100644 admin/dialogs/video/images/bg.png create mode 100644 admin/dialogs/video/images/center_focus.jpg create mode 100644 admin/dialogs/video/images/file-icons.gif create mode 100644 admin/dialogs/video/images/file-icons.png create mode 100644 admin/dialogs/video/images/icons.gif create mode 100644 admin/dialogs/video/images/icons.png create mode 100644 admin/dialogs/video/images/image.png create mode 100644 admin/dialogs/video/images/left_focus.jpg create mode 100644 admin/dialogs/video/images/none_focus.jpg create mode 100644 admin/dialogs/video/images/progress.png create mode 100644 admin/dialogs/video/images/right_focus.jpg create mode 100644 admin/dialogs/video/images/success.gif create mode 100644 admin/dialogs/video/images/success.png create mode 100644 admin/dialogs/video/video.css create mode 100644 admin/dialogs/video/video.html create mode 100644 admin/dialogs/video/video.js create mode 100644 admin/dialogs/webapp/webapp.html create mode 100644 admin/dialogs/wordimage/fClipboard_ueditor.swf create mode 100644 admin/dialogs/wordimage/imageUploader.swf create mode 100644 admin/dialogs/wordimage/tangram.js create mode 100644 admin/dialogs/wordimage/wordimage.html create mode 100644 admin/dialogs/wordimage/wordimage.js create mode 100644 admin/html/czkm.html create mode 100644 admin/html/ddgl.html create mode 100644 admin/html/dlgl.html create mode 100644 admin/html/dljb.html create mode 100644 admin/html/fksz.html create mode 100644 admin/html/ktsq.html create mode 100644 admin/html/sqgl.html create mode 100644 admin/html/tckm.html create mode 100644 admin/html/tclb.html create mode 100644 admin/html/tjtc.html create mode 100644 admin/html/tjyy.html create mode 100644 admin/html/userset.html create mode 100644 admin/html/welcome.html create mode 100644 admin/html/xjsz.html create mode 100644 admin/html/xqbj.html create mode 100644 admin/html/xtsz.html create mode 100644 admin/html/yhxt.html create mode 100644 admin/html/yxrz.html create mode 100644 admin/html/yygl.html create mode 100644 admin/index.php create mode 100644 admin/lang/en/en.js create mode 100644 admin/lang/en/images/addimage.png create mode 100644 admin/lang/en/images/alldeletebtnhoverskin.png create mode 100644 admin/lang/en/images/alldeletebtnupskin.png create mode 100644 admin/lang/en/images/background.png create mode 100644 admin/lang/en/images/button.png create mode 100644 admin/lang/en/images/copy.png create mode 100644 admin/lang/en/images/deletedisable.png create mode 100644 admin/lang/en/images/deleteenable.png create mode 100644 admin/lang/en/images/listbackground.png create mode 100644 admin/lang/en/images/localimage.png create mode 100644 admin/lang/en/images/music.png create mode 100644 admin/lang/en/images/rotateleftdisable.png create mode 100644 admin/lang/en/images/rotateleftenable.png create mode 100644 admin/lang/en/images/rotaterightdisable.png create mode 100644 admin/lang/en/images/rotaterightenable.png create mode 100644 admin/lang/en/images/upload.png create mode 100644 admin/lang/zh-cn/images/copy.png create mode 100644 admin/lang/zh-cn/images/localimage.png create mode 100644 admin/lang/zh-cn/images/music.png create mode 100644 admin/lang/zh-cn/images/upload.png create mode 100644 admin/lang/zh-cn/zh-cn.js create mode 100644 admin/login.html create mode 100644 admin/php/Uploader.class.php create mode 100644 admin/php/action_crawler.php create mode 100644 admin/php/action_list.php create mode 100644 admin/php/action_upload.php create mode 100644 admin/php/config.json create mode 100644 admin/php/controller.php create mode 100644 admin/themes/default/css/ueditor.css create mode 100644 admin/themes/default/css/ueditor.min.css create mode 100644 admin/themes/default/dialogbase.css create mode 100644 admin/themes/default/images/anchor.gif create mode 100644 admin/themes/default/images/arrow.png create mode 100644 admin/themes/default/images/arrow_down.png create mode 100644 admin/themes/default/images/arrow_up.png create mode 100644 admin/themes/default/images/button-bg.gif create mode 100644 admin/themes/default/images/cancelbutton.gif create mode 100644 admin/themes/default/images/charts.png create mode 100644 admin/themes/default/images/cursor_h.gif create mode 100644 admin/themes/default/images/cursor_h.png create mode 100644 admin/themes/default/images/cursor_v.gif create mode 100644 admin/themes/default/images/cursor_v.png create mode 100644 admin/themes/default/images/dialog-title-bg.png create mode 100644 admin/themes/default/images/filescan.png create mode 100644 admin/themes/default/images/highlighted.gif create mode 100644 admin/themes/default/images/icons-all.gif create mode 100644 admin/themes/default/images/icons.gif create mode 100644 admin/themes/default/images/icons.png create mode 100644 admin/themes/default/images/loaderror.png create mode 100644 admin/themes/default/images/loading.gif create mode 100644 admin/themes/default/images/lock.gif create mode 100644 admin/themes/default/images/neweditor-tab-bg.png create mode 100644 admin/themes/default/images/pagebreak.gif create mode 100644 admin/themes/default/images/scale.png create mode 100644 admin/themes/default/images/sortable.png create mode 100644 admin/themes/default/images/spacer.gif create mode 100644 admin/themes/default/images/sparator_v.png create mode 100644 admin/themes/default/images/table-cell-align.png create mode 100644 admin/themes/default/images/tangram-colorpicker.png create mode 100644 admin/themes/default/images/toolbar_bg.png create mode 100644 admin/themes/default/images/unhighlighted.gif create mode 100644 admin/themes/default/images/upload.png create mode 100644 admin/themes/default/images/videologo.gif create mode 100644 admin/themes/default/images/word.gif create mode 100644 admin/themes/default/images/wordpaste.png create mode 100644 admin/themes/iframe.css create mode 100644 admin/third-party/SyntaxHighlighter/shCore.js create mode 100644 admin/third-party/SyntaxHighlighter/shCoreDefault.css create mode 100644 admin/third-party/codemirror/codemirror.css create mode 100644 admin/third-party/codemirror/codemirror.js create mode 100644 admin/third-party/highcharts/adapters/mootools-adapter.js create mode 100644 admin/third-party/highcharts/adapters/mootools-adapter.src.js create mode 100644 admin/third-party/highcharts/adapters/prototype-adapter.js create mode 100644 admin/third-party/highcharts/adapters/prototype-adapter.src.js create mode 100644 admin/third-party/highcharts/adapters/standalone-framework.js create mode 100644 admin/third-party/highcharts/adapters/standalone-framework.src.js create mode 100644 admin/third-party/highcharts/highcharts-more.js create mode 100644 admin/third-party/highcharts/highcharts-more.src.js create mode 100644 admin/third-party/highcharts/highcharts.js create mode 100644 admin/third-party/highcharts/highcharts.src.js create mode 100644 admin/third-party/highcharts/modules/annotations.js create mode 100644 admin/third-party/highcharts/modules/annotations.src.js create mode 100644 admin/third-party/highcharts/modules/canvas-tools.js create mode 100644 admin/third-party/highcharts/modules/canvas-tools.src.js create mode 100644 admin/third-party/highcharts/modules/data.js create mode 100644 admin/third-party/highcharts/modules/data.src.js create mode 100644 admin/third-party/highcharts/modules/drilldown.js create mode 100644 admin/third-party/highcharts/modules/drilldown.src.js create mode 100644 admin/third-party/highcharts/modules/exporting.js create mode 100644 admin/third-party/highcharts/modules/exporting.src.js create mode 100644 admin/third-party/highcharts/modules/funnel.js create mode 100644 admin/third-party/highcharts/modules/funnel.src.js create mode 100644 admin/third-party/highcharts/modules/heatmap.js create mode 100644 admin/third-party/highcharts/modules/heatmap.src.js create mode 100644 admin/third-party/highcharts/modules/map.js create mode 100644 admin/third-party/highcharts/modules/map.src.js create mode 100644 admin/third-party/highcharts/modules/no-data-to-display.js create mode 100644 admin/third-party/highcharts/modules/no-data-to-display.src.js create mode 100644 admin/third-party/highcharts/themes/dark-blue.js create mode 100644 admin/third-party/highcharts/themes/dark-green.js create mode 100644 admin/third-party/highcharts/themes/gray.js create mode 100644 admin/third-party/highcharts/themes/grid.js create mode 100644 admin/third-party/highcharts/themes/skies.js create mode 100644 admin/third-party/jquery-1.10.2.js create mode 100644 admin/third-party/jquery-1.10.2.min.js create mode 100644 admin/third-party/jquery-1.10.2.min.map create mode 100644 admin/third-party/snapscreen/UEditorSnapscreen.exe create mode 100644 admin/third-party/video-js/font/vjs.eot create mode 100644 admin/third-party/video-js/font/vjs.svg create mode 100644 admin/third-party/video-js/font/vjs.ttf create mode 100644 admin/third-party/video-js/font/vjs.woff create mode 100644 admin/third-party/video-js/video-js.css create mode 100644 admin/third-party/video-js/video-js.min.css create mode 100644 admin/third-party/video-js/video-js.swf create mode 100644 admin/third-party/video-js/video.dev.js create mode 100644 admin/third-party/video-js/video.js create mode 100644 admin/third-party/webuploader/Uploader.swf create mode 100644 admin/third-party/webuploader/webuploader.css create mode 100644 admin/third-party/webuploader/webuploader.custom.js create mode 100644 admin/third-party/webuploader/webuploader.custom.min.js create mode 100644 admin/third-party/webuploader/webuploader.flashonly.js create mode 100644 admin/third-party/webuploader/webuploader.flashonly.min.js create mode 100644 admin/third-party/webuploader/webuploader.html5only.js create mode 100644 admin/third-party/webuploader/webuploader.html5only.min.js create mode 100644 admin/third-party/webuploader/webuploader.js create mode 100644 admin/third-party/webuploader/webuploader.min.js create mode 100644 admin/third-party/webuploader/webuploader.withoutimage.js create mode 100644 admin/third-party/webuploader/webuploader.withoutimage.min.js create mode 100644 admin/third-party/xss.min.js create mode 100644 admin/third-party/zeroclipboard/ZeroClipboard.js create mode 100644 admin/third-party/zeroclipboard/ZeroClipboard.min.js create mode 100644 admin/third-party/zeroclipboard/ZeroClipboard.swf create mode 100644 admin/ueditor.all.js create mode 100644 admin/ueditor.all.min.js create mode 100644 admin/ueditor.config.js create mode 100644 admin/ueditor.parse.js create mode 100644 admin/ueditor.parse.min.js create mode 100644 admin/welcome.html create mode 100644 agent/agent.html create mode 100644 agent/ajax.php create mode 100644 agent/html/buy.page.inc.php create mode 100644 agent/html/czkm.html create mode 100644 agent/html/ddjl.html create mode 100644 agent/html/jbts.html create mode 100644 agent/html/ktsq.html create mode 100644 agent/html/ktxj.html create mode 100644 agent/html/sqgl.html create mode 100644 agent/html/tckm.html create mode 100644 agent/html/userset.html create mode 100644 agent/html/welcome.html create mode 100644 agent/html/xjgl.html create mode 100644 agent/html/zxcz.html create mode 100644 agent/index.php create mode 100644 agent/login.html create mode 100644 ajax.php create mode 100644 api.php create mode 100644 api/Communication.php create mode 100644 api/monitor.php create mode 100644 auth.php create mode 100644 change.php create mode 100644 function/Encryption.class.php create mode 100644 function/GetVerification.php create mode 100644 function/MailTipsTemplate.php create mode 100644 function/Tips.php create mode 100644 function/VerificationCode.class.php create mode 100644 function/api.class.php create mode 100644 function/code.php create mode 100644 function/color.inc.html create mode 100644 function/communication.php create mode 100644 function/db.class.php create mode 100644 function/function_app.php create mode 100644 function/function_auth.php create mode 100644 function/function_core.php create mode 100644 function/function_page.php create mode 100644 function/setname.inc.php create mode 100644 function/trade.inc.php create mode 100644 function/ver.inc.php create mode 100644 img/backdrop/micro_carbon.png create mode 100644 img/backdrop/tactile_noise.png create mode 100644 index.php create mode 100644 mdl/LICENSE create mode 100644 mdl/bower.json create mode 100644 mdl/dog.png create mode 100644 mdl/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2 create mode 100644 mdl/jquery.min.js create mode 100644 mdl/material.css create mode 100644 mdl/material.js create mode 100644 mdl/material.light_blue-purple.min.css create mode 100644 mdl/material.min.css create mode 100644 mdl/material.min.css.map create mode 100644 mdl/material.min.js create mode 100644 mdl/material.min.js.map create mode 100644 mdl/package.json create mode 100644 mdl/timg.jpg create mode 100644 openagent.php create mode 100644 pay/epay/epay.config.php create mode 100644 pay/epay/lib/epay_core.function.php create mode 100644 pay/epay/lib/epay_md5.function.php create mode 100644 pay/epay/lib/epay_notify.class.php create mode 100644 pay/epay/lib/epay_submit.class.php create mode 100644 pay/epay/notify_url.php create mode 100644 pay/epay/return_url.php create mode 100644 payment.php create mode 100644 payresult.php create mode 100644 query.php create mode 100644 static/canvas-particle.js create mode 100644 static/frame/echarts/echarts.min.js create mode 100644 static/frame/layui/css/layui.css create mode 100644 static/frame/layui/css/layui.mobile.css create mode 100644 static/frame/layui/css/modules/code.css create mode 100644 static/frame/layui/css/modules/laydate/default/laydate.css create mode 100644 static/frame/layui/css/modules/layer/default/icon-ext.png create mode 100644 static/frame/layui/css/modules/layer/default/icon.png create mode 100644 static/frame/layui/css/modules/layer/default/layer.css create mode 100644 static/frame/layui/css/modules/layer/default/loading-0.gif create mode 100644 static/frame/layui/css/modules/layer/default/loading-1.gif create mode 100644 static/frame/layui/css/modules/layer/default/loading-2.gif create mode 100644 static/frame/layui/font/iconfont.eot create mode 100644 static/frame/layui/font/iconfont.svg create mode 100644 static/frame/layui/font/iconfont.ttf create mode 100644 static/frame/layui/font/iconfont.woff create mode 100644 static/frame/layui/lay/modules/carousel.js create mode 100644 static/frame/layui/lay/modules/code.js create mode 100644 static/frame/layui/lay/modules/colorpicker.js create mode 100644 static/frame/layui/lay/modules/element.js create mode 100644 static/frame/layui/lay/modules/flow.js create mode 100644 static/frame/layui/lay/modules/form.js create mode 100644 static/frame/layui/lay/modules/jquery.js create mode 100644 static/frame/layui/lay/modules/laydate.js create mode 100644 static/frame/layui/lay/modules/layedit.js create mode 100644 static/frame/layui/lay/modules/layer.js create mode 100644 static/frame/layui/lay/modules/laypage.js create mode 100644 static/frame/layui/lay/modules/laytpl.js create mode 100644 static/frame/layui/lay/modules/mobile.js create mode 100644 static/frame/layui/lay/modules/rate.js create mode 100644 static/frame/layui/lay/modules/slider.js create mode 100644 static/frame/layui/lay/modules/table.js create mode 100644 static/frame/layui/lay/modules/tree.js create mode 100644 static/frame/layui/lay/modules/upload.js create mode 100644 static/frame/layui/lay/modules/util.js create mode 100644 static/frame/layui/layui.all.js create mode 100644 static/frame/layui/layui.js create mode 100644 static/frame/static/css/style.css create mode 100644 static/frame/static/image/bg.png create mode 100644 static/frame/static/image/code.png create mode 100644 static/frame/static/js/vip_comm.js create mode 100644 static/frame/static/js/vip_nav.js create mode 100644 static/frame/static/js/vip_tab.js create mode 100644 static/frame/static/js/vip_table.js create mode 100644 static/jquery-3.3.1.js create mode 100644 static/jquery-3.3.1.min.map create mode 100644 static/js/index.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..176bb4e --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +/function/config.inc.php +/img/apps/* +/admin/dialogs/upload/* +/.idea/ +*.bak +/SDK/*.bak +/function/function_core_source.php \ No newline at end of file diff --git a/CHANGELOG b/CHANGELOG new file mode 100644 index 0000000..9ccef60 --- /dev/null +++ b/CHANGELOG @@ -0,0 +1,22 @@ +2019.07.29 1036 + 1.通信更新 + 2.修复后台删除对象后与之关联的数据沉余问题 + 3.易语言SDK更新(新增注销在线、修复BUG) + 4.新增云端监控功能,自动删除沉余数据和处理订单 + 5.优化添加应用提示页 + 6.此版本数据库结构有更新 + +2019.07.22 1750 + 1.新增通信功能:获取自定义数据 + 2.新增通信功能:获取应用信息 + 3.新增通信功能:获取用户信息 + 4.易语言SDK更新 + +2019.07.20 2119 + 1.修复订单操作异常 + 2.修复卡密导出问题 + 3.修复各个列表无数据时候的显示BUG + 4.优化部分操作的提示内容 + 5.新增开通授权时候 账号密码 登录验证账号是否存在 + 6.修复卡密授权无法续费授权的问题 + 7.修复其他已知BUG diff --git a/README.md b/README.md new file mode 100644 index 0000000..6af1016 --- /dev/null +++ b/README.md @@ -0,0 +1,23 @@ +

温泉PHP网络授权系统Beta


+

数据库更新时间:2019-7-29 10:35


+

注意事项:


+1.此仓库中的文件为温泉PHP授权系统最新版文件
+2.在您每次升级更新之前,请备份好您的数据以便回滚
+3.此页面地址属于内部地址,请勿公开分享、发表
+4.此授权程序除核心文件外均为源码,未经许可谢绝转载二开
+5.若您有闲心和能力,欢迎注册账号加入此仓库的维护
+6.文件更新后请注意数据库同步更新,否则会出错!
+7.最终解释权归温泉所有,测试过程中遇到问题请及时提交issue,感谢您的支持! +


+

数据库同步说明


+

数据库信息:

+服务器:gitlab.acequan.com
+端口号:3306
+数据库:QuanAuth
+用户名:QuanAuth (注意大小写)
+密码:shouquan.acequan.com
+*该用户为只读权限,请不要尝试修改数据库! +

同步方式:

+ +采用Navicat软件进行同步,请参考看云文档:http://doc.shouquan.wenquan6.cn/740819,教程中使用到的链接信息请使用上方的数据库信息. +注意!!!!后面的语句无需执行!后面的语句无需执行!后面的语句无需执行!无需执行SQL语句!!! diff --git a/SDK/EasyLanguageSdk2.0.ec b/SDK/EasyLanguageSdk2.0.ec new file mode 100644 index 0000000000000000000000000000000000000000..cd24073529a45b2eedf3b46245cd397b561898a4 GIT binary patch literal 112320 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˾z4c)$rm<& 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�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 Q$B{7ye)l}6;Q!6>KWW`PumAu6 literal 0 HcmV?d00001 diff --git a/SDK/SDK2.0.e b/SDK/SDK2.0.e new file mode 100644 index 0000000000000000000000000000000000000000..aa2a84f4d103e9ab0b16428936ca6e6e69fc034a GIT binary patch literal 112775 zcmeFa31C#!y+3{v&?+r`wzXDi(@w0Kpb!!W$$+(lRZtLQaRY=QnZQ7piJ1wDOW$;R zeeHYgd)*hi7}KYSs00$W5C{+m1PqZSD7CFv>r&jcYPIVB^EvmP@4YkkOblxKTmHYR zALizJ_RsmA@A;l{x3O1UJ9GTB>6f1u|HP-~cV_iFFK%UTZ92HRe)ogTyF0V_XBsRk z%d(H>`ea#Oa?X46bDDL!O3U(Lq(!XC>!=__*j_lvB>*+(Q8M^k#hHXVd3yKaM*>|vh zP1A$?oAS;-Y+Q9@e^*!Iex~i~WGyu?oM^HQK}HdYS~q1#46O8RJ#ggYZ#%l~+uhlh zf2P5*H1Fr_8B$zcXv{97kR;DQnvZ8^og3(zbuJ_J8)R9h17}%_<3lZLz?+v?*0NAd z;EEYjue!809jQy6i);a z%VU9x$ihe>USQ|Ogf-zrZA~-~4SXq3R2Uc)$SceXT!KGG2BIjHF;oqC!iFSPR)=Gi zfpMWkxS+ZwmWWYMkcg=!W^qr5@zf@95qSR4o~$NmrYQ=x+NT?T+TZn`IhAQxHNnzn&^;3+0OA9OK z)E1R4z&ZXMKBsnQVPQFf@q>V&g+qhtkD=<15+)p4Sb{$)!(2uBkh!P0OdM6*Q- zVQ&(u>M#c7i$XP_@@@gwYkixio;BfWrT%uPn5>&>V;Jr<($R&E z=>jp6Dq(?a+Z|mPz)(wsBGGst8dK*ru_~9b_#lc^HYvhTv;qPB`ysalq4Fj1s!)7U zN(2-T4J;1_%0tmWJX9I3S{Xp3>OefUG;HS=4}@xBwa6!ufVoFTQ<0`-c?7cx(k-pU zgb=EV$6#Npt3u^rRpnS^WjI=a#(2sKERQ4>sWJjeVZ$o3c=)E;aI`$ksl=sBG`av4 zPE3LVac~uShM_Y|-H0$>31JY^4?5`*HSNK=I91D+*n>Q?MJQ$dqavx%jPj_bvqN(| zr7~0-2zvr64_wB{%I-Q(r!yvxQGs%|S+*!(YfmjJn4d>$!Lv{S)qiZPB0M^gUpNp` zp=}!Ti%JF#EQnV{%ES4CiwAltbDNq^Y-RMcmXpl+oatGbnsd{X4Rz%dIVi9wR#g$M zarJFlO{}68Js5I$3sly`mO8O!BgNd5J|atzLApt5B+rDlR>fk~(9c?U4>cb5fbo|2 zV=oQUqz90BTHIwBKy|1l5eZeLMOXPEzRiki zFGy5M>I_6X#-b2L1e_w}sX#>*#VQ72_*7M4fY4WpE#NRk6i4fp!uUa@;Af=JM<>Y6 z@S=+XjyL2~feIB{us95dEpX9Ae)aLj)-IFMLTyiMmx)c)hm*5Y54-ZpPx9)M+gc3l z<>4Ayg{rD>g*|emK{YaX263=Q?Z)Fwx3~s0DBezi3a3rr%pOqh-4sMEVEyv#4jV)z z8e}&xWt2Frx^@x#*F~Y~>M%`ccts*m5yp8%JOFQ*l~)wy!QG`J>NQ4j7_Ra~;5EvgV zhmn9)j}Ep)aIiRtpp|GCe65tqd+H#buhW820ms5Pe`8K#a(9uyw08X#*d7%tm|k%t z(A7>ECJ~MjCtV;`qiTk65{oVi*I;p>hKe>c1%azD{~;TC1GZgdO#&6MFsHjj04oG# znd}M{1ZZef%}`1tT3%IK0WHO>6vkh6E=n7hB3I5pm|xJv=zn^30r=%{u(<+BILlRp zXnWj-c^FIKC(RhJo&n^hN9rIo8%7o`N(9hZ72!}7r$064VQRI9GkL%tp_-b|N}Q{j z`g+V}+!_Cx+HtjLL5!BUI$R#9jFgAeDsMp*CT7@A*qiZVr;MIaUK6QKU{rcI^j1+7 zh^cychzcF6O#~`YBgG6$_0d2ZmFw4ctpbj2i`Hm4f7Qf;?wk@@f(b>pnM+AbI%>Q* zRv05BUR#A8fdhz{38Y0TSCTr_R}OEg4!-KavIj1?42`FM=`mz1U*~>VU^XXk)$&Og z+Kcegslq&Fd$VcZNoj#wp6p7I*w+q&ef|`G@VMSDo!=g6cjjv z4vh?iF%?w|UWgAqssV);6&BLAwF^}1t*?*>y z!+6XuKZ1CLmj)tOv^x=T4ob09y(M)-FbNNb*V&P|NQ(Z-hYO%e8W_0sR@Z>ok==i_ zI$ROs)QF*t-ezAojprrm(lVEpH=7yix;t4xvs5BOU$SVps~8A|KxdRLOAFFH;uvkmS%E2Wb#+jH zTSvC3j-#i_X+YufE1ym63&GOqF&hb2_CU1*;q+Wu<=H9k zQ-N70$37x^rN#<1Ys`a3{Hohp| zb|jWi7xLNdP+QE~Tv3cv3bM@W`{+99U-Y>?_5K>fX`7aBo>nyVpaC_g|)T-$w-P{IfYSUKfnntaldfb|gEHw3& z+YAOagK=eav7UZwC_x6pYAz-3mW)RAHoaWdx|Y$P8jPtkRPbXv8TQ1crfJ7B5I1&Z zm`f0DrHk2I$z2Augj^Uw0E}%c>N;W`W5o;$w6R?oFl>?Q%BRKjZhAUH14fKnHJog# z@vFv(s{Bltcef0?X4s!w0yjKl4^K4@)1j@V0~)HLL3Hw>%6LLlhAMwrun;n1fsAC6 z$Sf60)Jof>*LlIWkJ5_{$x2gY<~XWRU8Y?l_y#F%wRR)v?7`(<9)Y*vnZ0P0V29wJ zjfR(A8G`Sr^Q&?CLKlx!$Fc}k7Pf2Vcr0lxVqBG*UZSuycFCAYm&ULp!8MZzw$*CF zp$hJF`i!93NJ*O|Yz53q*Gt>gh2>Hqs@zG=CLuf0C0b46&cbj|V5#GTJIU=H)*Fhp zuN_LL+?Ix-*Z^c+exJ&tj5Y~s&%s%`8f|U*6s?lc-R#lDbZUt>d4Y5SsN-oPExkkN zz&J|G>B&|AC=+}c=qI&;t3)mtoLIgNab`Pndu{UkJ1nf3bdTN8)Ojqm+FYu#qFUuu zRn=x{ir#xw+tymo+{-z4Ifq=hrY6SCw$uWVwe7H|@tLMzY@9AT)jw0Q)9j0J8;ULV zxKf^Uj&p|d55<$ls!x*u(0sYPGu^wQ@qzSV#o4MA+&FU(EeqZt~`6k zoH@LekXb|7!?dYECl~XcGB2ohV{Qm73)veQPQO59NxjNYjUDh8sqoAp=>vdQ_O>iGbrDeHmli<)pbuCSu*u;?m^s}0m5^lxoBdK%NHy#=b~ zprx@2*|Ul3*=1>{!ao;qbg z&A2RTYWm*D`}e__CH-*K6ROH|+tVx+BY6+iTxFj)P_YFXuE^LnZ#tF#>?Pc{NM8$k zqw(Bb?xcsL|6PG)F;+i1@As%W%u#v<`tJ-u2C+fpc%{yu?9Hw?i$zBK51!C8SPyEi z-X6zVtdjOHp1^H9@q)l4dl6R|slmlQB~-he&ioO8C&^15Dyv!1h}xc(Yq@cI57fTo z2S-d_?(>ds?9f(J!N*kIhnrGmi0$224Mts}3cLGZTtejK;Ru!*5Ws;0{k8)WUaI`S z1l%lkG1BkSC|h!w-UsJj>DpJmBI6}Ua!6%F6m{`YB{!;~Qw)FPT4ec( zo-aZ&cOFjP;&L-D7-m+W4{{~ZE(scu-g>1XP!LA};_7}6uLjiGnxPsPS_mb8g4Bc; z)>grWg;!K#nvC-jzU>g>(%=%+r!+aTmsuT3U}X@6nq3QzpZ>Di&UKo+K|ED=RPhI!3H-S&57v=> z2{MP55RW;RM9Hxl6cj>>)GQkYJ3hyd7G%hcv**kmH1d|)=EUb-e8CX&Aa{+7*pMM} z=H!nWIs5!MbLI?LP#LXB%)PaCcH!U=p~01-2Tz!LOYv<3aidTmuPo1Sdz&8gZf@t# zzL8l)=hV!-`21Vp$%JpM#H}6STX|LD*1@CZR9u4M<`m4SxOm_w791WwclIT72G3>4 zz)`9wTmUgwpT)UFA@z;7j=XiyKxP=fc+TvBm#E}<1MOWq)q{@J!G)k2T&m+-M7427 zJFcE!_d%RF^fGj#8WV%)gFWCvDl3mODK475=b(C0jYae)d#hIYH&h!eBUj>{8{AM? z9tbU65Ls9oNvu@aLF?QcM{<>E?^sYBan-XbR=$Ml!QBu$Hy8vA_bO%M^i>R{AUZqv z&Kxo*HCz?JPQJaT3WKQ2^(hVsT?}W2Jmlx)b8|~+94-b@AlNOFt3j!w5hfHy)s|#LrRz^}SYPfIX zjOmGNh>WS|xSXG`Wi&f9U?>5}N2|v;rj@z5hvJRZ+*oIqy z^YKUjei#2U4-}_4dXL|_=j&duaqP}Rk9X`m_`EAQlLymZjQq|lDrnfoJGVPJ4(~dA z+;CfX;F_YL^=tM#ariOb?!E1A>zWz0eogzyhDUcj-u&$0T}@lNcQ&>0_VGi{uCK4F z_vAjbpkwplUETM$uWdiM_1SgLsFK<@zSQ{Sk>i{G-nEn2Y^&R`omnyFwtc*>e8#vd z8L@uN#+Qz~+k|$2&A)9wxvul*(HY};-m$Iq?F~nm zZ_689U6gEW?cUtbyk}2~sJ!;p4h4tV8{lFU}Z0Z`$;!GslmeId8_y z(bH$nn>Bgn^wAyd-J6)<_SGF*>(_WAjlXJ~4s1Em@djETeLK9M{p99{kuUD>Uw@$M zmkLvSBW%}TY4T~Lm@4C4jWi>mAIsjH`=niPJ_ z%7X3t*52RL_VCuOy1lFSu0He3x|goLI#^g(S~RR^1pl%dH@viXXmMf5h+(d3{xip| zdgOqQF|^&EeLJ36=+k=O@X6hseRyhsW$`fz9&Piw;^!uN|G>m|hi6%%UifIAk0I^% z@jSz6_$5vU?581kHUr4UqY@+VyQC&s742V9IHGdsu;RjCQE+%sQN^$kC6y(iP-U>V zxV$txZ0PX*!~2)^=kVXMzpJhL?)BZ<9}gliR|Wk?4=)-zyf`?%v}DBa;xQ%TM+_Z1 zw5V|S@Zm+JB}K!>6!st1zo`F#hdUnMd{^6}c3Ku(QC-x(c+8mM!op#}lER|l#UqMJ z$BZo<7aTgQaLk0_38RMxNB1Avzp#JD+uMG>?vZ1!+er^KBW=nNP=95e8Oq9<6wb;z zb9Qmoq_TUKWIwiQN%piKF3EoJ2TS;5hdS7L4uq`_@Xs@VEGw&THo(92@h*;k!5@w> z)X&EhLDcm6;awdKTVAGNSQ=lrvgLBj>eY59e1yN zG#`l;WM%a&2hPdP>U-wtS$(erV!)HdS$*FCE*+lL_ZEQtoCBP8de*1$V|@ZZ#gh1G zJ3enFJ$RftM?d^-zW4Ahw>dw9q!Pva7+L=eMP1e>tM8YAKLU>dCxFL+KLJr722=w# z0Y3wN4*UYR9rz{iE8y3_Z-6_1I^a&=x4=vwoa^nL`tt&h!H9FM6cRp8GX5p5nY9|!>pfO4P$2m_VCLSPXP0Tu&GfGS`q z5CvjDHE^E+!0V{Khm|~$iY`E z>pCRY`l9=kgtK40gnv+SO&w+;+^b9MbW;cXGg#G~oUYGjVdNEle@S-WfhE~x_b+yRhMrs{KC=j><*p9f{5Vr+!w<1n6;%q^j&4>d8HX(c? z!Z#qi3E_6>FT&dqz6asE5#EOI zT?pTaa3HV);jQ@nBYyvYc)v%yM-lILh<6?&&3nbgLtK34Lh_?@@s)eR3EJIv92KK^V! zdE|J*Hv8}Hu8q69cO5#$nRxwQJGM4IK#zloy~pRAKdA1LfO~*H0<&Oc7CAEt4Iq!5 z0Eeiyt#t@rOsn|Ly9~ChF9Ju7yM=W(c6B}YmxhB|UZFu;_jreLdaRPH#f<%~lZxkQ zqA3t*e9=2IN!+yaw=K6C(((!r$wGyAY?^k&VE48E`pp z6)+2!3se9Y!B!2h5@6b|1K$CD0Q?+aULC+gz{9{}z*E5U0L%Cie#Zh=0@DG|pr}3* zC#He28{yug$jxG`aEK_K32aa z%`2+kvj1;~yS6;g@pgKG0Z3qbC-qx4-@AF8eV)I0U2)@G1Jfga;6|V@=1Gpx)pC^N za(4Dwfgndg=>XPlQ6f=2a>x+u4TY)}#o~z}@tfxHy1@|3wiL;kWdlYb-hwNK-*ClE zl@l%>HY-{ZPAr~2C3bD?_2aLu4wc4>ubDYw=*lq_RZA8ImyVlUwCLs)Qwx_}6`52s zcG|=l%SV@AXQ@1f6-SDuUtTlo$`OU7Q%7GjaZ>!c1y?MZF?0Fw(25Dcl8Pze>tk0> zj@~@x+8fHN$6Zx5cHvF6OO}pbyfQI#TIDjQLe`6;a)KPer8z+kZ2WL+bTJI%apG7Wj^0!oidq9W-ixq$7+z8u9AORMG^STzR_;vv4 zjV&8jHJ@l`K6Yfo1Du1?C^Y{01tm?Lozo^LZ*5LP^mzy0Y<|RC7lyR2?M+>%R;Gh? z$G`{|ag2^+Nh(_V$@W*c2y|rDBAoQ^n|0yGfzJZD0K@3WUj&o_o{8zeiI!$NIVTxr ziXTp@DRWc%J-gnr1zbNO#uaL5LPaeCKAW9&;WhxLDsN9#cHVlr#0pbQmp@`m9P@!+ z0QUh{oLkkv*MZ5%c^+^-umf0&`GIrDNnjKz`7PiVzX$4WJkW zegpUo@F?&C@MX;XR|6Y?KLPIm*MrHmz+luPn}z%vGR(@{}f;W@GYPV$VGWq1GMxk`)S}KsQLc@tw2B2LD#3j zsZ$o}F#s3_d<$T`_5sDH*A!qo>hf{aGh5y z9Z#%(Es)>v*v^ylW=)^W-#|X~Yfxb8Bg8=8yvbb5J}`$!X)YJ|UYljGwz*uir^ey3 zK1GrfpFYV17l1uC2 zJ$g0s7*ZM9yTxvAk5ph7HkcWcMuF`!!9TVh{5!dC4lJc$*lxXd!~ve`+DQDW-;~eb5aj506UQC`6*9?hF)3doSFD(tDKTPWS$abF4B| zhO}SSDC-=&E+)(N8m$+%qdLVI;^)rK5a47qKvm|PbIyJD-K?zXal?o*hzu>bD7~0m zZmM~^J;;d@KBLVG>u;$Hu6)+wb?L?E zAW+Ds@obqA+43zj4DML1xx-7LoJ||0QLJ_;8hngFz zX^-w6^5+m@Jq;R^Szoyu>20=FeA6iJX(BL?U9q&*~CR_(ZxS2OC@th7VI8=vgjyz`!246V@ zPjT1TYZ#A7{IEgxUes75zY|96x4=EXy}N?);da!;CJE8H-ExX%K9y_vi zOB=2$gZ5pAnm4`1t;5#F_BS?m+a0xQdt)c}-uTy+R~q-TBN`s=I@$2>k^5R3X?44s z8nMje<@fgO-Fq0f>Z4C~ zG_aW25YOFwV8g1;)#t~SoR2rjNtCVFzmzDQs~ex|e5Gsm!8@&iZl1F9*tj2={$c0u zI@axKY=36^Ya6yUpHMxX7Fq2s_9ik}?K$#)q8dEr16zR?fl{c#65uz$cHnU!8|rpG zFcJ6)unqVK7A_Nk6~KQ0$AEqy@_b-4@O5A}&=<47Xy7)W6F31Bfy+t2JfH^H2XLkL zNtB<>jJP7oX3U9@vIC9+XQC$4fNuaSCA~HmBjIm>4ZsZu|0VDTAP4!}0Q>}41)PRF z{~P&r0#5v0TVUCu%Itj`R9b^0$r*9lcoYuyyHHwD5Tt?36`rg2|@yPfn(jvVLpm$u{Uw&U&w z-hslqBwF^~yREz7i5=UikGuy&nY1T2?#5Vhj9PaW&01Z3hEh(Y{R{9)Ln0Uo5a3P6I8i7-E44{=@7#G_pN(W&pN4%wWdc<>i73;jp&EQ)?zC< z5w5MNQr@(o-Sj7VkwaBXts6|t(HqH_1G^QsL*fNwnJPf%CS!7{m$TL|wqJEZruM@y z>-CPQ-dCK?ORqiymMJ$(FP6GDoeeQ*l|d8okj8tIWXjyr&K}lOj+*#9ey+exYR;nd zNEwIo9%q~n;=daT_wJ3eBc@HAF_ZPd%xX~$Z-?go5}=HG;B1t04-4H>OL?Q9B?-BG zZ?Bz}d)z-qx?ebH&%)n&OB<)Npy?_vl$pfeGw}2duDjxl2X8gt`L)2efEIvTF;@W( z1EWy8{{nsw48nXr3upw|fxiMgXfb(EUWQ+t7uWUgl^?f=7Xne>o4|Q}kq8I6K&Na;>?-TI8n?n$ESu)#Zwm60G_Gd%n7n1N~x8ZQn6=egcH;Gt1w}lYJMcpSs>Dr7{I@;42P=+kFLVwuBV#Y z$C(=*6$lR|6?j*veXTYc8(dCl=Ip4NYQ*ORX&*|Ba|W$WX>KB2%`wTJHZu3>bg?~J z*e%oXXb&Do3y+Cati(X!WrW3_N*}YSL-n&r<_^`S7J4Oobe@lM+s=v4mizsvoS>?4 zR+iVKGUsF6EyuS$(A3g#|Bk=4ywSafxzDReltYn8MEi!(Gp6w5yFgi=tP4j2V}P;1 zH~?aGDe_|cUJ6VDIAEPUfFt*Hwypo|hP^(aeMb#z4zrcSPs@qTxFqRGN`ZUdjg#Nb zlMT<=LRebsJYbYl31)?gCh@~UafuFRJiZBR0-guBPP`k~4IGDe{0@+JHfjyr46Fst zfNh)r+zf06%5ZspKClx``lG-nVXMwWUfIm_3|0dNCxu6WbCAI(AOc*6#5Vy)kch{H zNVxdFJ-Wdv@2#_YK#^4P1v~2eP?>#FcCB+_1)LKJvMx=Rv|ghlpXHnceEB3}Wr0-n z3ZN3Ym+J51e-(HHup&^Ms0qvtFQ^_|JQv=s!7s^2Lhpf{QYuKP)7lqDLABXJ@8Q{t z_7cI7e&CH`tD9QXy?vSnYpHIKWjVQKJ}J|!pFdx>evwXozLpp=)NwpHr!mCZ9o)I= z$&PkvA6obMW+65+>BK(L%_(@8AG#esu^+)1pe%v@diCctDssmzC_~ck4`20 zxN$T;A`yN>BK(L%_z{WlBUN?vM|ZC9BK(L%_>pP|KOzx+L?Zl%MEDVj@FNo8MY!jDLVACU+@A`yP12+<#r2tOhb{Sk@ik4S_ckqAE`5q?A>{D{QTw1`A1 zFB1PrQrjO1YV}EkABiLUh(!2F>g2+YNQ57e2tOhbencYth(!1iiSQ#5;YTFGk4S_c zk(BAmi^PA@>Wd@%NMzwhB*Kp*7k)${{D?&O5sC0465&TA!jDLVACU+@A`yN>BK(M? zOt)PmNuNZ5BK(L% z_z{WlBNE|9B$lu35+o-{9Y;{D?&O z5sC0465&TAmapw)J_#bHZ5eSJ)85cJ`grRLJNDPzTX%2zHDg{2!i%FsE{$aQ>$ZIWmzegf4+#A4cmAZT5IF6BYWRI zwBZ;YYJKpHd|VbNh~pK!;ezrN>SB<0tBX5+dIPqp#ojEe+sGS0(zXnP*fMmsGTkl6 z8G55gZ9#hT_vJ@ zp(Pz^$*s($7(LZ+dc8m^;y$@b|TKtG6oWFVf`beO{M0*#cJ8VB7RXJnpXY z6%||e?Ell|x7Q!&X=_sUjmzfhqN2`;8ze==d_nUZNm8c@NY~8PLH<;_&(Ukn2JRWo zNoz!>(oU_VIVjV+*4DW?j_wL6)T+`!S}~**RS9o>7sBh1^QJTH-JG`yU_Yc$?#Gfge_^@2>-XeMA7Tnv3dXGIuV)*jICSafH`s#ygcDb^Ko9>W52)z>R>qM#GGF zgC36n@GSnuWf*HTuo(CekVFPQ2gV{1kDKtDVpp{RE~cF!!D3c3SZZa`*$X;ix~0}R zDwEEx(h+H>y~YjI@|bjXsE&CCVtQ>7Yp!jWjD_A@KaxS=M%JTM@|mwCfrZZKcuY%r zI1vv(hPK#&GCjCj!%l{l&bhT0IVZ>KL8^_0+X_9RQC6Ur*R8yLYQApug#hoZ^78$U zzGkIu-+X<|s`dJGFN3%DxzE9KX6E~{I15l2^eplI=6dF!)d{EXdHL=C#UW$=yAk!` zDBW>-ltN*zA zoFYH)MyPXoq}wK`sl{G%qBFwXNTuO6e{L6Fb2{_H4=Ugv-h&EetBY;dlau>wVrx@@m9JfdoLDop zWQ=nn4g&bp)+qg?OdNB$Jfxj>OW)TK&{Ms8TZpz#ZgQXRFMZ#tR}8M@ljNF1ORC{p zAM~&+cx*|AWr0%R)FDb$PMe=?k-jgB{xjFZe0XslULuaqs`6$y9Q0y2PU09C34k(s z09?yDUbp@Dk?n{(H%x8agICq4Cxz*V*Es3uh&yR`qdRMV+ z0gnrSB|seD?Vpzc-vw?59tIu*?0eL4M=CNf4Q;l-Ftl^SNb5Z?*jZsd!BI^|*n5;@ zj-3-EJ?8uNSoBCc9M1wX_mTc5baOQuy1-r(=4dv&$I`4>H(@D~a-ho%%SOdR%4&}` zTJ?NIBp$0-7>Y)2R;1{@Uxo@V2bek8r>1!NvB)PG>h^uDlP+W5b1pdou;0G~@L)rp z19I_qA%0otCBQYnt-z0gR^Um1w;i+VhXM0}g#Zt}1jM8UYz%JNw z4`U~&sQO8CES@kgaEy2lWJt zbqa8rntGcj=VGN);Mp#qy|M2I^(dmcvCbQd0y`E>oTK8q9^HA; z-u+0)kz(IHru(04eskBO>rnwu+3KBfxZyR$Lhd_23(3mp=T;x1fJ4h;L!F`Jkzi=0 z#TjNa#vHqdi>D#8E?nvG$2xhMZ`)uBoZS&N2`}t|fJYd(3qZZqi(BqM&m93ii>#*t z)xdqg3E*@*5ik~54*U|}n|59RCLrfu0T+VHuLH*cK5MxJco3jnM{;}nr4MsuNH()Q z4au{a=j{L=li&+v@=*SBz!Ny12!s%E5%3W3Frc4MSdOs&26(gVL%_4ZX-F3U)&cv0 zCxK5O&0t^x@HOCe;1%FplvxCP8`ueCp$&t8VZe0&pC$bc@BpwEI05h_IUhy)J_(cp z(|{X+D&S_|$3QF44m=Bd1}*(OFcz2t)B?8xe9O>Xz)Jv+H}PAAx~3c@xfiAU4ZD&{ zE9pIqri=Pe>M>pJ3}UolD!OUls{m*B8HEPado&D2(9VFb!A&zwc14VZ(ms@$X4)Ro z(4Js+PcO&t-m@vFZfHR{zM-^mQDpIws-@9b^-cJ~PwlehD^}h-dd%2y<0o7`anco6 zPM&hr)M-~wpD}aRHP>Eu{SET^wZgCDmVNPp3vayW;{1X0F1gjpVE$>{jIB^rH5+AG z!(O!_C&)ofAH_8D(4ZQNR{5L!nw+2_Jts)JYj$F2jZ00cpaML4WKhYo$`<1QmhiTBYTST3wLdxO0r1!WphK_rmnZQbqgZ z-`B&PFg27DqoJXGhb1SdO48Iy{^o2s*P62R8Ix1XmQ%JN+nk^spf(UZOh6yhsK^Pb zX1aCG%^XwJ+>L2&9$kvkTuhNE2a2O98EI=fTyhpZ(pE|Q#ZfXcs5%;dDK^cypF*Fg zihTHeaw^&WujrHBElNyJ4yoF@E+r;R_0DGHQjQC2my*lSpJHk2PXliPA49o5 zcZwM~?%My|K4+R23e#-Z5`ZhEUV8j3(ERTX)!Y%FCl7ZiiJ!x7wLHG-QTr`aHlI#F zsy9m0PtTOZ7l8O$;2z*_z#tS80r)=PKqvI8z~zWB7BODMIj{0v0CWI!LgynMolu%j zu2?4k^MIQH>dS>d8Ne5sd<(b(Xa?wvei`Yn1#SU;1Uw6T0(tQ@B3}dU1`Yvyvt(a1 z=gU9@_!@9Ka1^l6Jie*%U)W4w77zu#1?&Lmc=B~49|J}MRX`lL1^5Z@0I&gQ0}cVt z0sYa|F9EXvy(6*$=cZYT;}Gv6Kt;R<>@77Q!@DXtZjIiG%FJweInI0KC=K{$xqGxa z##X4Rnp;6D)vH$I1UY&#xqCEp#-dgJ=Avo%P_(y~a9(0^CshA96YW{>PO_@GKj%I4 z^WJBb=LBhS%?>5)uhB6VXlel-@s7jR+RGnxhEG=KNH_BOh}|z7y+)&(R7spDcvnP9l8Bwe37zbG^49hqb&^m#k+M}f4<9>Am8ee{+HR|pC{|e+4-Gafc+^ z`K6N4>HQz{!d*^Juo5&yPQ=Ey=|0=HmLYl)V*RSg?ME$sF{`7Yeofn&y$AUg%A-&6 zVjaJtwe=C6wLH$q_`*zE+wr}>w;GWzk6fSv_&V?t;2r>%>(q6YU!ymFV<1reb1M*Ga=fGZo+L+Bse+}rv(wS2>tMDR_&GILqylhtBk33D!Lfs4`TDDYPxh6djceAKD@c}RC15J0?Zk&a6M zu633H&A<`h1%Ma21~CrsHGnT@UkmI5_-4N^B5(bblpo-{0eBSn2+Fz)xCZztz~w+I z@H^mD;9tC~!I802V?`7e+@j|&N6WYtt+%Nkr zIEQP7wGQp8@tUB@%$+`sQwEK6Y3}Xm1)45q+I2gd?eQEXx%}o_+D5#J>Tw$If;d%6 z^DM~8q13c1XIHLQC90^pMAtck_h@W3=djY;JJM@z+KN`SbL#J3h35Xomq(?C9iBpU zl>T9rgTvJ8oH?eLiOTxD>&}YN=kXpTur|G0jjAT*1QmhiveHN}X6$Q(e+lStloM3> ziPl->LKUC7TD|BR^JRzsm7kNrLs*}uci&V9d3E%UgN5z)NkpX+Gb^?Z+c+Q%jZ!z{)2KK zdKceox1eN()tmDQ)oF(O^8D1QUcj4Lm4WIZH~%WpbS=eZF6-(VgR^54PW#~b>RSup zb*8OS-5Y{920jCqcQcx~1!xAg0xiHcU^~zX>;QHGy8v>fSEB_u{}Mp|zXDhZd>i;B zz}0Bat4@aM)nYFfm|S?JtrfY_hS!|L4;O{LCE;}$mV_U7(`8!zff;p8Vw2PClw}{^ zdhI^Sl#8gd0Ji)Xz&q)#z@mXS#e58lgEF8T_y({E_&qQUUGrUF2ha@+M>8e@2Y`>j z*;kiCn1}({O!+8~%_O|kP>5oZz}YD3KY(r^7sZtWcLNt9@)?N7tpAK0&O?@sh_Ba0 z!*EXLfUeXJ0CreA&4=-4ZtSgW2nog04_)e0XG0~U@fo<_yh1d@D6Yp>O2nMaTR_|(*%`L)+?q6 z)MDc`5%z0_bpo~Bkj7-!RQ4I%HoIuw9Fh}M0XaccjMdTbZ@BfcSi>sd{kGsk%*sqT&0sGVI*PcQV5Uy`O?sF3>z)%- zip!oc*M^hWmh73GUU(S>2k*+zQl?NG$M0A-v(={{s- zSxNlR?HKKojKNHaz!^Xr((MNJIO#bbTm*Q$85UiIOwvWjMLRgC$(WUiu)R6Y>hjoRV}28;0y49ZN-4{=)gYyJO|j1lJTQH$?f=t5xd`tAl--14kreg zq~ zFkYu?YU6XJ%_r71AANi8Mts=lY1D?t$5FFf;4)w?zzaV7;P4~Bo4^1Ji4x!%U>R@+ zup8ilj9>A+1egHuV$b&g-v8AB{2AaCxnh79dsYIs1FgUb;IuPvF$}l@hymXRHUN(U z*)Uh<1D63e0{;s9251FN0NMQz4qOIY2gHHz0rvoHz!Si`Kn^;oFx_84nc`t@7Ze3}O8Wn^t)aRli?m{*v_i zxMNw&g*<$&iwJ0QA+MZp&4qpn*78T5;FRSy$I^AyCPf~ZmFH^%Iv;DQ6WN-mPj1YZ zp_`93gJr#Fj^v!2ql*};Pjofhwoi6~T7_qMYk)-7@2QZS<;@jVp)Y4`MXfSlkS4tB zIw#1jp*-Cyh3d${p<6?FeSk#PHEh+IY3Vr03a2c;RS$@r_dh_a=L?A=eIae1uXSFO zR`k$SB&~H4N5+M#KbmlfBcsX9M=NAd679E^@tT^nB%2*)GoVVp2<+eRQfel)%?#SZ@?=uDm_b7LFKJI@CAOx(#38tGG0L0UOpscsaw%ed#%|(rqZm zSA6KoI^S+EG=qx)It`3zy9`6e_^Rsq3~0*GpfB8z$v9sm61F(1JP+nF!WRM4lNE`U zo7yWuewqh34e)%T0?iy0C=CuP^c9g>hhhFs>7k$=f<6e{hFU7R%ju$lsNoZQt?<)5 z%+Dr$?#0msn(yLa#%$uX3p`zKsEc9@`r%Z@p9>dG7@{8i@zd_Fa7mG`I;Y<1k`iAg zX|2vcUTUj{m-@1y+Z|t2RpD43nit2Pwmn${i%ZXXBd+6io5MpD$VwS0|5)uouTsf3 zs4FAbMyLlv;Tj=7>23xYOsJ}YjM|d1KC0XtdN9&GRe|lV2xHj$?K^|;nZF)`{8nEG zH3wD4utf5kRHjlveiOqUR*SHBHLY=V`ZOa+{Xuk*Qx`!Hi0bgX_v<2F6Wd$I$JjgG zPG1;d14vzM>%_w7ptCsQ1_(! z;oP8rcI&i{BP$QTLln@ylDreAO#DQhk6XI-3X}TvG-dk4T~+8fvMm7;;384MyoY{f zBW+>K4#K93b4k)o!2TKxbU7WLi*u|YllbXu+xm{P<TH~| zR>+m#?w+UjxAb88p_^3B9>7_~!Q?8GUc8C2ND$IHBSxnjAa6rlwLS^Zb4d=N}F=A69GW-{6yMhu0tI zdKn*aZ{jOZ`P85sZ1fj^N1R4;8xA`(N&MKU$do;{AhPNhKkaCNEMu!>-$Kl+=z)Km zQut&VPT{aQa+5Q|BdQ~`g* zw91OTl?;=5$?jG|TXIWlvouG_lH~KX1s3BhYupb*VW{jJ9y4Z6#{(byhNictX?aS4 zC!i^R_6!laP)vy*Zm7rY>pG5vSCHmi8OH51G)p|@10Q#^i00=T0G|Zd0vrII1Q?gw z>Tdvjow#9Y8U7acV+ziD{CMyC_*^`#wD&0S-}99FC*SqB$9<9;yqVyeRJC zUyGWLYEv87yF927H2}3@6+o@Xq!BCr*J#9v^xiS_ZTjR;lKZ|=OF&s{RKD)JPSMrFq}5ybHK$w5TKqpj{fMB zzs98eH8$lhs5}?U)KmQ6OSH9BxJpSy;?CLAPEnizQJo}yrq)CjMxvoAd$9q5y10Bl ze)j=$kn$!>e?I~?0{ot8Kj`B~APW2%I0vs6Sb>!ZcfYb%;Gew!4>pE($bB7&?gI7! zlaU|{e1}UJ96!Ks#(7d~yzEHI3?o4w;1j8a8;SGnTFJlgCfQw{8)giyy>qWA?(Fcs zJDPdutC%t^LzcEM@=IhMlNFN8wAT5KcNfrerYE`U_(>7)05eu;qK@x7N%|y~zP=*+ z{<6jri6w9K)X9@RiCo>0R7rikMBK(L%_z{WlBNE|9B*KqKgddS4H5(!kencYth(!1iiSQ#$ zwuC5uleNT+tR=4gXo>J6k%b?T2tOhbencYth(!1iiSQ#5;YTFGk4S_ckqAE`5q^@= zF3pcfTrwq&K5^stB*KpyM~^R&2tOhbencYth(!1iiSQ#5;YTFGk4S_ckqAE`5q_jO zuKq}KG-GZY&4x%MLy`DTk~%{-NUV(x5`Nq`leJ-#I6jH+BdLTRkqAE`5q?A>{D?&O zN$S#tACb8FBXKl8ZXBP)EkdVqBWsDPKUyOENMu)kB#!1s;s`$?5q?A>{D?&O5sC04 z65&UxD*T8<_z{Vv*$|1VKR%Uk{D{QTY>33|6e&xexN&?ESAQf(GbX8oACU+@A`yN>BK(L% z_z{WlBh_&AN2;M2bK{8qNF1L;_>ok?k4P-tWRXb4MB+b5>Ov(*_z{WlBNE|9B*KqK zgddRzKS?Q6vmp{!eBK$}ZqCX-LencYUOC&PBL?Zl%MD#}_qCX-L{Sk?!8z>T~yh!{fNzIQ0wfZE& zkHisvL?Zkob#mcHB*KqKgddRzKOzx+L?Zl%MEDVj@FNo8M zB(m@$65&UZ3qK+eencYth(!1iiSQ#5;YTFGk4S_ckqAE`5q?BcrrR!(q)#G2aw7bQ zMEDVj@FS6hACU+@A`yN>BK(L%_z{WlBNE|9B*KqKgddRzKO!m9Y=|W3lSq>#j{l@g zR;>CYsZZP>ZJ$LV{D?&O5sC0465&TA!jDLVACU+@A`yN>BK(L%_z{WlBNE|9B$lu3 z5+o-{9Y;{D?&O5sC0465&TAmapw) zJ_#aYQ>Yl*M&1M4T-=G&+g#W%G)3WtrH+!}RS?|Q)KTy@jf}fb0e!{Ey^QbsVkj%9 zH_!r$okf}V!#C!Ja68rbjZn3bhbsh`cEsE|32RZ3l_|b#LH25QQeP31%T=6R;3 z-+EcD+^DPXYA{sEclobOe^n@{Q@P}NKG;*Id&j5VFefRr(eF3CZeK9kWjYbvZV#xnH`9Fyb zeQ%0oIdh53H*!;mrSDCV*+uRkl*!f7SIjwo~M%2fxZ%pnJR*C$3c! z2c<{n$>{5#GKRT?v$^4&-8n&J40~`S<+`o-L86Xsb+r+;daSPNe`()Pyf!yT+(7M` zxk1|3Ln*dKy6x8=d=!VyO(j(73}x)~;OoiLS(1+oOIe}FiKTBVPL6RZ_L!7qS(ye; znYfdB=TJWXZpodw+V^y)oPbk=o4nYOxXE>@)+!xzmOhc>nnO#fp>KR{)xG(Cz96ae zEXC#I?UcNEWc2hIxVyu?zvDUlz6Ona9e4xy8}KIZ7VvlAZQvc?U4Uums$BpK1 zYv2&@S70F8%GVt=0j~h3qo{$vWMC8U7%-?0Kcorw7~rdp_5<$%{2bX~fFHN`DzJyY z@PPS-+evVr`I^?jC<9UL!uzmPmXgh)r{JUy%VOSrm?;zScmv=A_H?gj0pA7I0{Z~= z{dq_k0QjK)eBcKFpQvvK9s|xrrsIGcfo}u!h<**|Pi4G}bJprS;LE_ZKm_1buS?*t7-@$aUU2WEbaJBeYJ5k6 zVFKU~(~F4=OA?MY<6C>EvAFxJ7cHtn=cODaxdT)Fh8LX^RCUP-s`4=PymxKQFW8~= z5UOYryhlmyRPUcSN5QHgPWdi}?pfx#m|n?}M(O+N3fP=p(3+7V!-xBDUs}rH^6gcv zoS>II{a&H!GIMv(Hsf_E-VBUXc_TQ{dqG?e1EDvmbAqaRy{2D{J*UqzYz}&R*4RU) zFAUPQ^HnIEyv$8fCHJn&yp_aob*h`Ge^h;Ym$5VUR8N`MO)FTw_n4_@uWIxvKa(!^ zx;FoGr83o)o=Iu%*zR@1{MnsCQ$5<@IW<+C4wfFsrruIbbMk=Nnbnvcn&HJ}IYB$1 zGR6GB?iyaeH!M9)PLRWAq&;|0Lse1U4R0RSbk@8FjGQW5JWn_XNqU~`_w0JBtNx*9 zypicV(3AXh->eHi12BwRkIWQKK@vaqt2jM^cw}MJeSB*^qTCF87nq7EF9O^OT!*Y5 zVD>o90zL}aMZm`(%L6WeEC+uFfpI_x_&nqzfbjsoVq3$+ICkP3Zs|YvaR@ZmLLKA) zk7Nb?PLX~q5YO=(s4sFZs;FFBM&ME6e^;Pi%id?IpQYcGFV9Sv9;aybJWgS^h|g2_ zT96Z@0+^fY)3Mx(>{iOZCGWE-?~k?*PJnK0YVVFidp?{8OAJcmeT;zj^79e9dG=Gn z$GSJZMJmb0mw{pEiDG9so{PWF2GC(i{A}x<$1h>q&*yy-0_RZz$nEEiZ7u#HLWVjy z(1xBj)JHWtVaW$XLmxk8x@d>?oRD8@**6F3Vs;)nT40TzaZge~aHr+)qg zQjTqUtw#Yqq{2_|4Z=BN|0{4l{vM3qdSELs0e{Z}8i5CaNyvl8)%f+he>p)m0uKY3 zEI1h|ea{z|Vvi#$YbifBl5!Z|SFLh%ZN9No_Knfx+X2&3N}(P2b^2&^3eea0ahaIL zea5L*5f@ATp;dG*S6^dSF=pz94~r1@ok2IM(q<+MgUGnX^O>idpsJKifgC%W)*2q$ zd2-&u1w)4w4Q*bI92Y2;_#A(VrYEE91? zr+hrXBLt*8;mpzBc$nokwb-RYP5yFP+BZdVPo_(9f~=3TbS?XCne7V)T3!HOUh6_W zWsIjSKbQG^iz`+496nF_)yzDe9ZK}7UGPPqa*8g_HUOVLo2wy;|7oC)}NF4gu z6-eU8Db02sm>BJE+uraO5{^9##Na_YFdf(l@RL?w1BBwhX9Y;@oQLj@3%wcUrg<62iEZ>eO5uv7zGpN1veQi&3*2) zOpn(~dTc8*sx~Uy?T3ma*neWK6no8Z_k-zkda7zVUyh{3zG^z{*O9FBO6COZ@~EiZ z1H`4}E?LNl;Xx`VJJC@p4YiE=*3=@pV=DqT%KnPhz6P-DOqym?(-I_j1qoku5*rnq zLPtlB+}E+ytfOlX>F>a0P${2|GJtwY9pw|9p9czn;Xu01ZbKaU+;on4@Pk#o(@{1e zgN~{oMY$UNW*sGirMb`cMn}n+tD|2CxV>o{BJ3Z-B@~l3s!HhWls5V*gawbMcq|Ko zsnx+|6~nO#r_QUUjc^$_ZJDb{fZp{Me>-TNGi*JGC7u@v6 z-L^hbS09+&xPQw79dEbX`_MDpzdgLG`EI7@+I{fO`Zar>+Wgk`eTR-5eS3X9r8@oI zSGTX;^XiWMyB^>8P+NUROT#wiu($KjvBrDXb#D7x^9egzbQS z>^peyk9?11M?3Rg_sFr=`I?L!`&nMs(+q7t$#muO5UYV^ymNKl;9-SDc^wV=n|8f^ z=%FLW8(wU@i#4+Axb;BS8ynuS+uD4h<=#C{?0>82;f*a#ZH%*Zbh-5_ix$FulCj5xqa2HM>~%1 zT~)XJa97veAcFL(SUOHe! z^Ol`2583j{fmPdAKe&ofhBUs}`W&VFW8a(W_cgVt6!+AxQ6HjqDzCmPn6c`r!qz~y zt!rP|uu;rg49F)4JwE zt9QJL4-s+#b)vB`lcrfzP=20p<2#)%?RmZV#IYkA9%z1PZyj?%@Oe%GY|N`y9N5v= zsVE}P4O|*uXdO7wv5ns^tY2emTv12E<^vm6b*`RzB`+bVf|1Xmhn%9D8aM`KA31*T zk6WKz_xRlQL$ke#Ik$cl^9fuQfa2EQ!|x~BU14X?)Q0NKM7BKGu4{p>0yMl_Okj0l zodunt-K++_4jcrsp@#ziZWQp{BKK#A7yg1b@4080A4uBTmMOPKp0Q3mnc#cQC@y(!2 zkul#|wefHbEGtJams1(CWz6bOJdT(g=RL$^xizr`u>_*h9P|)X)iqR(h_o3!L_~Y7 zNHyZot}q_{PTzUSP;pi#5nF-}(3rMBt~g!2Q6eozUU6)Cz2iv76YF0K1fRCkecb+~sOn2wnUTMf!mXq38 zYnp0&=+2mquQ;}C1m3)1a*I_9G9^}B3>%UmE$4=e1v|Ztqy}~hJk0R4B=-`ZWVth5 zbO0DsE!CF_uzTy@uX5t3fdm6((NFHLb8vo3oNrtD<>&!}a;EzqiYveeWe zpMipa(}ntS5sN7VVn8$SJa9V98$VXO0N`hCb5O!?fF@5FW=1>>0oe>KhBV-$!jH<0 zYs7yCegS+Lac%*=g!4ZF%$@tjPXhgrmIrH40elr;nsq=a!kIP!Fg*`mL-$)gQsyzJ zboMWgO^sGXqG6*=wd42J;1sKp-G88*?4Mp44^c&Hr<JH(UdBVUz;8V4#2(}E;aLDx-S@BnD$YOD0#wZ7=;_Pup`y~YIhphsBO6#{BlA55^yH0 zLO#IPG1UQ|gmst=!~x!Eqihu;^HbB=46Ok!fPfo(vw;5qeg!b6(ZI6+kFVgj48M;9 zj04aO#tHufRO;xtp}KPBJ$_49Ouk~$1frC+bnj4$7X#D5p9b#F&wH%7|oWQ z8PIA5JJxcs}=L8iS+A6|{ z`QSc}ci)+6sJ7T=O`ptP-1=oXrzDFW)6c=mFM!*DUjh(Wp9b;)?lIG@&?4Z6-|Db0 zb8#CI?Wa(`w3C*@*`(gOr?JyDC6L?qEYkKo0Q>}{{1o_^QyM#9KEP6)k`BMc+BzR3 z!Pi$Y+))|=*EKWXSa;i|j<=6>N~Lg4#AGobHg9E#e1A7}=i0$9*_zzX0_pc8lsplSqxtATmIe*^ab z8-cd~9=vnWFlH{YL*-vMXH=Kc%y!5L!G=|(P znAUT#Tp@c)<9SKiWor({(SvUQFYlMBX}x6%Z-Zrx4C||ZPBTM;Z~g$yysp>HR2Rel zY0Wemn4Sq$!|XzLm>JE@v{P?EdcMX_Z1?tl0M!J!00}is($nA)0=M8C?C$E~Y2yxV zE^*ucQ1hnOiiUOKBV}$F*HiUdiiQmxj{k~EMwAu>Ia_h!{51yFZvdPszk+!eTA17L z$*?i;@|s9BCPlg|EEqp@ZSdn9XFI=x@H-FK4tzl+wgWzA|EQ~t41Wl~MH%Y_pvZ|g z0>6tdXMH?Jko77Z@NtM{s7j2DMH4l#Dy|Q>`RqNMxZM4ijIUNpUy$1={!z$E_8YN(|*f6-CrJY;NR4ledUY`N!nJjIT2U@@c234 z-*e2pB5i-RB$v*Qx2=YI3v+_3R*!Gb{ahbpVm9IiyYBVtH7EG?N7{R`H78R}l@pGd zQ{aSmn|Y6tT=sG*Cs(HPmJ?*PK4eY`Q7%U@JKJ82G_~;Cg{&Q&&F=zJQS3C}YG67r z17J9p92WzZ0&F}-jSycQkeYj{-5I{2K66I998H2Z0xXPr+V|1>(Tnz%gJdnzjIFI|nZ_ z2VMebO0t>Z?*JaOV_cDa6AAc&;ci6A#_u1I=~jS8UpP!3(wjN-(|m9g94|~i`WMha zW%BeTADK6d0>hfY;Ks4P&j?Mko@ zWoWh%QE~JkwbVB)TE3H{Pa<#Mk;v|wL?p62@u?;9_8mzjZ{HD#ynRO`^7b8($lG^B zBDXV&Bq?ui(xtchB$j>#R8p1sBuOnv>U<=!Nc<YL?Zl%MEDVj@FPvOq+BK(LXsreC!@FNo8MBK(L%_>rm#KOzx+L?Zl%MEDVjrJExX zDO4o>lceUy4bp6g#MK`iS@?0|=V(CIf;y-cqMBK(L%_z{WlBNE{!DTV6!T_nPfNQ57e2tOhb zencYth(!1iiSQ#5OIJ)J{uANH4HEs)$%P+@Bm9U&_z{WlBSnb*h(!1iiSQ#5;YTFG zk4S_ckqAE`5q?Bs=?02KDlZcMNmBD8L9ITC@FQ`AACU+@Nu6By5sC0465&TA!jDLV zACU+@A`yN>BK(L%_z{WlBa$**d6D=}T77YZABimdh(!32BK$~X;YTFGk4S_ckqAE`5q?A> z{D?&O5sC0465&TA!jDMGG#esG`Xth1iQ_*h)2mSlN@|H4r0ugvgddRzKOzx+L?Zl% zMEDVj@FNo8MU4rB!spH6r=#NN*ACU+@A`yN>BK(L% z_z{WlBNE|9B*KqKgddRzKOzx+L?Zl%#PYSh%qKx)^FC3r-XL;*aq*O!oq972+nc6c zeeQ|sC>dVB!|hWYh3^E-v~A{Y<>{B3S!ydUWBkR=_Sk#BaG1NdhDYvlf@-@DyL=hT zknKewGD`k3#h)+n^>(DZS5AW5&!NqC8u0(McP8*vRd*hLFD&l1R&-kWN#_L_ftp74 zJeRa0;3%z%qSX#ic!q}rLK3r})Y_(XYi*r6)lQwxbZm&N5NMk~B1^y^2@ryYNFXS+ z7OBgqwNs^45z+bn&RyPp@7@<)D4kB{cFdou!7)@%tL!SsFOPQiI25ViCb( znOJV{tRz?qn&K#}kX>UZ!m~nVEj4KMOXe(a2`B>J1-~TZkq$8aM|P8qWKCfTm5RSnaJxD8*vo2% z&P7f$-xzm_tgEio=Xm)yY~)AG$7ABXqm2 zgo^2O6$vLtk94)qgdX|f`NmX3^dehEIvwX<;e2DmdKs#-I$l8Ptc<=2n6>Ip9qXHa znaj_nhUSCadmA3xxUZ@0(Oo+ZG&DChZdkhRfIf3ty**M6LY(iMi{)5GZ&7-~^H0x8IdUc`o!S9x6|ED_`*b4JMjU;SdOvs) zybWZWM6f5vY}SzdnugrS zSyQH6d4)c-HD7)Ewl-SviNEYHp--Ng75;d@CP>StayfYs*RAK+8<}{w%y{!<^`cmL zge|fb)2SQ_Ze`1(sk)4vP`~SzXzgl zF}N1!Gqu$~W*5%@E&XiE)%`m@XG+TcC!4QfO**S|Oz&@;S62kYmWFn~KtR#)IY63f z?^9)}$rY4T6&EW5X$X4xC=&*eh%AW1PQ&3D)qTF%3_U_oXi)7n<8!VHEK<-ud4^J5 z+AHR$EIfw>gGE3aFD0+dR0&V>DVCnU7%R!B4akfE6Tr24!NkEaC=4YvwH}o8gp3O=5q0Dy9rhn5>t82qbzia` z9%ve#s2wTmF*~lCj!o8;R4bbWp&Z|y_Ux##kso%xK6Hvf=@nxjdujNo#h|9CYX62^ z1ijXLYJN{9pc?*UFb&8^>+`pSoHSkA0DPzEWl|fUQpl%(F2j=;Prk(PN{+e${kA^+ z#RB8x@tc|CQAA|Kt~KVD^+)!rz#*V7@MTogNuANvSoWZ~5VpHnea5YBR;{kHE+RU)>TqwpEq7&edvkZ!p1Pec z4w*5;D9VI3-*i;)ycg)uh|9qDft2Gh&>o7tq?S3@JWD>0!zD{zM`NEQ|60M2%A~KP z9|cmr#)BKco!}wxGLSO%J zKOka0#f$KCT9De@Jzytz2J8dHQQ3G}%6#8BZYse1 zoW9rQ;9dqV*-;a1cGRRa(J1_ElpQtkyTV@|sHvh?ZQIqLBjc?ala_IhU1O?XyT(cw zq*)$5gXOnv4>`66JSA6Y?wW&bEt}Ts086(%$Kd%1ps!n1pQd&s?PP}9n9TFb;NQU} z@Emv%gz-Jugy73to(r%`GUNS{FFUGqCeC~a5N^t8;D_^OV3^79CWvWFw9@f09`R~5 zG*d;0Qag3waNrlzCSi6f4)cMuUnullZ5u2_i4SvU%_=OdDyh`?*F=+G8b<~w;bM*T z-C_>Csqu{l|4e~>&#wJbc~9=w#iusIaBYFbGa4Kff$tFNyWn0sw901`I33tw6dB69 zltiOE$QmTGmYKjLIdXA^%}xitVQa$F0tw7d1jvnQu+-1+*=(iX{#i3?J2Kd+<7_)sRiw-`zK z43J=)X{H_h(mgwB(&TcP*hHe1OJ0zX&Ino+AeR3j1bLY2LFJR5HbW_ne+CcW;|Jhh zZJ!D?0ceQkWh{5PGE)wd1Wy*mW{A%KD|hu9*3o^mL}oGVAy$%vRx4Qq{tc`G7m*>Y zKNtzkd+0%sC089UB_lC26i7NtO(+K60^b9hfu!VNXU>y*D%SbY3CU8|!y)vZ= zJOidQbkZ=TA(3E8zrf{`C&ls?9afn{^unoPn`BN^K_<8JpdrOk=(rrtWJ+C%MsTyS z6C)2Z5x{QSP?Dsq^t3t>n2I)>{qIneYqFA}HW3F8;`(pkN477u2`RVf+r&q3wcD4i zsvJ=nIhi0bBf&HvsjD1>uGSw+1c;+A2J&zh_!)Q1F72_ zg=sEs)`=rB+Mn=q;JE8rl`DWE_#%h`F~61)3zLCnXLif!R?LFnOEML~^eF zKQCylx2Aqhyf|JNj|5GK=Ot#_wdO0%7Bk4G?ew&6+}9-$=o)I;ETGnsd|66*+nNkR z$dN6(bH^$rx#P?Ns#=cBcyK3>PWu#yKxRCUWNia`!6&gdBKk-AA)jKqEO~nd$cX0! zk*fgWSCP}9n*RhuZkg@(b^9IXgb7?HRaTt2CNh(D(}6@qnw6Q}wxsyAOf7sj5lk@vPo|2UfxBXhSsdImN&%@>cW0zb8NC!B98kU zco^58+CHRjoCKg!%|m1)LGfCRRp8`@)AOa(H$-44xEMJ4hD5gbd+ zp`3bkjlS<^@#-4VBn-vus0s-&Xxg(fp!@bSb^?Ah_=QEPQdp0$k5OoqMx$Q6hZaY_x>iyrLmQchbB zP2qjdlAZf&*By(MJ4(^a^wp7!<#tI)T~MrcX)&S;8f+@0q~TIREwe*vmhW^sBn)pQ z*ofrNrM5LhP4R1CuVr^3VeuNVW(+kphKrvLvAoDVudg!GkyhrqAE@eBkm z2C7(`Ii{MwVNuXtIGJm}P%wh`k>Cqp8dwVUfrCKnd%6Halp8Rpf5MLZA zD$(SiiGHxkkC{aI1Lw&7oME|y(2mc*qO{U9n{Zx(4rLt70iNDHZ@FgQ0^P)!mi{-^ z8;ajfz?|7>90seqD2tU>#I*?_m7MQf&6F*!W*e?@XGxu)LRQ=6+|G2-!}#nq3p|rE z$7!QZSTbX%QF5|!I#Dglsqi(Vso;{aTO(RWI6pFE6lO?ng!4gyI^GPicP;+ z|MP-T+%R~!V07&Y>6Qg!^|t4gf^oGgr0^Dur%i`013#yfegS?7cr_Dq5uPUkTZR?~ zNlhc{Cgga)lQsJK0**2gTZ@1u%l-&HhG^1F6WYeBT?(gAGk1fZ zf@i_iB=tLBDcG-ML-A8!C_nM;nR+{o*Zw*rJ{#vO(Rmo~JMe1mQ_Wh7iX?W zGIY{NHA5mHeVjy+H_IH&R^9BVp*mPA4h3#M@7E}7p-r_g(-t5Q#A`<-_B5lR#gtMO zSP*emYN!@#D{R1-_d%0QCU%ntYhP`kqHJg3;}@kIDz3r{90?_;TFW?4waYxBFlMmV z!#*9gzLlH1yCMr?Ws%+c*Sw|u#gOc~qG{Mb8m3hY8e-)^)W~(k=tw6OnzfB=oW`la zRib7eIJ7rBW{Gyc=D1DqcuYXa1T8k3$oxIKZ8OOEo=Bs%3~wS&lzvIo!W+0hSyU9RMDUf7lg*aks}E8~URz&W#afx)NO*aT5+x%cDkEX` zXG|4}y!91`^RYiR)#{nmOK>dto&ycP8Om#8w=A04^j_Z>=|1#S{qCLC7ax(9x{mdF zRfD_`w8K-|06)!VnWyu#=Q{|)eXyO)J+0P4qhiBVpYDskC9FHJX(Rk*umx~EG_)hWtoU_2CP z^sx}!1?~k80F8m$fi~|&fCdC#1~PMb2FQKs2VR3xqtZ>9#t9JGUO(`9uozL5=jUAQ zCC_hSP(3pIRaNpZw6deB(BS(xd;^5+s3DzbO#zb|gH68Eq)d#MA0&)S%5nzzlbjSG zpYR97m>o4_&7tj50bjfz3tU$^F{_$vHH;qw+ldv~wF!lqmf0aVtO{6_w z4|p0p18_1s@WiaY2D*Cr9G*6vL@@-EOT-k5nYOUKyJ;DdQYt$SuiLDvDA~+=mVWE1 z%Gz~9E}YBl0+GVf;?nX0V_zPhW1gQK;w9^51+t!^tzB^xWbY$$9{I8Tsi*2qQMYVs z*Uw6!a0>YLUE`RH6}`CuRM<)kTCKv}8M=b1fCVlgfshoja% z!{}vYv!qr8v->4p6Cw2RZEpdQGq z;~Aufs=?&v%r<@!e~?yU=6rLVv0)l53Wa+c;i}aI5>kuk3n8_f{2X;fUPFqEL-2rI z%|B4)s#zjzO)j&eYM8v)gaZ17fPso3?UlI!{el&}`gX4&$(DmN+H)LnFbT4D_6E?C zBqpCCL=p)*Nas?lC54t z`Is2(v{6j4aN@H^iSp7}x>TLd(3kFfQ45|^v9oU0)Tacy_UcM>-R`;WfOSKsbpM2J zK($en(}z4)~e6A#93Szg3298Lg0(3ZwS@ z3ZY)LLyqJ<*Y-HjzQR{2G(DjDHeH(8S+`@~+NT>|?>x}>E*HWNP59Rhzn1sX1&&|& z(h;G$&roV0MNRYw$;oBKLgs_cmnoW@}NC8ia=V_LqMJ{0WuN?S2dWihGwYSZ6QEeO0*K+ZZ;ELcGM6EoRkzd`G==b zt3afNn9E?&tcIIR`0ui`0{17d7%X@Ka9+w%vL{A;9c4m6z#VJr_jtF((u%58vsR1k z{#kcx*XA8dR4?B4YMqgg+F}zo@3z0b{(XgG%E{<1XO0X1!{32?fR#C3?QEV>Jf~aR zE7TONy%4_kDPM=jh9~gQ7Z58uTh^Of4$bw5AA#gY!D%*WHQejLU#jsI+KHi{R(8&E z3MjPowZ`R5zt+81%7o@LB`I{@uIs0!p{Y%uch#?W`Vd;n%0PvwLA!7{KO7>!7gYqXZ77+(YPu(${Ohn=E}u#-`0uK}9KJe8CT zC&s(L%ivOCTm}w+%ZcrNu$h!?$6pcn3@N@3ybZpL{a)P1kb*Ag-3}C2BX}OD6m-Rx zhK}C2=i;^qJH@Y!2JZuEpvdu#X5{T3*F=McBjcso!!HEvN_ zrJ*Ukx+zR)K8ds{-6cS2*Nve{|AqKf9y$oCe4Iu;l$V>pEkI@mPrr~=OYsO!hW0)2;*{} zcr|flM@{HJ@v3$oAYQG~plW*+uO6onaXLBVx~4n1BoEJf ze{6W1#9P|jh+$%7W#&VVH2sAk^npw0Y_}S%ALG;I72XWpP*gIfs0`jpWFcKr!{eN! z_Bn=|ZptVIb^+Oik#P(v9_3+StT3Y}vicsy$wX0FQe0FLFPs-IT#!*T{f;ggzO*R4 zxo{qL2*xvtrvIN2O;w4?Eu&~o>3cM)7uE?2<5ih4*8n$)n-Q&Ela_r?#8=_sLS{;; z3RPUeqfOH|2KJr06cMY4GKt{0ql=&%mWq|%7@r$EQVxzkx(F=3t>ErKQ`Nl`(FuKz zKy_RmzwySRMMo(96J6Rq{nV1Wl0+q?m2CV~JqAsEm})%9rSl~McuiU+kvw0-`bw|t zak5J{P5RWqR+SZ(T55MX0eNa>WU9(_iD>#BkN&XEu%G7Z9YnM?Kcd0FZ3OTRB7z3}JD-wmHzAtZ^jG0(YBkX4 zeyw%?>Zf$rfJO?tU$REk`n~>{+NJgHZRBW$=0_e~wc+`iB~aP0W$(G2&voy6^!JY) zv^_0DF*Bo)E6DqmU@A~1&HyUs%ts@|72Tz01F!(f31U?Df zED_f@AWIZA1j-Ug-6?!2E=t0+;5*>QK;{J8CxEYk>G;zwjaR|BL{$m2L*i_rDg#a6 zWTJY2aH4f1xC4k*6W9-AL^A@;2cms55dG7js|{<4=LbM>?FEYO?}cR-(+KPC2+98A$L=vvDbV0l% zl=EP}l)*rDbjrZ+0ImT(Gf-%$HDxqOV`5?mp*E875W-OJ`w+s!#dQNFs-O-Ao#4Rf&xT74akNFbiK zkiJJ!ByGuPO0o)e>TNt?D3u(Ek|`#mwFh#QAyS$N5pD=i*Pj|9H)TSk$_!D`r=QRE@%a2fiWtk8uK0;MixY!jt1;pSg{&qS-vIn{S1`Ul&YS?#%L>LQe1Dfv z_ojrTk-2JzyS*Hi(hRcMr=e)Hd{+Y2f!DzRx)^O1jDa76mw+bIv}E})+|7Xw{jtcB z>tPVVR#dJ6cLQya6qN$-6(FN^iRXa)6@qFYe+@u>^&y)+08$toTNl~BzMlfJ0Ms1LZLXFA2X1pfX0!Amt;Yp0VCM!H(Em#Md!Qg)30Vnql z50E+|I)j1Q+!a7%?g0M@JYTJ}FK1_oTD5f{{2*M_rg#_^weia)xyMku_7h7>m@caP ze0;IrZBo3jd~uoOmKxK_&W^*3fS&cI;mM_4n>Xy2%jqd;u+%oQYeqAP>b|S%7G(Wo z=>qeSg$gZcDS~&?jL)JuYx+?$ham*3{%Lwlb61*J(v*xQPBgcn=?BdaXe6&u_{l)C zLZ1n9tLYcCkWB7&j6nWT9DMi14Y1S&N$oUtD=n;k{dwv;cQ<*FBYnp$7dmt=VfpNhTpHO_!~a?AR+y4s$2r=x+L zR&^1_KJw|v$h`4h+IyC)e16x#?N3?}dJ1Lj@-;8nso-!+qEJcIzocD=N}BC+&3j#& z+IRQZmUdZfZRyz}2cJ)iyFI1lj2lgDnPbQ-9&$!|M5JEtLF!F9qqIFKYwG2tZ%JK} zvZD@Ls)+niJ$-5on#u*yRO!~H|mJQRnj zETlh;k8Ak6XIB@e7&bSDq=wtxoOsiDotE&b^3)VXsQu-&he#rm77DfNO}1OvzZH+= zDkhWXU2k@5-MxL?=8oEKj{KKR$Kl6YyjfEDv~L&ht1W&h6h2X>-s`~m-wg<#_&T`n zl?7QBfj|5gLIO+$cr`q&vcI~rcw*_ovZ~7X#PY&1qa{B!HtyLq`HK_QEbV!>Wxs|1 zC6#lEi}OH0fPT0WJ^Mn#lR5El@(jSMTlWfLw;$#{XN??XRVEU-8W&@QP)_xwaX3Z+ zPvtqW^xBf5lA_9@SaH!;;&5Ro7XqOxi{oQP``vMIjVNebJhAjLe|UCHj~N~08X?3P zSyo2W3D_AZTXc1t(a@s!99x@`y#(~-RVeKjFRqMVQ+i#|ocKhhdEwU3+T|^EJWN>x zc#&e#0^S}Fp8O6t2;K#Uzeb< z+nPy7HU5js+yrpYlSS92QCK+7b+dXRyK;)loXnUYo`N8V;{G~Ir1Mx~qtmCa{HnT_HqQJPT3B`PJ_CTBKYYjdgV2icRhFa7mzYd5!1 z^XKU`1=bxhs_@zD(^DhM)M&)3aEj}l+aCHRgaP&+B)5&!PUuO?|lk zX^Gpj=eU#FU+#a>!k0t+3qKhiPMhRBg@Ko`K(EC32EjCwjMB>o;>$Lm^)0`Yn-E^twDyR;A_Zk zhG}Lp2>MCp1B@!>Yi&jQseuzV?Q3eR-Mj@RxInKdu(lSeJ_gOmIlLl?QtvMsT1l+; zlSawm>K5b5ra$FS?N+gD1{yyKA(+lWU+Yj}(px2h1!J#$V6SNdN;R;Iv4?w@WPgjk n#IZK9XMM_&xE`P4PP2t2kp`8==@p^l$h;EJtC2E$H0FN*7xnsJ literal 0 HcmV?d00001 diff --git a/admin/.DS_Store b/admin/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 + + + + + + + 温泉PHP网络授权系统后台管理中心 + + + + + + +
+
+ + + +
+ +
+ + +
+ + +
+
+
    +
  • 欢迎页
  • +
+
+
+ +
+
+
+
+ + +
+ +
+ + + + + + + + + + +
ဂ刷新当前标签
ဆ关闭当前标签
ဆ关闭所有标签
+
+ + + + + + \ No newline at end of file diff --git a/admin/ajax.php b/admin/ajax.php new file mode 100644 index 0000000..04db7c7 --- /dev/null +++ b/admin/ajax.php @@ -0,0 +1,1640 @@ +select_first_row('sq_agent', '*', array('accesstoken' => $_POST['accesstoken']), 'AND')) { + die(json_encode(array('code' => '-1', 'msg' => '秘钥错误'))); + } else { + $_SESSION['admin_username'] = $result['username']; + $_SESSION['admin_id'] = $result['ID']; + $_SESSION['admin_qq'] = $result['qq']; + $_SESSION['admin_password'] = md5($result['password']); + $_SESSION['admin_HTTP_USER_AGENT'] = $_SERVER['HTTP_USER_AGENT']; + //$db->insert_back_id('sq_log_system',array('time'=>time(),'ip'=>get_real_ip(),'msg'=>'管理员 '.$_POST['username'].'使用API秘钥登陆成功','type'=>'success')); + $db->posterror('管理员 '.$_POST['username'].'使用API秘钥登陆成功','success'); + die(json_encode(array('code' => '1', 'msg' => '登陆成功'))); + } + } + if (empty($_POST['username'])){ + die(json_encode(array('code'=>-1,'msg'=>'请输入您的用户名'))); + } + if (empty($_POST['password'])) { + die(json_encode(array('code' => -2, 'msg' => '请输入您的密码'))); + } + include '../function/VerificationCode.class.php'; + $verification = Verification::check($_POST['token']); + if ($verification !== true) { + die(json_encode(array('code' => '-88', 'msg' => '请先进行人机验证'))); + } + if (!$result = $db->select_first_row('sq_admin','*',array('username'=>$_POST['username'],'password'=>md5($_POST['password'])),'AND')){ + //$db->insert_back_id('sq_log_system',array('time'=>time(),'ip'=>get_real_ip(),'msg'=>'管理员 '.$_POST['username'].'使用密码'.$_POST['password'].'登陆失败:密码错误或账号不存在','type'=>'danger')); + $db->posterror('管理员登录尝试失败,账号['.$_POST['username'].']密码['.$_POST['password'].']','success'); + die(json_encode(array('code' => -3, 'msg' => '输入的账号密码错误!'.$db->geterror()))); + }else{ + $_SESSION['admin_username'] = $_POST['username']; + $_SESSION['admin_id'] = $result['ID']; + $_SESSION['admin_qq'] = $result['qq']; + $_SESSION['admin_password'] = md5($_POST['password']); + $_SESSION['admin_HTTP_USER_AGENT'] = $_SERVER['HTTP_USER_AGENT']; + $db->update('sq_admin',array('username'=>$_SESSION['admin_username']),'AND',array('loginip'=>get_real_ip(),'logintime'=>time())); + // $db->insert_back_id('sq_log_system',array('time'=>time(),'ip'=>get_real_ip(),'msg'=>'['.get_real_ip().']管理员 '.$_POST['username'].'使用密码登陆成功!','type'=>'success')); + $db->posterror('管理员 '.$_POST['username'].'使用密码登录后台成功','success'); + die(json_encode(array('code' => '1', 'msg' => '登陆成功,正在跳转!'))); + } +} else if($_GET['mod'] === 'checklogin'){ + if (empty($_SESSION['admin_username']) || empty($_SESSION['admin_password'])){ + die(json_encode(array('code'=>-1))); + } + if (!$result = $db->select_first_row('sq_admin','*',array('username'=>$_SESSION['admin_username'],'password'=>$_SESSION['admin_password']),'AND')){ + die(json_encode(array('code'=>-2))); + } + if ($_SERVER['HTTP_USER_AGENT'] !== $_SESSION['admin_HTTP_USER_AGENT']){ + die(json_encode(array('code'=>-3))); + }else{ + die(json_encode(array('code'=>1,'username'=>$_SESSION['admin_username'],'adminqq'=>$_SESSION['admin_qq']))); + } + +} else{ + if (empty($_SESSION['admin_username']) || empty($_SESSION['admin_password'])){ + echo '没有登录:code:-1'; + header('Location: login.html'); + die(); + } + if (!$result = $db->select_first_row('sq_admin','*',array('username'=>$_SESSION['admin_username'],'password'=>$_SESSION['admin_password']),'AND')){ + echo '没有登录:code:-2'; + header('Location: login.html'); + die(); + } + if ($_SERVER['HTTP_USER_AGENT'] !== $_SESSION['admin_HTTP_USER_AGENT']){ + echo '没有登录:code:-3'; + header('Location: login.html'); + die(); + } +} +switch ($_GET['mod']){ + case 'addapp': + $txms = rand_str(64); + $jmms = rand_str(64); + if ($_POST['sqfs'] == 'jcbd' && $_POST['bdip'] == 'false' && $_POST['bdjq'] == 'false' && $_POST['bdqq'] == 'false'){ + die(makejson(-1,'当授权方式为检查绑定的时候,绑定IP/MAC/QQ中至少需要选择一个!')); + } + if(!$id = $db->insert_back_id('sq_apps',array('appname'=>$_POST['app_name'],'bindip'=>textbooltonum($_POST['bdip']),'bindmac'=>textbooltonum($_POST['bdjq']),'bindqq'=>textbooltonum($_POST['bdqq']),'onlinecheck'=>textbooltonum($_POST['zxjc']),'allowchange'=>textbooltonum($_POST['yxhb']),'allowunbind'=>textbooltonum($_POST['yxjb']),'logintype'=>$_POST['sqfs'],'usetype'=>$_POST['syfs'],'cycreduce'=>$_POST['zqkc'],'unbindreduce'=>$_POST['jbkc'],'rechargeface'=>$_POST['czmz'],'onlinesecond'=>$_POST['zxms'],'reggive'=>$_POST['zczs'],'notice'=>$_POST['yygg'],'ver'=>$_POST['yybb'],'uplog'=>$_POST['gxrz'],'upurl'=>$_POST['gxdz'],'forceup'=>textbooltonum($_POST['qzgx']),'free'=>textbooltonum($_POST['mfms']),'connectkey'=>$txms,'decryptkey'=>$jmms,'data'=>$_POST['zdysj']))){ + die(makejson(-1,'插入数据发生错误:'.$db->geterror())); + }else{ + die(makejson(1,'success',array('appid'=>$id,'Decryptkey'=>$jmms,'Connectkey'=>$txms))); + } + break; + case 'getsysinfo': + + $fanhuishuju['appnum'] = $db->select_count_row('sq_apps'); + $fanhuishuju['sysver'] = $G['siteinfo']['ver']; + $fanhuishuju['czkeynum'] = $db->select_count_row('sq_key'); + $fanhuishuju['tckeynum'] = $db->select_count_row('sq_fidkey'); + $fanhuishuju['agentnum'] = $db->select_count_row('sq_agent'); + $fanhuishuju['tradenum'] = $db->select_count_row('sq_trade'); + + die(json_encode($fanhuishuju)); + break; + case 'getapplist': + if(!$arr = $db->select_limit_row('sq_apps','*',($_GET['page'] - 1) * $_GET['limit'] , $_GET['limit'], array(), 'AND')){ + $backinfo['code'] = -1; + $backinfo['msg'] = $db->geterror(); + die(); + } + $backinfo['code'] = 0; + $backinfo['msg'] = ''; + $backinfo['count'] = $db->select_count_row('sq_apps'); + $i=''; + foreach ($arr as $value){ + $newinfo = array(); + $newinfo['id'] = $value['ID']; + $newinfo['app_name'] = $value['appname']; + $newinfo['num_user'] = $db->select_count_row('sq_user',array('appid'=>$value['ID']),'AND'); + $newinfo['num_online'] = $db->select_count_row('sq_user','appid='.$value['ID'].' AND htime>'.(time()-$value['onlinesecond']),'AND'); + $newinfo['bdqq'] = ''; + $newinfo['bdip'] = ''; + $newinfo['bdjq'] = ''; + $newinfo['zxjc'] = ''; + $newinfo['yxhb'] = ''; + $newinfo['yxjb'] = ''; + $newinfo['zqkc'] = $value['cycreduce']; + $newinfo['sqfs'] = $value['logintype']; + $newinfo['syfs'] = $value['usetype']; + $newinfo['jbkc'] = $value['unbindreduce']; + $newinfo['czmz'] = $value['rechargeface']; + $newinfo['zxms'] = $value['onlinesecond']; + $newinfo['zczs'] = $value['reggive']; + $newinfo['yygg'] = htmlspecialchars($value['notice']); + $newinfo['yybb'] = $value['ver']; + $newinfo['gxrz'] = htmlspecialchars($value['uplog']); + $newinfo['gxdz'] = htmlspecialchars($value['upurl']); + $newinfo['zdysj'] = $value['data']; + $newinfo['connectkey'] = $value['connectkey']; + $newinfo['decryptkey'] = $value['decryptkey']; + $newinfo['qzgx'] = ''; + $newinfo['mfms'] = ''; + $newinfo['gbyy'] = ''; + $backinfo['data'][] = $newinfo; + } + die(json_encode($backinfo)); + break; + case 'savechange': + switch ($_POST['mod']){ + case 'bdip': + if(!$db->update('sq_apps',array('ID'=>$_POST['appid']),'',array('bindip'=>textbooltonum($_POST['status'])))){ + die($db->geterror()); + }else{ + die('绑定IP设置保存成功'); + } + break; + case 'bdjq': + if(!$db->update('sq_apps',array('ID'=>$_POST['appid']),'',array('bindmac'=>textbooltonum($_POST['status'])))){ + die($db->geterror()); + }else{ + die('绑定机器设置保存成功'); + } + break; + case 'bdqq': + if(!$db->update('sq_apps',array('ID'=>$_POST['appid']),'',array('bindqq'=>textbooltonum($_POST['status'])))){ + die($db->geterror()); + }else{ + die('绑定QQ设置保存成功'); + } + break; + case 'zxjc': + if(!$db->update('sq_apps',array('ID'=>$_POST['appid']),'',array('onlinecheck'=>textbooltonum($_POST['status'])))){ + die($db->geterror()); + }else{ + die('在线检测设置保存成功'); + } + break; + case 'yxhb': + if(!$db->update('sq_apps',array('ID'=>$_POST['appid']),'',array('allowchange'=>textbooltonum($_POST['status'])))){ + die($db->geterror()); + }else{ + die('允许换绑设置保存成功'); + } + break; + case 'yxjb': + if(!$db->update('sq_apps',array('ID'=>$_POST['appid']),'',array('allowunbind'=>textbooltonum($_POST['status'])))){ + die($db->geterror()); + }else{ + die('允许解绑设置保存成功'); + } + break; + case 'qzgx': + if(!$db->update('sq_apps',array('ID'=>$_POST['appid']),'',array('forceup'=>textbooltonum($_POST['status'])))){ + die($db->geterror()); + }else{ + die('强制更新设置保存成功'); + } + break; + case 'gbyy': + if(!$db->update('sq_apps',array('ID'=>$_POST['appid']),'',array('close'=>textbooltonum($_POST['status'])))){ + die($db->geterror()); + }else{ + die('应用状态设置保存成功'); + } + break; + case 'mfms': + if(!$db->update('sq_apps',array('ID'=>$_POST['appid']),'',array('free'=>textbooltonum($_POST['status'])))){ + die($db->geterror()); + }else{ + if (textbooltonum($_POST['status'])){ + die('免费模式设置保存成功
免费模式开启后可以通过任何数据(包括空)登录授权'); + } + die('免费模式设置保存成功'); + } + break; + case 'app_name': + if(!$db->update('sq_apps',array('ID'=>$_POST['appid']),'',array('appname'=>$_POST['status']))){ + die($db->geterror()); + }else{ + die('应用名称设置保存成功'); + } + break; + case 'zqkc': + if(!$db->update('sq_apps',array('ID'=>$_POST['appid']),'',array('cycreduce'=>$_POST['status']))){ + die($db->geterror()); + }else{ + die('周期扣除设置保存成功'); + } + break; + case 'jbkc': + if(!$db->update('sq_apps',array('ID'=>$_POST['appid']),'',array('unbindreduce'=>$_POST['status']))){ + die($db->geterror()); + }else{ + die('解绑扣除设置保存成功'); + } + break; + case 'czmz': + if(!$db->update('sq_apps',array('ID'=>$_POST['appid']),'',array('rechargeface'=>$_POST['status']))){ + die($db->geterror()); + }else{ + die('充值面值设置保存成功'); + } + break; + case 'zxms': + if(!$db->update('sq_apps',array('ID'=>$_POST['appid']),'',array('onlinesecond'=>$_POST['status']))){ + die($db->geterror()); + }else{ + die('在线秒数设置保存成功'); + } + break; + case 'yygg': + if(!$db->update('sq_apps',array('ID'=>$_POST['appid']),'',array('notice'=>$_POST['status']))){ + die($db->geterror()); + }else{ + die('应用公告设置保存成功'); + } + break; + case 'yybb': + if(!$db->update('sq_apps',array('ID'=>$_POST['appid']),'',array('ver'=>$_POST['status']))){ + die($db->geterror()); + }else{ + die('应用版本设置保存成功'); + } + break; + case 'gxrz': + if(!$db->update('sq_apps',array('ID'=>$_POST['appid']),'',array('uplog'=>$_POST['status']))){ + die($db->geterror()); + }else{ + die('更新日志设置保存成功'); + } + break; + case 'gxdz': + if(!$db->update('sq_apps',array('ID'=>$_POST['appid']),'',array('upurl'=>$_POST['status']))){ + die($db->geterror()); + }else{ + die('更新地址设置保存成功'); + } + break; + case 'zdysj': + if(!$db->update('sq_apps',array('ID'=>$_POST['appid']),'',array('data'=>$_POST['status']))){ + die($db->geterror()); + }else{ + die('自定义数据设置保存成功'); + } + break; + default: + die('未知请求模块'); + } + case 'appkey': + $info = $db->select_first_row('sq_apps','connectkey,decryptkey',array('ID'=>$_POST['appid']),''); + die('Connectkey:'.$info['connectkey'].'
Decryptkey:'.$info['decryptkey']); + break; + case 'resetkey': + $txms = rand_str(64); + $jmms = rand_str(64); + $db->update('sq_apps',array('ID'=>$_POST['appid']),'AND',array('decryptkey'=>$jmms,'connectkey'=>$txms)); + die('秘钥重置成功,以下是新秘钥:
Connectkey:'.$txms.'
Decryptkey:'.$jmms); + break; + case 'delapp': + if (empty($_POST['appid'])){ + die('非法提交'); + } + if (!($db->delete('sq_user',array('appid'=>$_POST['appid']),'AND'))){ + echo('用户列表删除失败!
'); + }else{ + echo '应用的用户列表已清空
'; + } + if (!($db->delete('sq_fidlist',array('appid'=>$_POST['appid']),'AND'))){ + echo('商品列表删除失败!
'); + }else{ + echo '应用的商品列表已清空
'; + } + if (!($db->delete('sq_level',array('appid'=>$_POST['appid']),'AND'))){ + echo('代理级别列表删除失败!
'); + }else{ + echo '代理级别列表已清空
'; + } + if (!($db->delete('sq_agent',array('appid'=>$_POST['appid']),'AND'))){ + echo('代理列表删除失败!
'); + }else{ + echo '应用的代理列表已清空
'; + } + if (!($db->delete('sq_token',array('appid'=>$_POST['appid']),'AND'))){ + echo('Token数据清空失败!
'); + }else{ + echo 'Token数据已清空
'; + } + + if (!($db->delete('sq_token',array('appid'=>$_POST['appid']),'AND'))){ + echo('云黑列表清空失败!
'); + }else{ + echo '该应用云黑列表已清空
'; + } + + if (!$db->delete('sq_apps',array('ID'=>$_POST['appid']),'AND')){ + echo('删除失败 '.$db->geterror()); + }else{ + die('应用已成功删除'); + } + + break; + case 'user_applist': + $back = $db->select_all_row('sq_apps','ID,appname',array(),'AND'); + if (count($back) === 0){ + die(); + } + $i = ''; + foreach ($back as $value){ + $i .= ''; + } + die($i); + break; + case 'getgradelist': + $where = array(); + + $backinfo['code'] = 0; + $backinfo['count'] = $db->select_count_row('sq_level',array(),'AND'); + include "../function/function_app.php"; + + if(!$arr = $db->select_limit_row('sq_level','*',($_GET['page'] - 1) * $_GET['limit'] , $_GET['limit'], array(), 'AND')){ + //$backinfo['code'] = -1; + $backinfo['msg'] = $db->geterror(); + die(json_encode($backinfo)); + } + foreach ($arr as $key => $value){ + //$appinfo = app_idgetinfo($value['appid']); + $array = explode(',',$value['appid']); + $appname = ''; + foreach ($array as $appid){ + if ($appname != ''){ + $appname .= ','.app_idgetname($appid); + }else{ + $appname = app_idgetname($appid); + } + } + $arr[$key]['appname'] = $appname; + } + $backinfo['data'] = $arr; + die(json_encode($backinfo)); + break; + case 'getuserlist': + if (empty($_GET['appid'])){ + die(json_encode(array('code'=>'-2','msg'=>'请先选择一个应用(如果应用过多,可点击上方下拉选择框后,输入关键词可快速查找应用)'))); + } + //$where['appid'] = $_GET['appid']; + if (!empty($_GET['search'])){ + $where['username'] = $where['password'] = $where['mac'] = $where['rip'] = $where['lip'] = $where['uqq'] = $where['mail'] = $where['balance'] = $where['rqq'] = $_GET['search']; + //$where['uqq'] = intval($where['uqq']) + if (!is_numeric($where['uqq'])){ + unset($where['uqq']); + } + if (!is_numeric($where['rqq'])){ + unset($where['rqq']); + } + if (!is_numeric($where['balance'])){ + unset($where['balance']); + } + $whereinfo = 'appid='.intval($_GET['appid']).' AND ('. $db->wheretosql($where,'OR').')'; + }else{ + $whereinfo = 'appid='.intval($_GET['appid']); + } + //echo $whereinfo; + $backinfo['code'] = 0; + $backinfo['count'] = $db->select_count_row('sq_user',$whereinfo,'AND'); + include "../function/function_app.php"; + $appinfo = app_idgetinfo($_GET['appid']); + if(!$arr = $db->select_limit_row('sq_user','*',($_GET['page'] - 1) * $_GET['limit'] , $_GET['limit'], $whereinfo, 'AND','ORDER BY ID DESC')){ + //$backinfo['code'] = -1; + $backinfo['msg'] = $db->geterror(); + die(json_encode($backinfo)); + } + + $backinfo['msg'] = ''; + + foreach ($arr as $value){ + $newinfo = array(); + $newinfo['id'] = $value['ID']; + $newinfo['username'] = $value['username']; + $newinfo['password'] = $value['password']; + $newinfo['mac'] = $value['mac']; + $newinfo['lip'] = $value['lip']; + $newinfo['rip'] = $value['rip']; + $newinfo['uqq'] = $value['uqq']; + $newinfo['mail'] = $value['mail']; + $newinfo['rtime'] = Get_Date($value['rtime']); + $newinfo['ltime'] = Get_Date($value['ltime']); + if ($appinfo['usetype'] === 'dqsj'){ + if (!empty($value['balance'])){ + if ($value['balance'] == '-1'){ + $value['balance'] = '永久使用'; + } + $value['balance'] = Get_Date($value['balance']); + }else{ + $value['balance']='-'; + } + } + $newinfo['balance'] = $value['balance']; + $newinfo['rqq'] = htmlspecialchars($value['rqq']); + if ((time()-$value['htime']) < $appinfo['onlinesecond']){ + $online = '在线'; + }else{ + $online = '离线'; + } + $newinfo['login'] = $online; + $newinfo['status'] = ''; + + $newinfo['origin'] = GetOriginText($value['origin']); + + $newinfo['oid'] = $value['oid']; + $backinfo['data'][] = $newinfo; + } + + //print_r($backinfo); + die(json_encode($backinfo)); + + break; + case 'changegrade': + if (empty($_POST['mod'])){ + die('模块标识不能为空'); + } + if (empty($_POST['gid'])){ + die('等级ID不能为空'); + } + if (!$db->update('sq_level',array('ID'=>$_POST['gid']),'AND',array($_POST['mod']=>$_POST['value']))){ + die('修改失败'.$db->geterror()); + }else{ + die('修改成功!'); + } + + break; + case 'changeuser': + if (empty($_POST['mod'])){ + die('模块标识不能为空'); + } + if (empty($_POST['userid'])){ + die('用户ID不能为空'); + } + if ($_POST['mod'] == 'status'){ + $_POST['value'] = textbooltonum($_POST['value']); + } + if ($_POST['mod'] == 'balance'){ + if ($_POST['value'] == '永久使用'){ + $_POST['value'] = -1; + }else{ + $value = strtotime($_POST['value']); + if (!empty($value)){ + $_POST['value'] = $value; + } + } + + } + + if (!$db->update('sq_user',array('ID'=>$_POST['userid']),'AND',array($_POST['mod']=>$_POST['value']))){ + die('修改失败'.$db->geterror()); + }else{ + die('修改成功!'); + } + break; + case 'deluser': + if (empty($_POST['userid'])){ + die('用户ID不能为空'); + } + $db->delete('sq_token',array('uid'=>$_POST['userid']),'AND'); + if (!$db->delete('sq_user',array('ID'=>$_POST['userid']),'AND')){ + die('删除失败'.$db->geterror()); + }else{ + die('删除成功!'); + } + + case 'dl_applist': + $back = $db->select_all_row('sq_apps','ID,appname',array(),'AND'); + if (count($back) === 0){ + die(); + } + $i = ''; + foreach ($back as $value){ + $i .= ''; + } + die($i); + break; + case 'addfid': + $_POST = json_decode($_POST['content'],true); + if(!$db->insert_back_id('sq_fidlist',array('fidname'=>$_POST['fid_name'],'introduce'=>$_POST['fid_introduce'],'appid'=>$_POST['applist'],'buyprice'=>$_POST['fid_price'],'agentprice'=>$_POST['fid_agentprice'],'num'=>$_POST['fid_count'],'openbuy'=>textbooltonum($_POST['openbuy']),'agentbuy'=>textbooltonum($_POST['agentbuy']),'allrechargecard'=>textbooltonum($_POST['keybuy'])))){ + die('添加失败:'.$db->geterror()); + }else{ + die('套餐添加成功!'); + } + break; + case 'getfidlist': + include '../function/function_app.php'; + if(!$result = $db->select_limit_row('sq_fidlist','*',($_GET['page'] - 1) * $_GET['limit'] , $_GET['limit'], array(), 'AND')){ + + $backinfo['msg'] = $db->geterror(); + $backinfo['code'] = $backinfo['msg'] == ''? 0 : -1; + die(json_encode($backinfo)); + }else{ + $info = ''; + $backinfo['code'] = 0; + $backinfo['msg'] = ''; + $backinfo['count'] = $db->select_count_row('sq_fidlist'); + foreach ($result as $value){ + $value['appname'] = app_idgetname($value['appid']); + $value['openbuy'] = ''; + $value['agentbuy'] = ''; + $value['allrechargecard'] = ''; + $backinfo['data'][] = $value; + } + die(json_encode($backinfo)); + } + break; + case 'changefid': + if (empty($_POST['mod'])){ + die('模块标识不能为空'); + } + if (empty($_POST['fid'])){ + die('分类ID不能为空'); + } + if ($_POST['mod'] == 'openbuy'){ + $_POST['value'] = textbooltonum($_POST['value']); + } + if ($_POST['mod'] == 'agentbuy'){ + $_POST['value'] = textbooltonum($_POST['value']); + } + if ($_POST['mod'] == 'allrechargecard'){ + $_POST['value'] = textbooltonum($_POST['value']); + } + if ($_POST['mod'] == 'balance'){ + $value = strtotime($_POST['value']); + if (!empty($value)){ + $_POST['value'] = $value; + } + } + if (!$db->update('sq_fidlist',array('ID'=>$_POST['fid']),'AND',array($_POST['mod']=>$_POST['value']))){ + die('修改失败'.$db->geterror()); + }else{ + die('修改成功!'); + } + break; + case 'delfid': + $db->delete('sq_fidkey',array('fid'=>$_POST['fid']),'AND'); + if(!$db->delete('sq_fidlist',array('ID'=>$_POST['fid']),'AND')){ + die('删除失败:'.$db->geterror()); + }else{ + die('分类删除成功!'); + } + break; + case 'addgrade': + if(!$db->insert_back_id('sq_level',array('lname'=>$_POST['grade_name'],'appid'=>$_POST['app'],'fracture'=>$_POST['grade_present'],'price'=>$_POST['grade_price'],'discount'=>'1'))){ + die('添加失败:'.$db->geterror()); + }else{ + die('代理级别添加成功!'); + } + break; + case 'getgrideinfo': + if (empty($_POST['id'])){ + die('级别为空,无法加载'); + } + if (!$result = $db->select_first_row('sq_level','*',array('ID'=>$_POST['id']),'AND')){ + die('数据库错误:'.$db->geterror()); + } + die(json_encode(array( + 'grade_name'=>$result['lname'], + 'grade_present'=>$result['fracture'], + 'grade_price'=>$result['price'], + ))); + break; + case 'getlevallist': + include '../function/function_app.php'; + $list = ''; + $back = $db->select_all_row('sq_level','ID,lname',array(),'AND'); + if (!empty($_POST['aid'])){ + $info = $db->select_first_row('sq_agent','levelid',array('ID'=>$_POST['aid']),'AND'); + print_r($info); + $lid = $info['levelid']; + } + //echo $lid; + foreach ($back as $value){ + $list.=''; + } + die($list); + break; + case 'addagent': + if ($db->select_first_row('sq_agent','*',array('username'=>$_POST['agent_name']),'AND') != false){ + die('该代理账号已经存在,请尝试其他用户名'); + } + if(!$db->insert_back_id('sq_agent',array('username'=>$_POST['agent_name'],'password'=>$_POST['agent_pass'],'money'=>$_POST['agent_money'],'levelid'=>$_POST['agent_leval'],'begintime'=>time(),'status'=>'1','loginip'=>'-','qq'=>$_POST['agent_qq']))){ + die('添加失败:'.$db->geterror()); + }else{ + die('代理添加成功!'); + } + break; + case 'getagentlist': + include '../function/function_app.php'; + if(!$result = $db->select_limit_row('sq_agent','*',($_GET['page'] - 1) * $_GET['limit'] , $_GET['limit'], array(), 'AND')){ + + $backinfo['code'] = -1; + $backinfo['msg'] = $db->geterror(); + if(empty($backinfo['msg'])){ + $backinfo['code'] = 0; + } + die(json_encode($backinfo)); + }else{ + $info = ''; + $backinfo['code'] = 0; + $backinfo['msg'] = ''; + $backinfo['count'] = $db->select_count_row('sq_agent'); + foreach ($result as $value){ + if ($value['logintime'] == 0){ + $value['logintime'] = '-'; + } + $value['begintime'] = Get_Date($value['begintime']); + $value['logintime'] = Get_Date($value['logintime']); + $value['levelname'] = level_idgetname($value['levelid']); + $value['status'] = ''; + $backinfo['data'][] = $value; + } + die(json_encode($backinfo)); + } + break; + case 'coldagent': + if (!$db->update('sq_agent',array('ID'=>$_POST['agentid']),'AND',array('status'=>0))){ + die('冻结失败'.$db->geterror()); + }else{ + die('冻结成功!'); + } + break; + case 'uncoldagent': + if (!$db->update('sq_agent',array('ID'=>$_POST['agentid']),'AND',array('status'=>1))){ + die('解冻失败'.$db->geterror()); + }else{ + die('解冻成功!'); + } + break; + case 'getagentinfo': + $result = $db->select_first_row('sq_agent','*',array('ID'=>$_POST['id']),'AND'); + die(json_encode(array( + 'agent_leval'=>$result['levelid'], + 'agent_money'=>$result['money'], + 'agent_name'=>$result['username'], + 'agent_pass'=>$result['password'] + + ))); + break; + case 'changeagent': +// if (!$db->update('sq_agent',array('ID'=>$_POST['id']),'AND',array('username'=>$_POST['agent_name'],'password'=>$_POST['agent_pass'],'money'=>$_POST['agent_money'],'levelid'=>$_POST['agent_leval'],'begintime'=>time(),'status'=>'1','loginip'=>'-'))){ +// die('修改失败'.$db->geterror()); +// }else{ +// die('修改成功!'); +// } + if (empty($_POST['mod'])){ + die('模块标识不能为空'); + } + if (empty($_POST['aid'])){ + die('代理ID不能为空'); + } + if ($_POST['mod'] == 'status') $_POST['value'] = textbooltonum($_POST['value']); + if (!$db->update('sq_agent',array('ID'=>$_POST['aid']),'AND',array($_POST['mod']=>$_POST['value']))){ + die('修改失败'.$db->geterror()); + }else{ + die('修改成功!'); + } + break; + case 'delgrade': + if (empty($_POST['gid'])){ + die('非法提交'); + } + $db->delete('sq_agent',array('levelid'=>$_POST['gid']),'AND'); + if (!$db->delete('sq_level',array('ID'=>$_POST['gid']),'AND')){ + die('删除失败 '.$db->geterror()); + }else{ + die('删除代理级别成功'); + } + break; + case 'delagent': + if (empty($_POST['aid'])){ + die('非法提交'); + } + if (!$db->delete('sq_agent',array('ID'=>$_POST['aid']),'AND')){ + die('删除失败 '.$db->geterror()); + }else{ + die('删除代理成功'); + } + break; + case 'saveepayset': + updateset('pay_domain',$_POST['pay_domain']); + updateset('epay_pid',$_POST['epay_pid']); + updateset('epay_key',$_POST['epay_key']); + updateset('epay_againcheck',textbooltonum($_POST['epay_againcheck'])); + die('修改成功!'); + break; + case 'savesysset': + updateset('alipaytype',$_POST['alipaytype']); + updateset('qqpaytype',$_POST['qqpaytype']); + updateset('wxpaytype',$_POST['wxpaytype']); + updateset('kqxt',textbooltonum($_POST['kqxt'])); + updateset('yjtx',textbooltonum($_POST['yjtx'])); + updateset('xtsy',textbooltonum($_POST['xtsy'])); + die('修改成功!'); + break; + case 'getsysset': + + die(json_encode($G['config'])); + break; + case 'savesignset': + updateset('alipay_id',$_POST['alipay_id']); + updateset('alipay_rsa',$_POST['alipay_rsa']); + updateset('alipay_pkey',$_POST['alipay_pkey']); + updateset('tenpay_id',$_POST['tenpay_id']); + updateset('qqpay_key',$_POST['qqpay_key']); + die('修改成功!'); + break; + case 'savesiteinfo': + updateset('sitename',$_POST['sitename']); + updateset('adminqq',$_POST['adminqq']); + updateset('adminmail',$_POST['adminmail']); + updateset('beian',$_POST['beian']); + updateset('weburl',$_POST['weburl']); + die('保存成功'); + break; + case 'addadmin': + if (empty($_POST['addusername']) || empty($_POST['adduserpass']) || empty($_POST['adduserqq'])){ + die('数据不能为空,请检查'); + } + $db->insert_back_id('sq_admin',array('username'=>$_POST['addusername'],'password'=>md5($_POST['adduserpass']),'qq'=>$_POST['adduserqq'])); + die('管理员新增成功,如果需要删除请进数据库中的表sq_admin进行删除'); + break; + case 'sendtestmail': + $T['title'] = '测试邮件'; + $T['content'][] = '收到此邮件表示您的配置正常可用!'; + $MailTips[] = $T; + + if (!SendTipsMail($G['config']['adminmail'],$MailTips,$back)){ + die('请求超时或返回的数据解析失败:'.$back); + }else{ + die('邮件已发送至您开通授权时候设置的站长邮箱,请检查收件箱和垃圾箱是否已收到文件'); + } + break; + case 'savemailset': + updateset('smtp_address',$_POST['smtp_address']); + updateset('smtp_port',$_POST['smtp_port']); + updateset('smtp_user',$_POST['smtp_user']); + updateset('smtp_pass',$_POST['smtp_pass']); + die('保存成功'); + break; + case 'savenotice': + updateset('agentnotice',$_POST['agentnotice']); + updateset('mainnav',$_POST['mainnav']); + updateset('maindrawer',$_POST['maindrawer']); + die('保存成功'); + break; + case 'creatkey': + $count = $_POST['sc_count']; + if ($count <= 0){ + die(json_encode(array('code'=>'-1','msg'=>'生成的数量不能为空或者0或者负数'))); + } + $time = time(); + $money = $_POST['sc_money']; + if ($money <= 0){ + die(json_encode(array('code'=>'-1','msg'=>'卡密金额不能为空或者0或者负数'))); + } + $keylist=''; + for ($x=1; $x<=$_POST['sc_count']; $x++) { + $key = substr($time,0,6).'-'.rand_str(6).'-'.rand_str(6).'-'.rand_str(6).'-'.rand_str(6).'-'.$money; + $insarray[] = "'{$key}','{$time}','0','{$money}','{$money}','0','1'"; + $keylist .= '
'.$key; + } + $sign = rand_str(32); + $_SESSION['cards'][$sign] = str_replace('
',"\r\n",$keylist); + if(!$num = $db->insert_back_row('sq_key',array('kami','creattime','firstusetime','allmoney','lastmoney','lastusetime','status'),$insarray)){ + die(json_encode(array('code'=>'-1','msg'=>'数据库错误:'.$db->geterror()))); + }else{ + die(json_encode(array('code'=>'1','sign'=>$sign,'keys'=>'您的卡密如下:'.$keylist))); + } + break; + case 'download': + if (empty($_SESSION['cards'][$_GET['sign']])){ + die('该Sign不存在或者已过期,无法下载卡密'); + }else{ + $filename = $_GET['sign'].".txt"; + header('Content-Type:text/plain'); //指定下载文件类型 + header('Content-Disposition: attachment; filename="'.$filename.'"'); //指定下载文件的描述 + header('Content-Length:'.strlen($_SESSION['cards'][$_GET['sign']])); //指定下载文件的大小 + die($_SESSION['cards'][$_GET['sign']]); + } + break; + case 'getkeylist': + $where = array(); + if (!empty($_GET['search'])){ + $where['kami'] = $_GET['search']; + } + $backinfo['code'] = 0; + $backinfo['count'] = $db->select_count_row('sq_key',$where,'AND'); + if(!$arr = $db->select_limit_row('sq_key','*',($_GET['page'] - 1) * $_GET['limit'] , $_GET['limit'], $where, 'AND','ORDER BY ID DESC')){ + $backinfo['msg'] = $db->geterror(); + die(json_encode($backinfo)); + } + foreach ($arr as $key => $value){ + if ($value['creattime'] == 0){ + $arr[$key]['creattime'] = '-'; + }else{ + $arr[$key]['creattime'] = Get_Date($value['creattime']); + } + + if ($value['firstusetime'] == 0){ + $arr[$key]['firstusetime'] = '-'; + }else{ + $arr[$key]['firstusetime'] = Get_Date($value['firstusetime']); + } + if ($value['lastusetime'] == 0){ + $arr[$key]['lastusetime'] = '-'; + }else{ + $arr[$key]['lastusetime'] = Get_Date($value['lastusetime']); + } + $arr[$key]['status'] = ''; + } + $backinfo['data'] = $arr; + die(json_encode($backinfo)); + break; + case 'keystatus': + if (empty($_POST['keyid'])){ + die(makejson(-1,'keyid不能为空')); + } + if(!$db->update('sq_key',array('ID'=>$_POST['keyid']),'AND',array('status'=>textbooltonum($_POST['status'])))){ + die(makejson(-2,'修改失败或者没有任何更改'.$db->geterror())); + }else{ + die(makejson(1,'状态保存成功')); + } + case 'sitelog': + $backinfo['pages'] = ceil($db->select_count_row('sq_log_system')/50); + $backinfo['data'] = array(); + if (!$result = $db->select_limit_row('sq_log_system','*',($_GET['page']-1)*50,50,'',''," ORDER BY time DESC")){ + $backinfo['data'][] = $db->geterror(); + die(json_encode($backinfo)); + } + foreach ($result as $value){ + $new['content'] = $value['msg']; + $new['time'] = Get_Date($value['time']); + switch ($value['type']){ + case 'success': + $new['icon'] = 'စ'; + $new['color'] = 'green'; + break; + case 'info': + $new['icon'] = ''; + $new['color'] = 'blue'; + break; + case 'warning': + $new['icon'] = ''; + $new['color'] = 'yellow'; + break; + case 'danger': + $new['icon'] = 'ဇ'; + $new['color'] = 'red'; + break; + default: + $new['icon'] = ''; + $new['color'] = 'blue'; + break; + } + $backinfo['data'][] = $new; + } + die(json_encode($backinfo)); + break; + case 'coldkey': + if (!$db->update('sq_key',array('ID'=>$_POST['keyid']),'AND',array('status'=>0))){ + die('冻结失败'.$db->geterror()); + }else{ + die('冻结成功!'); + } + break; + case 'uncoldkey': + if (!$db->update('sq_key',array('ID'=>$_POST['keyid']),'AND',array('status'=>1))){ + die('解冻失败'.$db->geterror()); + }else{ + die('解冻成功!'); + } + break; + case 'delkey': + if (empty($_POST['keyid'])){ + die(makejson(-1,'卡密ID不能为空')); + } + if (!$db->delete('sq_key',array('ID'=>$_POST['keyid']),'AND')){ + die(makejson(-2,'删除失败 '.$db->geterror())); + }else{ + die(makejson(1,'删除成功!')); + } + break; + case 'gettradelist': + $where = array(); + if (!empty($_GET['search'])){ + $where['tradeno'] = $where['name'] = $where['user'] = $where['mail'] = $where['kami'] = $_GET['search']; + } + $backinfo['code'] = 0; + $backinfo['count'] = $db->select_count_row('sq_trade',$where,'OR'); + if(!$arr = $db->select_limit_row('sq_trade','*',($_GET['page'] - 1) * $_GET['limit'] , $_GET['limit'], $where, 'OR','ORDER BY ID DESC')){ + $backinfo['msg'] = $db->geterror(); + die(json_encode($backinfo)); + } + foreach ($arr as $key => $value){ + if ($value['begintime'] == 0){ + $arr[$key]['begintime'] = '-'; + }else{ + $arr[$key]['begintime'] = Get_Date($value['begintime']); + } + if ($value['overtime'] == 0){ + $arr[$key]['overtime'] = '-'; + }else{ + $arr[$key]['overtime'] = Get_Date($value['overtime']); + } + if ($value['paytype'] == 'zxzf'){ + switch ($value['onlinepaytype']){ + case 'zfb': + $arr[$key]['paytype'] = '支付宝'; + break; + case 'wx': + $arr[$key]['paytype'] = '微信'; + break; + case 'qq': + $arr[$key]['paytype'] = 'QQ钱包'; + break; + default: + $arr[$key]['paytype'] = '异常?'; + break; + } + }else if ($value['paytype'] == 'czkm'){ + $arr[$key]['paytype'] = '余额卡密'; + }else if ($value['paytype'] == 'yezf'){ + $arr[$key]['paytype'] = '代理余额'; + }else{ + $arr[$key]['paytype'] = '异常?'; + } + if ($value['status'] == 1){ + $arr[$key]['status'] = '等待付款'; + $button = ''; + }else if ($value['status'] == 2){ + $arr[$key]['status'] = '等待验证'; + $button = ''; + }elseif ($value['status'] == 3){ + $button = ''; + $arr[$key]['status'] = '完成'; + }else{ + $arr[$key]['status'] = '异常'; + } + $arr[$key]['tools'] = $button.''; + } + $backinfo['data'] = $arr; + die(json_encode($backinfo)); + break; + + case 'suppletrade': + if (!$tradeinfo = $db->select_first_row('sq_trade','*',array('ID'=>$_POST['id']),'AND')){ + die('无法找到订单信息!'); + } + $tradeno = $tradeinfo['tradeno']; + if ($tradeinfo['status'] == '3'){ + die('该订单已完成,无需补单!'); + } + $db->update('sq_trade',array('ID'=>$_POST['id']),'AND',array('status'=>3)); + $tradeinfo['status'] = 2; + include '../function/trade.inc.php'; + $back = trade_do($tradeinfo); + //print_r($back); + $back = json_decode($back,true); + if ($back['code'] == 2){ + die('成功生成卡密:'.$back['kami']); + } + + die($back['msg']); + break; + case 'deltrade': + if (!$db->delete('sq_trade',array('ID'=>$_POST['id']),'AND')){ + die('订单删除失败'.$db->geterror()); + }else{ + die('订单删除成功!'); + } + break; + case 'clearalltradeid': + $limit = time() - 3600; + if (!$db->delete('sq_trade','begintime<'.$limit,'AND')){ + die('订单删除失败'.$db->geterror()); + }else{ + die('订单删除成功!'); + } + break; + case 'clearnopay': + $limit = time() - 3600; + if (!$db->delete('sq_trade','begintime<'.$limit.' AND status <> 2 AND status <> 3','AND')){ + die('订单删除失败'.$db->geterror()); + }else{ + die('订单删除成功!'); + } + break; + case 'clearbeenpay': + $limit = time() - 3600; + if (!$db->delete('sq_trade',array('status'=>3),'AND')){ + die('订单删除失败'.$db->geterror()); + }else{ + die('订单删除成功!'); + } + break; + case 'changepassword': + //die('本站点禁止修改密码'); + if (empty($_POST['oldpass']) || empty($_POST['newpass']) || empty($_POST['renewpass'])){ + die('请填写完所有数据!'); + } + if ($_POST['newpass'] != $_POST['renewpass']){ + die('两次输入的密码一样,无法修改!'); + } + if (!$agentinfo = $db->select_first_row('sq_admin','*',array('username'=>$_SESSION['admin_username']),'AND')){ + die('管理员信息获取失败'); + } + if (md5($_POST['oldpass']) !== $agentinfo['password']){ + die('输入的原密码错误,无法修改!'); + } + + if(!$db->update('sq_admin',array('username'=>$_SESSION['admin_username']),'AND',array('password'=>md5($_POST['newpass'])))){ + die('密码修改失败,服务器内部发生错误'); + }else{ + die('管理密码修改成功,请使用新密码进行登录!'); + } + + break; + case 'checkupdate': + $newver = curl_request('http://download.bwenquan.com/update/shouquanver.txt'); + + if ($newver > $G['siteinfo']['ver'] ){ + die('1'); + }else{ + die('-1'); + } + + break; + case 'downloadupdatepacks': + set_time_limit(0); + if(!getFile('http://download.wenquan6.cn/upload/shouquan/'.$G['siteinfo']['ver'].'.zip','../update/',$G['siteinfo']['ver'].'.zip')){ + die(json_encode(array('code'=>'-1','msg'=>'下载文件失败!'))); + }else{ + die(json_encode(array('code'=>'1'))); + } + break; + case 'unzippacks': + set_time_limit(0); + if (!file_exists('../update/'.$G['siteinfo']['ver'].'.zip')){ + die(json_encode(array('code'=>'-1','msg'=>'更新包文件不存在,无法解压'))); + } + get_zip_originalsize('../update/'.$G['siteinfo']['ver'].'.zip','../update/'); + die(json_encode(array('code'=>'1','updateurl'=>'../../update/'.$G['siteinfo']['ver'].'/install.php'))); + break; + case 'keylog': + if (!$result = $db->select_limit_row('sq_log_kami','*','',0,array('keyid'=>$_POST['keyid']),'AND',"ORDER BY time DESC")){ + die(makejson(-1,'数据库中没有记录')); + } + + die(makejson(1,'success',array('items'=>$result))); + break; + case 'loadbuybody': + include "../function/function_app.php"; + if(!$appinfo = app_idgetinfo($_POST['appid'])){ + die(); + } + + $output = ''; + //$output = '
'; + if ($appinfo['logintype'] == 'zhmm'){ + $output .= ' +
+ +
+ +
+
+ +
+ +
+ +
+
+ '; + $type = 1; + }else if ($appinfo['logintype'] == 'kmsq'){ + $output .= ' +
+ +
+ +
+
'; + $type = 2; + }else if ($appinfo['logintype'] == 'jcbd'){ + if ($appinfo['bindqq'] == '1'){ + $output .= ' +
+ +
+ +
+
+ '; + } + if ($appinfo['bindmac'] == '1'){ + $output .= '
+ +
+ +
+
+ '; + } + if ($appinfo['bindip'] == '1'){ + $output .= '
+ +
+ +
+
+ '; + } + $type = 3; + } + + + $output .= '
+ +
+ +
如果是余额方式则为余额点数,如果是到期时间方式则为分钟数量(1天=1440,30天=43200,180天=259200,365天=525600),不限授权请填-1
+
+ +
+ +
+ +
+ +
+
+
+ +
+ +
+
+'; + + die($output); + break; + case 'buy_submit': + include "../function/function_app.php"; + $_POST = json_decode($_POST['content'],true); + if (!$appinfo = app_idgetinfo($_POST['id'])){ + die('应用信息获取失败'); + } + if (empty($_POST['kt_adminqq'])){ + die('用户QQ不能为空'); + } + if (empty($_POST['kt_mail'])){ + die('用户邮箱不能为空'); + } + if (empty($_POST['kt_num'])){ + die('开通的数量不能为空'); + } + $balance = $_POST['kt_num']; + include '../function/function_auth.php'; + if ($appinfo['logintype'] == 'jcbd'){ + $_POST['kt_user'] = json_encode(array( + 'lip'=>$_POST['kt_ip'], + 'rqq'=>$_POST['kt_robotqq'], + 'mac'=>$_POST['kt_mac'] + )); + } + if (empty($_POST['kt_pass'])){ + $_POST['kt_pass'] = ''; + } + $back = auth_add($_POST['kt_user'],$_POST['kt_pass'],'',$_POST['kt_num'],$_POST['kt_adminqq'],$_POST['kt_mail'],$_POST['id'],1,$_SESSION['admin_id'],$newkey,$tips,array()); + if ($back == 3){ + die('成功生成卡密:'.$newkey); + }else if ($back == 1){ + die('授权开通成功'); + }else if ($back == 2){ + die('授权续费成功'); + }else{ + die($tips); + } + break; + case 'agentlog': + if (!$result = $db->select_limit_row('sq_log_agent','*','',0,array('aid'=>$_POST['aid']),'AND',"ORDER BY time DESC")){ + die('数据库中没有记录!'); + } + foreach ($result as $value){ + echo '['.Get_Date($value['time']).'] '.$value['msg'].'
'; + } + echo '=======================
'; + die('只列出最近五十条记录,若想查看更多,请前往数据库执行这行语句查询:[SELECT * FROM sq_log_agent WHERE aid='.$_POST['agentid'].']'); + break; + case 'saveintroduce': + if (!$db->update('sq_apps',array('ID'=>$_POST['appid']),'AND',array('introduce'=>$_POST['content']))){ + die("保存失败".$db->geterror()); + }else{ + die('保存成功'); + } + case 'introduce': + if(!$appinfo = $db->select_first_row('sq_apps','introduce',array('ID'=>$_POST['appid']),'AND')){ + die('服务器内部错误'); + }else{ + die($appinfo['introduce']); + } + case 'upload': + $upload_dir = './img/apps/'; + + if(strtolower($_SERVER['REQUEST_METHOD']) != 'post'){ + die('错误的请求'); + } + + if(array_key_exists('file',$_FILES) && $_FILES['file']['error'] == 0 ){ + $pic = $_FILES['file']; + $pic['name'] = time().'.png'; + if(move_uploaded_file($pic['tmp_name'], '.'.$upload_dir.$pic['name'])){ + if(!$db->update('sq_apps',array('ID'=>$_GET['appid']),'AND',array('imgsrc'=>$upload_dir.$pic['name']))){ + die($db->geterror()); + } + die(json_encode(array('code'=>0,'msg'=>'更换成功'))); + } + } + + die(json_encode(array('code'=>0,'msg'=>$_FILES['file']['error'])));; + case 'imgsrc': + if(!$info = $db->select_first_row('sq_apps','imgsrc',array('ID'=>$_POST['appid']),'AND')){ + die($db->geterror()); + } + if (empty($info['imgsrc'])){ + $info['imgsrc'] = './mdl/dog.png'; + } + die('../.'.$info['imgsrc']); + case 'gradelist': + + include '../function/function_app.php'; + $result = $db->select_all_row('sq_level','*','',''); + $data['gradelist_op'] = ''; + $data['gradelist_ad'] = ''; + //print_r($result); + foreach ($result as $info){ + $appname = $info['appid'] == 0 ? '代理所有应用' : app_idgetname($info['appid']); + + $data['gradelist_op'] .= ''; + + $data['gradelist_ad'] .= ''; + } + die(json_encode($data)); + break; + + case 'setlevel': + if ($_POST['lid'] == 0){ + die('请先选择需要设置的级别'); + } + if ($_POST['present'] == 0){ + echo '请注意:您设置了折率为0意味着该等级的代理可以任意免费开通选中等级的代理!
'; + } + if(!$db->update('sq_level',array('ID'=>$_POST['lid']),'AND',array('subordinate'=>$_POST['info'],'discount'=>$_POST['present']))){ + die('数据更新失败:'.$db->geterror()); + }else{ + die('数据保存成功!'); + } + break; + case 'getsetlevel': + if ($_POST['lid'] == 0){ + die(json_encode(array('present'=>'','info'=>''))); + } + $info = $db->select_first_row('sq_level','discount,subordinate',array('ID'=>$_POST['lid']),'AND'); + die(json_encode(array('present'=>$info['discount'],'info'=>$info['subordinate']))); + break; + case 'getnotice': + die(curl_request('http://download.bwenquan.com/update/sqnotice.txt')); + break; + case 'getuplog': + die(curl_request('http://download.bwenquan.com/update/squpdatelog.txt')); + break; + case 'gettoken': + $result = $db->select_first_row('sq_admin','accesstoken',array('username'=>$_SESSION['admin_username'],'password'=>$_SESSION['admin_password']),'AND'); + die($result['accesstoken']); + break; + case 'resettoken': + $token = rand_str(64); + $result = $db->update('sq_admin',array('username'=>$_SESSION['admin_username'],'password'=>$_SESSION['admin_password']),'AND',array('accesstoken'=>$token)); + die($token); + break; + case 'getbclist': + + if(!$result = $db->select_limit_row('sq_bclist','*',($_GET['page'] - 1) * $_GET['limit'] , $_GET['limit'], array(), 'AND')){ + + $backinfo['msg'] = $db->geterror(); + if ($backinfo['msg'] == ''){ + $backinfo['code'] = 0; + } + die(json_encode($backinfo)); + }else{ + include_once '../function/function_app.php'; + $info = ''; + $backinfo['code'] = 0; + $backinfo['msg'] = ''; + $backinfo['count'] = $db->select_count_row('sq_bclist'); + foreach ($result as $value){ + if ($value['appid'] == 0){ + $value['app'] = '所有应用'; + }else{ + $value['app'] = app_idgetname($value['appid']); + } + $value['time'] = Get_Date($value['time']); + $backinfo['data'][] = $value; + } + + + die(json_encode($backinfo)); + } + break; + case 'addbc': + + if (empty($_POST['appid'])){ + $_POST['appid'] = '0'; + } + if (empty($_POST['obj'])){ + die(json_encode(array('code'=>-1,'msg'=>'拉黑对象不能为空'))); + } + if ($db->select_first_row('sq_bclist','ID',array('obj'=>$_POST['obj'],'appid'=>$_POST['appid']),'AND') != false){ + die(json_encode(array('code'=>-2,'msg'=>'拉黑对象已存在于黑名单中'))); + } + $_POST['time'] = time(); + $_POST['uid'] = $_SESSION['admin_username']; + if(!$db->insert_back_id('sq_bclist',$_POST)){ + die(json_encode(array('code'=>-3,'msg'=>$db->geterror()))); + }else{ + die(json_encode(array('code'=>1,'msg'=>'添加成功'))); + } + + break; + case 'vaptcha': + + updateset('opencode',$_POST['vaptcha_open']); + updateset('codevid',$_POST['vaptcha_id']); + updateset('codekey',$_POST['vaptcha_key']); + die('修改成功'); + break; + case 'delbc': + if (!$db->delete('sq_bclist',array('ID'=>$_POST['id']),'AND')){ + die(json_encode(array('code'=>-1,'msg'=>'删除失败'.$db->geterror()))); + }else{ + die(json_encode(array('code'=>1,'msg'=>'删除成功'))); + } + break; + case 'KeyOperation': + switch ($_POST['operation']){ + case 'ExportNoUse': + $result = $db->select_all_row('sq_key','kami',array('firstusetime'=>0,'status'=>1)); + $keylist = ''; + foreach ($result as $value){ + $keylist .= $value['kami']."\r\n"; + } + if (empty($keylist)){ + die(makejson(-4,'导出失败,没有符合的卡密')); + } + $sign = rand_str(32); + $_SESSION['cards'][$sign] = $keylist; + die(makejson(1,'success',array('sign'=>$sign))); + break; + case 'ExportNoMoney': + $result = $db->select_all_row('sq_key','kami',array('lastmoney'=>0,'status'=>1)); + $keylist = ''; + foreach ($result as $value){ + $keylist .= $value['kami']."\r\n"; + } + if (empty($keylist)){ + die(makejson(-4,'导出失败,没有符合的卡密')); + } + $sign = rand_str(32); + $_SESSION['cards'][$sign] = $keylist; + die(makejson(1,'success',array('sign'=>$sign))); + break; + case 'ExportAll': + $result = $db->select_all_row('sq_key','kami'); + $keylist = ''; + foreach ($result as $value){ + $keylist .= $value['kami']."\r\n"; + } + if (empty($keylist)){ + die(makejson(-4,'导出失败,没有符合的卡密')); + } + $sign = rand_str(32); + $_SESSION['cards'][$sign] = $keylist; + die(makejson(1,'success',array('sign'=>$sign))); + break; + case 'DelNoMoney': + $db->delete('sq_key',array('lastmoney'=>0),'AND'); + + die(makejson(2,'success',array('nums'=>$db->affected_num()))); + break; + case 'DelNoUse': + $db->delete('sq_key',array('firstusetime'=>0),'AND'); + die(makejson(2,'success',array('nums'=>$db->affected_num()))); + break; + case 'DelAll': + $db->delete('sq_key',array('1'=>'1'),'AND'); + die(makejson(2,'success',array('nums'=>$db->affected_num()))); + break; + default: + die(makejson(-1,'未知操作:'.$_POST['operation'])); + } + break; + case 'fidlist_show': + include_once '../function/function_app.php'; + $res = $db->select_all_row('sq_fidlist'); + $str = ''; + foreach ($res as $info){ + $str .=''; + } + die($str); + break; + case 'creatfidkey': + $count = $_POST['sc_count']; + if ($count <= 0){ + die(json_encode(array('code'=>'-1','msg'=>'生成的数量不能为空或者0或者负数'))); + } + $time = time(); + if ($count <= 0){ + die(json_encode(array('code'=>'-1','msg'=>'卡密金额不能为空或者0或者负数'))); + } + $keylist=''; + for ($x=1; $x<=$_POST['sc_count']; $x++) { + $key = substr($time,0,6).'-'.rand_str(6).'-'.rand_str(6).'-'.rand_str(6).'-'.rand_str(6).rand_str(6); + $insarray[] = "'{$key}','{$time}','0','{$_POST['sc_fid']}','1'"; + $keylist .= '
'.$key; + } + $sign = rand_str(32); + $_SESSION['cards'][$sign] = str_replace('
',"\r\n",$keylist); + if(!$num = $db->insert_back_row('sq_fidkey',array('kami','creattime','usetime','fid','status'),$insarray)){ + die(json_encode(array('code'=>'-1','msg'=>'数据库错误:'.$db->geterror()))); + }else{ + die(json_encode(array('code'=>'1','sign'=>$sign,'keys'=>'您的卡密如下:'.$keylist))); + } + break; + case 'gettckeylist': + $where = array(); + if (!empty($_GET['search'])){ + $where['kami'] = $_GET['search']; + } + $where['fid'] = $_GET['fid']; + $backinfo['code'] = 0; + $backinfo['count'] = $db->select_count_row('sq_fidkey',$where,'AND'); + if(!$arr = $db->select_limit_row('sq_fidkey','*',($_GET['page'] - 1) * $_GET['limit'] , $_GET['limit'], $where, 'AND','ORDER BY ID DESC')){ + $backinfo['msg'] = $db->geterror(); + die(json_encode($backinfo)); + } + foreach ($arr as $key => $value){ + if ($value['creattime'] == 0){ + $arr[$key]['creattime'] = '-'; + }else{ + $arr[$key]['creattime'] = Get_Date($value['creattime']); + } + + if ($value['usetime'] == 0){ + $arr[$key]['usetime'] = '-'; + }else{ + $arr[$key]['usetime'] = Get_Date($value['usetime']); + } + + $arr[$key]['status'] = ''; + } + $backinfo['data'] = $arr; + die(json_encode($backinfo)); + + break; + case 'FidKeyOperation': + switch ($_POST['operation']){ + case 'ExportNoUse': + $result = $db->select_all_row('sq_fidkey','kami',array('usetime'=>0,'status'=>1,'fid'=>$_POST['fid']),'AND'); + $keylist = ''; + foreach ($result as $value){ + $keylist .= $value['kami']."\r\n"; + } + if (empty($keylist)){ + die('没有符合要求的卡密'); + } + $sign = rand_str(32); + $_SESSION['cards'][$sign] = $keylist; + die('您的卡密已就绪,点击这里下载卡密'); + break; + case 'ExportAll': + $result = $db->select_all_row('sq_fidkey','kami',array('fid'=>$_POST['fid'],'status'=>1)); + $keylist = ''; + foreach ($result as $value){ + $keylist .= $value['kami']."\r\n"; + } + if (empty($keylist)){ + die('没有符合要求的卡密'); + } + $sign = rand_str(32); + $_SESSION['cards'][$sign] = $keylist; + die('您的卡密已就绪,点击这里下载卡密'); + break; + case 'DelNoUse': + $db->delete('sq_fidkey',array('usetime'=>0,'fid'=>$_POST['fid'],'status'=>1),'AND'); + die('成功删除'.(int)$db->affected_num().'行'); + break; + case 'DelAll': + $db->delete('sq_fidkey',array('fid'=>$_POST['fid']),'AND'); + die('成功删除'.(int)$db->affected_num().'行'); + break; + case 'DelUse': + $db->delete('sq_fidkey', '`usetime` > 0 AND `fid` = '.$_POST['fid'].' AND `aid` = '.$_SESSION['agent_id'].' AND `status` = 1','AND'); + die('成功删除'.(int)$db->affected_num().'行'); + break; + } + break; + case 'deltckey': + if (empty($_POST['keyid'])){ + die('非法提交'); + } + if (!$db->delete('sq_fidkey',array('ID'=>$_POST['keyid']),'AND')){ + die('删除失败 '.$db->geterror()); + }else{ + die('删除成功!'); + } + break; + case 'tckeystatus': + if(!$db->update('sq_fidkey',array('ID'=>$_POST['keyid']),'AND',array('status'=>textbooltonum($_POST['status'])))){ + die('更新失败'.$db->geterror()); + }else{ + die('成功'); + } + break; + case 'retoken': + $new = rand_str(128); + updateset('token',$new); + die($new); + break; + default: + die('What the fuck'); +} +function get_zip_originalsize($filename, $path) {//解压zip文件 + $resource = zip_open($filename); + while ($dir_resource = zip_read($resource)) { + if (zip_entry_open($resource,$dir_resource)) { + $file_name = $path.zip_entry_name($dir_resource); + $file_path = substr($file_name,0,strrpos($file_name, "/")); + if(!is_dir($file_path)){ + mkdir($file_path,0777,true); + } + if(!is_dir($file_name)){ + $file_size = zip_entry_filesize($dir_resource); + $file_content = zip_entry_read($dir_resource,$file_size); + file_put_contents($file_name,$file_content); + } + zip_entry_close($dir_resource); + } + } + zip_close($resource); +} + +function getFile($url, $save_dir = '', $filename = '', $type = 0) { + if (trim($url) == '') { + return false; + } + if (trim($save_dir) == '') { + $save_dir = './'; + } + if (0 !== strrpos($save_dir, '/')) { + $save_dir.= '/'; + } + //创建保存目录 + if (!file_exists($save_dir) && !mkdir($save_dir, 0777, true)) { + return false; + } + //获取远程文件所采用的方法 + if ($type) { + $ch = curl_init(); + $timeout = 5; + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); + $content = curl_exec($ch); + curl_close($ch); + } else { + ob_start(); + readfile($url); + $content = ob_get_contents(); + ob_end_clean(); + } + //echo $content; + $size = strlen($content); + //文件大小 + $fp2 = @fopen($save_dir . $filename, 'a'); + fwrite($fp2, $content); + fclose($fp2); + unset($content, $url); + return array( + 'file_name' => $filename, + 'save_path' => $save_dir . $filename, + 'file_size' => $size + ); +} \ No newline at end of file diff --git a/admin/dialogs/anchor/anchor.html b/admin/dialogs/anchor/anchor.html new file mode 100644 index 0000000..0278ada --- /dev/null +++ b/admin/dialogs/anchor/anchor.html @@ -0,0 +1,57 @@ + + + + + + + + +
+ +
+ + + + \ No newline at end of file diff --git a/admin/dialogs/attachment/attachment.css b/admin/dialogs/attachment/attachment.css new file mode 100644 index 0000000..2193bc9 --- /dev/null +++ b/admin/dialogs/attachment/attachment.css @@ -0,0 +1,713 @@ +@charset "utf-8"; +/* dialog样式 */ +.wrapper { + zoom: 1; + width: 630px; + *width: 626px; + height: 380px; + margin: 0 auto; + padding: 10px; + position: relative; + font-family: sans-serif; +} + +/*tab样式框大小*/ +.tabhead { + float: left; +} + +.tabbody { + width: 100%; + height: 346px; + position: relative; + clear: both; +} + +.tabbody .panel { + position: absolute; + width: 0; + height: 0; + background: #fff; + overflow: hidden; + display: none; +} + +.tabbody .panel.focus { + width: 100%; + height: 346px; + display: block; +} + +/* 上传附件 */ +.tabbody #upload.panel { + width: 0; + height: 0; + overflow: hidden; + position: absolute !important; + clip: rect(1px, 1px, 1px, 1px); + background: #fff; + display: block; +} + +.tabbody #upload.panel.focus { + width: 100%; + height: 346px; + display: block; + clip: auto; +} + +#upload .queueList { + margin: 0; + width: 100%; + height: 100%; + position: absolute; + overflow: hidden; +} + +#upload p { + margin: 0; +} + +.element-invisible { + width: 0 !important; + height: 0 !important; + border: 0; + padding: 0; + margin: 0; + overflow: hidden; + position: absolute !important; + clip: rect(1px, 1px, 1px, 1px); +} + +#upload .placeholder { + margin: 10px; + border: 2px dashed #e6e6e6; + *border: 0px dashed #e6e6e6; + height: 172px; + padding-top: 150px; + text-align: center; + background: url(./images/image.png) center 70px no-repeat; + color: #cccccc; + font-size: 18px; + position: relative; + top: 0; + *top: 10px; +} + +#upload .placeholder .webuploader-pick { + font-size: 18px; + background: #00b7ee; + border-radius: 3px; + line-height: 44px; + padding: 0 30px; + *width: 120px; + color: #fff; + display: inline-block; + margin: 0 auto 20px auto; + cursor: pointer; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); +} + +#upload .placeholder .webuploader-pick-hover { + background: #00a2d4; +} + +#filePickerContainer { + text-align: center; +} + +#upload .placeholder .flashTip { + color: #666666; + font-size: 12px; + position: absolute; + width: 100%; + text-align: center; + bottom: 20px; +} + +#upload .placeholder .flashTip a { + color: #0785d1; + text-decoration: none; +} + +#upload .placeholder .flashTip a:hover { + text-decoration: underline; +} + +#upload .placeholder.webuploader-dnd-over { + border-color: #999999; +} + +#upload .filelist { + list-style: none; + margin: 0; + padding: 0; + overflow-x: hidden; + overflow-y: auto; + position: relative; + height: 300px; +} + +#upload .filelist:after { + content: ''; + display: block; + width: 0; + height: 0; + overflow: hidden; + clear: both; +} + +#upload .filelist li { + width: 113px; + height: 113px; + background: url(./images/bg.png); + text-align: center; + margin: 9px 0 0 9px; + *margin: 6px 0 0 6px; + position: relative; + display: block; + float: left; + overflow: hidden; + font-size: 12px; +} + +#upload .filelist li p.log { + position: relative; + top: -45px; +} + +#upload .filelist li p.title { + position: absolute; + top: 0; + left: 0; + width: 100%; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + top: 5px; + text-indent: 5px; + text-align: left; +} + +#upload .filelist li p.progress { + position: absolute; + width: 100%; + bottom: 0; + left: 0; + height: 8px; + overflow: hidden; + z-index: 50; + margin: 0; + border-radius: 0; + background: none; + -webkit-box-shadow: 0 0 0; +} + +#upload .filelist li p.progress span { + display: none; + overflow: hidden; + width: 0; + height: 100%; + background: #1483d8 url(./images/progress.png) repeat-x; + + -webit-transition: width 200ms linear; + -moz-transition: width 200ms linear; + -o-transition: width 200ms linear; + -ms-transition: width 200ms linear; + transition: width 200ms linear; + + -webkit-animation: progressmove 2s linear infinite; + -moz-animation: progressmove 2s linear infinite; + -o-animation: progressmove 2s linear infinite; + -ms-animation: progressmove 2s linear infinite; + animation: progressmove 2s linear infinite; + + -webkit-transform: translateZ(0); +} + +@-webkit-keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +@-moz-keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +@keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +#upload .filelist li p.imgWrap { + position: relative; + z-index: 2; + line-height: 113px; + vertical-align: middle; + overflow: hidden; + width: 113px; + height: 113px; + + -webkit-transform-origin: 50% 50%; + -moz-transform-origin: 50% 50%; + -o-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; + + -webit-transition: 200ms ease-out; + -moz-transition: 200ms ease-out; + -o-transition: 200ms ease-out; + -ms-transition: 200ms ease-out; + transition: 200ms ease-out; +} + +#upload .filelist li p.imgWrap.notimage { + margin-top: 0; + width: 111px; + height: 111px; + border: 1px #eeeeee solid; +} + +#upload .filelist li p.imgWrap.notimage i.file-preview { + margin-top: 15px; +} + +#upload .filelist li img { + width: 100%; +} + +#upload .filelist li p.error { + background: #f43838; + color: #fff; + position: absolute; + bottom: 0; + left: 0; + height: 28px; + line-height: 28px; + width: 100%; + z-index: 100; + display: none; +} + +#upload .filelist li .success { + display: block; + position: absolute; + left: 0; + bottom: 0; + height: 40px; + width: 100%; + z-index: 200; + background: url(./images/success.png) no-repeat right bottom; + background-image: url(./images/success.gif) \9; +} + +#upload .filelist li.filePickerBlock { + width: 113px; + height: 113px; + background: url(./images/image.png) no-repeat center 12px; + border: 1px solid #eeeeee; + border-radius: 0; +} + +#upload .filelist li.filePickerBlock div.webuploader-pick { + width: 100%; + height: 100%; + margin: 0; + padding: 0; + opacity: 0; + background: none; + font-size: 0; +} + +#upload .filelist div.file-panel { + position: absolute; + height: 0; + filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0; + background: rgba(0, 0, 0, 0.5); + width: 100%; + top: 0; + left: 0; + overflow: hidden; + z-index: 300; +} + +#upload .filelist div.file-panel span { + width: 24px; + height: 24px; + display: inline; + float: right; + text-indent: -9999px; + overflow: hidden; + background: url(./images/icons.png) no-repeat; + background: url(./images/icons.gif) no-repeat \9; + margin: 5px 1px 1px; + cursor: pointer; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +#upload .filelist div.file-panel span.rotateLeft { + display: none; + background-position: 0 -24px; +} + +#upload .filelist div.file-panel span.rotateLeft:hover { + background-position: 0 0; +} + +#upload .filelist div.file-panel span.rotateRight { + display: none; + background-position: -24px -24px; +} + +#upload .filelist div.file-panel span.rotateRight:hover { + background-position: -24px 0; +} + +#upload .filelist div.file-panel span.cancel { + background-position: -48px -24px; +} + +#upload .filelist div.file-panel span.cancel:hover { + background-position: -48px 0; +} + +#upload .statusBar { + height: 45px; + border-bottom: 1px solid #dadada; + margin: 0 10px; + padding: 0; + line-height: 45px; + vertical-align: middle; + position: relative; +} + +#upload .statusBar .progress { + border: 1px solid #1483d8; + width: 198px; + background: #fff; + height: 18px; + position: absolute; + top: 12px; + display: none; + text-align: center; + line-height: 18px; + color: #6dbfff; + margin: 0 10px 0 0; +} + +#upload .statusBar .progress span.percentage { + width: 0; + height: 100%; + left: 0; + top: 0; + background: #1483d8; + position: absolute; +} + +#upload .statusBar .progress span.text { + position: relative; + z-index: 10; +} + +#upload .statusBar .info { + display: inline-block; + font-size: 14px; + color: #666666; +} + +#upload .statusBar .btns { + position: absolute; + top: 7px; + right: 0; + line-height: 30px; +} + +#filePickerBtn { + display: inline-block; + float: left; +} + +#upload .statusBar .btns .webuploader-pick, +#upload .statusBar .btns .uploadBtn, +#upload .statusBar .btns .uploadBtn.state-uploading, +#upload .statusBar .btns .uploadBtn.state-paused { + background: #ffffff; + border: 1px solid #cfcfcf; + color: #565656; + padding: 0 18px; + display: inline-block; + border-radius: 3px; + margin-left: 10px; + cursor: pointer; + font-size: 14px; + float: left; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +#upload .statusBar .btns .webuploader-pick-hover, +#upload .statusBar .btns .uploadBtn:hover, +#upload .statusBar .btns .uploadBtn.state-uploading:hover, +#upload .statusBar .btns .uploadBtn.state-paused:hover { + background: #f0f0f0; +} + +#upload .statusBar .btns .uploadBtn, +#upload .statusBar .btns .uploadBtn.state-paused { + background: #00b7ee; + color: #fff; + border-color: transparent; +} + +#upload .statusBar .btns .uploadBtn:hover, +#upload .statusBar .btns .uploadBtn.state-paused:hover { + background: #00a2d4; +} + +#upload .statusBar .btns .uploadBtn.disabled { + pointer-events: none; + filter: alpha(opacity=60); + -moz-opacity: 0.6; + -khtml-opacity: 0.6; + opacity: 0.6; +} + +/* 图片管理样式 */ +#online { + width: 100%; + height: 336px; + padding: 10px 0 0 0; +} + +#online #fileList { + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + position: relative; +} + +#online ul { + display: block; + list-style: none; + margin: 0; + padding: 0; +} + +#online li { + float: left; + display: block; + list-style: none; + padding: 0; + width: 113px; + height: 113px; + margin: 0 0 9px 9px; + *margin: 0 0 6px 6px; + background-color: #eee; + overflow: hidden; + cursor: pointer; + position: relative; +} + +#online li.clearFloat { + float: none; + clear: both; + display: block; + width: 0; + height: 0; + margin: 0; + padding: 0; +} + +#online li img { + cursor: pointer; +} + +#online li div.file-wrapper { + cursor: pointer; + position: absolute; + display: block; + width: 111px; + height: 111px; + border: 1px solid #eee; + background: url("./images/bg.png") repeat; +} + +#online li div span.file-title { + display: block; + padding: 0 3px; + margin: 3px 0 0 0; + font-size: 12px; + height: 13px; + color: #555555; + text-align: center; + width: 107px; + white-space: nowrap; + word-break: break-all; + overflow: hidden; + text-overflow: ellipsis; +} + +#online li .icon { + cursor: pointer; + width: 113px; + height: 113px; + position: absolute; + top: 0; + left: 0; + z-index: 2; + border: 0; + background-repeat: no-repeat; +} + +#online li .icon:hover { + width: 107px; + height: 107px; + border: 3px solid #1094fa; +} + +#online li.selected .icon { + background-image: url(images/success.png); + background-image: url(images/success.gif) \9; + background-position: 75px 75px; +} + +#online li.selected .icon:hover { + width: 107px; + height: 107px; + border: 3px solid #1094fa; + background-position: 72px 72px; +} + +/* 在线文件的文件预览图标 */ +i.file-preview { + display: block; + margin: 10px auto; + width: 70px; + height: 70px; + background-image: url("./images/file-icons.png"); + background-image: url("./images/file-icons.gif") \9; + background-position: -140px center; + background-repeat: no-repeat; +} + +i.file-preview.file-type-dir { + background-position: 0 center; +} + +i.file-preview.file-type-file { + background-position: -140px center; +} + +i.file-preview.file-type-filelist { + background-position: -210px center; +} + +i.file-preview.file-type-zip, +i.file-preview.file-type-rar, +i.file-preview.file-type-7z, +i.file-preview.file-type-tar, +i.file-preview.file-type-gz, +i.file-preview.file-type-bz2 { + background-position: -280px center; +} + +i.file-preview.file-type-xls, +i.file-preview.file-type-xlsx { + background-position: -350px center; +} + +i.file-preview.file-type-doc, +i.file-preview.file-type-docx { + background-position: -420px center; +} + +i.file-preview.file-type-ppt, +i.file-preview.file-type-pptx { + background-position: -490px center; +} + +i.file-preview.file-type-vsd { + background-position: -560px center; +} + +i.file-preview.file-type-pdf { + background-position: -630px center; +} + +i.file-preview.file-type-txt, +i.file-preview.file-type-md, +i.file-preview.file-type-json, +i.file-preview.file-type-htm, +i.file-preview.file-type-xml, +i.file-preview.file-type-html, +i.file-preview.file-type-js, +i.file-preview.file-type-css, +i.file-preview.file-type-php, +i.file-preview.file-type-jsp, +i.file-preview.file-type-asp { + background-position: -700px center; +} + +i.file-preview.file-type-apk { + background-position: -770px center; +} + +i.file-preview.file-type-exe { + background-position: -840px center; +} + +i.file-preview.file-type-ipa { + background-position: -910px center; +} + +i.file-preview.file-type-mp4, +i.file-preview.file-type-swf, +i.file-preview.file-type-mkv, +i.file-preview.file-type-avi, +i.file-preview.file-type-flv, +i.file-preview.file-type-mov, +i.file-preview.file-type-mpg, +i.file-preview.file-type-mpeg, +i.file-preview.file-type-ogv, +i.file-preview.file-type-webm, +i.file-preview.file-type-rm, +i.file-preview.file-type-rmvb { + background-position: -980px center; +} + +i.file-preview.file-type-ogg, +i.file-preview.file-type-wav, +i.file-preview.file-type-wmv, +i.file-preview.file-type-mid, +i.file-preview.file-type-mp3 { + background-position: -1050px center; +} + +i.file-preview.file-type-jpg, +i.file-preview.file-type-jpeg, +i.file-preview.file-type-gif, +i.file-preview.file-type-bmp, +i.file-preview.file-type-png, +i.file-preview.file-type-psd { + background-position: -140px center; +} \ No newline at end of file diff --git a/admin/dialogs/attachment/attachment.html b/admin/dialogs/attachment/attachment.html new file mode 100644 index 0000000..a5202ee --- /dev/null +++ b/admin/dialogs/attachment/attachment.html @@ -0,0 +1,61 @@ + + + + + ueditor图片对话框 + + + + + + + + + + + + + + +
+
+ + +
+
+ +
+
+
+
+ 0% + +
+
+
+
+
+
+
+
+
+
+
+
+
    +
  • +
+
+
+ + +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/admin/dialogs/attachment/attachment.js b/admin/dialogs/attachment/attachment.js new file mode 100644 index 0000000..73e090b --- /dev/null +++ b/admin/dialogs/attachment/attachment.js @@ -0,0 +1,761 @@ +/** + * User: Jinqn + * Date: 14-04-08 + * Time: 下午16:34 + * 上传图片对话框逻辑代码,包括tab: 远程图片/上传图片/在线图片/搜索图片 + */ + +(function () { + + var uploadFile, + onlineFile; + + window.onload = function () { + initTabs(); + initButtons(); + }; + + /* 初始化tab标签 */ + function initTabs() { + var tabs = $G('tabhead').children; + for (var i = 0; i < tabs.length; i++) { + domUtils.on(tabs[i], "click", function (e) { + var target = e.target || e.srcElement; + setTabFocus(target.getAttribute('data-content-id')); + }); + } + + setTabFocus('upload'); + } + + /* 初始化tabbody */ + function setTabFocus(id) { + if (!id) return; + var i, bodyId, tabs = $G('tabhead').children; + for (i = 0; i < tabs.length; i++) { + bodyId = tabs[i].getAttribute('data-content-id') + if (bodyId == id) { + domUtils.addClass(tabs[i], 'focus'); + domUtils.addClass($G(bodyId), 'focus'); + } else { + domUtils.removeClasses(tabs[i], 'focus'); + domUtils.removeClasses($G(bodyId), 'focus'); + } + } + switch (id) { + case 'upload': + uploadFile = uploadFile || new UploadFile('queueList'); + break; + case 'online': + onlineFile = onlineFile || new OnlineFile('fileList'); + break; + } + } + + /* 初始化onok事件 */ + function initButtons() { + + dialog.onok = function () { + var list = [], id, tabs = $G('tabhead').children; + for (var i = 0; i < tabs.length; i++) { + if (domUtils.hasClass(tabs[i], 'focus')) { + id = tabs[i].getAttribute('data-content-id'); + break; + } + } + + switch (id) { + case 'upload': + list = uploadFile.getInsertList(); + var count = uploadFile.getQueueCount(); + if (count) { + $('.info', '#queueList').html('' + '还有2个未上传文件'.replace(/[\d]/, count) + ''); + return false; + } + break; + case 'online': + list = onlineFile.getInsertList(); + break; + } + + editor.execCommand('insertfile', list); + }; + } + + + /* 上传附件 */ + function UploadFile(target) { + this.$wrap = target.constructor == String ? $('#' + target) : $(target); + this.init(); + } + + UploadFile.prototype = { + init: function () { + this.fileList = []; + this.initContainer(); + this.initUploader(); + }, + initContainer: function () { + this.$queue = this.$wrap.find('.filelist'); + }, + /* 初始化容器 */ + initUploader: function () { + var _this = this, + $ = jQuery, // just in case. Make sure it's not an other libaray. + $wrap = _this.$wrap, + // 图片容器 + $queue = $wrap.find('.filelist'), + // 状态栏,包括进度和控制按钮 + $statusBar = $wrap.find('.statusBar'), + // 文件总体选择信息。 + $info = $statusBar.find('.info'), + // 上传按钮 + $upload = $wrap.find('.uploadBtn'), + // 上传按钮 + $filePickerBtn = $wrap.find('.filePickerBtn'), + // 上传按钮 + $filePickerBlock = $wrap.find('.filePickerBlock'), + // 没选择文件之前的内容。 + $placeHolder = $wrap.find('.placeholder'), + // 总体进度条 + $progress = $statusBar.find('.progress').hide(), + // 添加的文件数量 + fileCount = 0, + // 添加的文件总大小 + fileSize = 0, + // 优化retina, 在retina下这个值是2 + ratio = window.devicePixelRatio || 1, + // 缩略图大小 + thumbnailWidth = 113 * ratio, + thumbnailHeight = 113 * ratio, + // 可能有pedding, ready, uploading, confirm, done. + state = '', + // 所有文件的进度信息,key为file id + percentages = {}, + supportTransition = (function () { + var s = document.createElement('p').style, + r = 'transition' in s || + 'WebkitTransition' in s || + 'MozTransition' in s || + 'msTransition' in s || + 'OTransition' in s; + s = null; + return r; + })(), + // WebUploader实例 + uploader, + actionUrl = editor.getActionUrl(editor.getOpt('fileActionName')), + fileMaxSize = editor.getOpt('fileMaxSize'), + acceptExtensions = (editor.getOpt('fileAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, ''); + ; + + if (!WebUploader.Uploader.support()) { + $('#filePickerReady').after($('
').html(lang.errorNotSupport)).hide(); + return; + } else if (!editor.getOpt('fileActionName')) { + $('#filePickerReady').after($('
').html(lang.errorLoadConfig)).hide(); + return; + } + + uploader = _this.uploader = WebUploader.create({ + pick: { + id: '#filePickerReady', + label: lang.uploadSelectFile + }, + swf: '../../third-party/webuploader/Uploader.swf', + server: actionUrl, + fileVal: editor.getOpt('fileFieldName'), + duplicate: true, + fileSingleSizeLimit: fileMaxSize, + compress: false + }); + uploader.addButton({ + id: '#filePickerBlock' + }); + uploader.addButton({ + id: '#filePickerBtn', + label: lang.uploadAddFile + }); + + setState('pedding'); + + // 当有文件添加进来时执行,负责view的创建 + function addFile(file) { + var $li = $('
  • ' + + '

    ' + file.name + '

    ' + + '

    ' + + '

    ' + + '
  • '), + + $btns = $('
    ' + + '' + lang.uploadDelete + '' + + '' + lang.uploadTurnRight + '' + + '' + lang.uploadTurnLeft + '
    ').appendTo($li), + $prgress = $li.find('p.progress span'), + $wrap = $li.find('p.imgWrap'), + $info = $('

    ').hide().appendTo($li), + + showError = function (code) { + switch (code) { + case 'exceed_size': + text = lang.errorExceedSize; + break; + case 'interrupt': + text = lang.errorInterrupt; + break; + case 'http': + text = lang.errorHttp; + break; + case 'not_allow_type': + text = lang.errorFileType; + break; + default: + text = lang.errorUploadRetry; + break; + } + $info.text(text).show(); + }; + + if (file.getStatus() === 'invalid') { + showError(file.statusText); + } else { + $wrap.text(lang.uploadPreview); + if ('|png|jpg|jpeg|bmp|gif|'.indexOf('|' + file.ext.toLowerCase() + '|') == -1) { + $wrap.empty().addClass('notimage').append('' + + '' + file.name + ''); + } else { + if (browser.ie && browser.version <= 7) { + $wrap.text(lang.uploadNoPreview); + } else { + uploader.makeThumb(file, function (error, src) { + if (error || !src) { + $wrap.text(lang.uploadNoPreview); + } else { + var $img = $(''); + $wrap.empty().append($img); + $img.on('error', function () { + $wrap.text(lang.uploadNoPreview); + }); + } + }, thumbnailWidth, thumbnailHeight); + } + } + percentages[file.id] = [file.size, 0]; + file.rotation = 0; + + /* 检查文件格式 */ + if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) { + showError('not_allow_type'); + uploader.removeFile(file); + } + } + + file.on('statuschange', function (cur, prev) { + if (prev === 'progress') { + $prgress.hide().width(0); + } else if (prev === 'queued') { + $li.off('mouseenter mouseleave'); + $btns.remove(); + } + // 成功 + if (cur === 'error' || cur === 'invalid') { + showError(file.statusText); + percentages[file.id][1] = 1; + } else if (cur === 'interrupt') { + showError('interrupt'); + } else if (cur === 'queued') { + percentages[file.id][1] = 0; + } else if (cur === 'progress') { + $info.hide(); + $prgress.css('display', 'block'); + } else if (cur === 'complete') { + } + + $li.removeClass('state-' + prev).addClass('state-' + cur); + }); + + $li.on('mouseenter', function () { + $btns.stop().animate({height: 30}); + }); + $li.on('mouseleave', function () { + $btns.stop().animate({height: 0}); + }); + + $btns.on('click', 'span', function () { + var index = $(this).index(), + deg; + + switch (index) { + case 0: + uploader.removeFile(file); + return; + case 1: + file.rotation += 90; + break; + case 2: + file.rotation -= 90; + break; + } + + if (supportTransition) { + deg = 'rotate(' + file.rotation + 'deg)'; + $wrap.css({ + '-webkit-transform': deg, + '-mos-transform': deg, + '-o-transform': deg, + 'transform': deg + }); + } else { + $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')'); + } + + }); + + $li.insertBefore($filePickerBlock); + } + + // 负责view的销毁 + function removeFile(file) { + var $li = $('#' + file.id); + delete percentages[file.id]; + updateTotalProgress(); + $li.off().find('.file-panel').off().end().remove(); + } + + function updateTotalProgress() { + var loaded = 0, + total = 0, + spans = $progress.children(), + percent; + + $.each(percentages, function (k, v) { + total += v[0]; + loaded += v[0] * v[1]; + }); + + percent = total ? loaded / total : 0; + + spans.eq(0).text(Math.round(percent * 100) + '%'); + spans.eq(1).css('width', Math.round(percent * 100) + '%'); + updateStatus(); + } + + function setState(val, files) { + + if (val != state) { + + var stats = uploader.getStats(); + + $upload.removeClass('state-' + state); + $upload.addClass('state-' + val); + + switch (val) { + + /* 未选择文件 */ + case 'pedding': + $queue.addClass('element-invisible'); + $statusBar.addClass('element-invisible'); + $placeHolder.removeClass('element-invisible'); + $progress.hide(); + $info.hide(); + uploader.refresh(); + break; + + /* 可以开始上传 */ + case 'ready': + $placeHolder.addClass('element-invisible'); + $queue.removeClass('element-invisible'); + $statusBar.removeClass('element-invisible'); + $progress.hide(); + $info.show(); + $upload.text(lang.uploadStart); + uploader.refresh(); + break; + + /* 上传中 */ + case 'uploading': + $progress.show(); + $info.hide(); + $upload.text(lang.uploadPause); + break; + + /* 暂停上传 */ + case 'paused': + $progress.show(); + $info.hide(); + $upload.text(lang.uploadContinue); + break; + + case 'confirm': + $progress.show(); + $info.hide(); + $upload.text(lang.uploadStart); + + stats = uploader.getStats(); + if (stats.successNum && !stats.uploadFailNum) { + setState('finish'); + return; + } + break; + + case 'finish': + $progress.hide(); + $info.show(); + if (stats.uploadFailNum) { + $upload.text(lang.uploadRetry); + } else { + $upload.text(lang.uploadStart); + } + break; + } + + state = val; + updateStatus(); + + } + + if (!_this.getQueueCount()) { + $upload.addClass('disabled') + } else { + $upload.removeClass('disabled') + } + + } + + function updateStatus() { + var text = '', stats; + + if (state === 'ready') { + text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize)); + } else if (state === 'confirm') { + stats = uploader.getStats(); + if (stats.uploadFailNum) { + text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum); + } + } else { + stats = uploader.getStats(); + text = lang.updateStatusFinish.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize)).replace('_', stats.successNum); + + if (stats.uploadFailNum) { + text += lang.updateStatusError.replace('_', stats.uploadFailNum); + } + } + + $info.html(text); + } + + uploader.on('fileQueued', function (file) { + fileCount++; + fileSize += file.size; + + if (fileCount === 1) { + $placeHolder.addClass('element-invisible'); + $statusBar.show(); + } + + addFile(file); + }); + + uploader.on('fileDequeued', function (file) { + fileCount--; + fileSize -= file.size; + + removeFile(file); + updateTotalProgress(); + }); + + uploader.on('filesQueued', function (file) { + if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) { + setState('ready'); + } + updateTotalProgress(); + }); + + uploader.on('all', function (type, files) { + switch (type) { + case 'uploadFinished': + setState('confirm', files); + break; + case 'startUpload': + /* 添加额外的GET参数 */ + var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '', + url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?' : '&') + 'encode=utf-8&' + params); + uploader.option('server', url); + setState('uploading', files); + break; + case 'stopUpload': + setState('paused', files); + break; + } + }); + + uploader.on('uploadBeforeSend', function (file, data, header) { + //这里可以通过data对象添加POST参数 + header['X_Requested_With'] = 'XMLHttpRequest'; + }); + + uploader.on('uploadProgress', function (file, percentage) { + var $li = $('#' + file.id), + $percent = $li.find('.progress span'); + + $percent.css('width', percentage * 100 + '%'); + percentages[file.id][1] = percentage; + updateTotalProgress(); + }); + + uploader.on('uploadSuccess', function (file, ret) { + var $file = $('#' + file.id); + try { + var responseText = (ret._raw || ret), + json = utils.str2json(responseText); + if (json.state == 'SUCCESS') { + _this.fileList.push(json); + $file.append(''); + } else { + $file.find('.error').text(json.state).show(); + } + } catch (e) { + $file.find('.error').text(lang.errorServerUpload).show(); + } + }); + + uploader.on('uploadError', function (file, code) { + }); + uploader.on('error', function (code, file) { + if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') { + addFile(file); + } + }); + uploader.on('uploadComplete', function (file, ret) { + }); + + $upload.on('click', function () { + if ($(this).hasClass('disabled')) { + return false; + } + + if (state === 'ready') { + uploader.upload(); + } else if (state === 'paused') { + uploader.upload(); + } else if (state === 'uploading') { + uploader.stop(); + } + }); + + $upload.addClass('state-' + state); + updateTotalProgress(); + }, + getQueueCount: function () { + var file, i, status, readyFile = 0, files = this.uploader.getFiles(); + for (i = 0; file = files[i++];) { + status = file.getStatus(); + if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++; + } + return readyFile; + }, + getInsertList: function () { + var i, link, data, list = [], + prefix = editor.getOpt('fileUrlPrefix'); + for (i = 0; i < this.fileList.length; i++) { + data = this.fileList[i]; + link = data.url; + list.push({ + title: data.original || link.substr(link.lastIndexOf('/') + 1), + url: prefix + link + }); + } + return list; + } + }; + + + /* 在线附件 */ + function OnlineFile(target) { + this.container = utils.isString(target) ? document.getElementById(target) : target; + this.init(); + } + + OnlineFile.prototype = { + init: function () { + this.initContainer(); + this.initEvents(); + this.initData(); + }, + /* 初始化容器 */ + initContainer: function () { + this.container.innerHTML = ''; + this.list = document.createElement('ul'); + this.clearFloat = document.createElement('li'); + + domUtils.addClass(this.list, 'list'); + domUtils.addClass(this.clearFloat, 'clearFloat'); + + this.list.appendChild(this.clearFloat); + this.container.appendChild(this.list); + }, + /* 初始化滚动事件,滚动到地步自动拉取数据 */ + initEvents: function () { + var _this = this; + + /* 滚动拉取图片 */ + domUtils.on($G('fileList'), 'scroll', function (e) { + var panel = this; + if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) { + _this.getFileData(); + } + }); + /* 选中图片 */ + domUtils.on(this.list, 'click', function (e) { + var target = e.target || e.srcElement, + li = target.parentNode; + + if (li.tagName.toLowerCase() == 'li') { + if (domUtils.hasClass(li, 'selected')) { + domUtils.removeClasses(li, 'selected'); + } else { + domUtils.addClass(li, 'selected'); + } + } + }); + }, + /* 初始化第一次的数据 */ + initData: function () { + + /* 拉取数据需要使用的值 */ + this.state = 0; + this.listSize = editor.getOpt('fileManagerListSize'); + this.listIndex = 0; + this.listEnd = false; + + /* 第一次拉取数据 */ + this.getFileData(); + }, + /* 向后台拉取图片列表数据 */ + getFileData: function () { + var _this = this; + + if (!_this.listEnd && !this.isLoadingData) { + this.isLoadingData = true; + ajax.request(editor.getActionUrl(editor.getOpt('fileManagerActionName')), { + timeout: 100000, + data: utils.extend({ + start: this.listIndex, + size: this.listSize + }, editor.queryCommandValue('serverparam')), + method: 'get', + onsuccess: function (r) { + try { + var json = eval('(' + r.responseText + ')'); + if (json.state == 'SUCCESS') { + _this.pushData(json.list); + _this.listIndex = parseInt(json.start) + parseInt(json.list.length); + if (_this.listIndex >= json.total) { + _this.listEnd = true; + } + _this.isLoadingData = false; + } + } catch (e) { + if (r.responseText.indexOf('ue_separate_ue') != -1) { + var list = r.responseText.split(r.responseText); + _this.pushData(list); + _this.listIndex = parseInt(list.length); + _this.listEnd = true; + _this.isLoadingData = false; + } + } + }, + onerror: function () { + _this.isLoadingData = false; + } + }); + } + }, + /* 添加图片到列表界面上 */ + pushData: function (list) { + var i, item, img, filetype, preview, icon, _this = this, + urlPrefix = editor.getOpt('fileManagerUrlPrefix'); + for (i = 0; i < list.length; i++) { + if (list[i] && list[i].url) { + item = document.createElement('li'); + icon = document.createElement('span'); + filetype = list[i].url.substr(list[i].url.lastIndexOf('.') + 1); + + if ("png|jpg|jpeg|gif|bmp".indexOf(filetype) != -1) { + preview = document.createElement('img'); + domUtils.on(preview, 'load', (function (image) { + return function () { + _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight); + }; + })(preview)); + preview.width = 113; + preview.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=' : '&noCache=') + (+new Date()).toString(36)); + } else { + var ic = document.createElement('i'), + textSpan = document.createElement('span'); + textSpan.innerHTML = list[i].url.substr(list[i].url.lastIndexOf('/') + 1); + preview = document.createElement('div'); + preview.appendChild(ic); + preview.appendChild(textSpan); + domUtils.addClass(preview, 'file-wrapper'); + domUtils.addClass(textSpan, 'file-title'); + domUtils.addClass(ic, 'file-type-' + filetype); + domUtils.addClass(ic, 'file-preview'); + } + domUtils.addClass(icon, 'icon'); + item.setAttribute('data-url', urlPrefix + list[i].url); + if (list[i].original) { + item.setAttribute('data-title', list[i].original); + } + + item.appendChild(preview); + item.appendChild(icon); + this.list.insertBefore(item, this.clearFloat); + } + } + }, + /* 改变图片大小 */ + scale: function (img, w, h, type) { + var ow = img.width, + oh = img.height; + + if (type == 'justify') { + if (ow >= oh) { + img.width = w; + img.height = h * oh / ow; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w * ow / oh; + img.height = h; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + } else { + if (ow >= oh) { + img.width = w * ow / oh; + img.height = h; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w; + img.height = h * oh / ow; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + } + }, + getInsertList: function () { + var i, lis = this.list.children, list = []; + for (i = 0; i < lis.length; i++) { + if (domUtils.hasClass(lis[i], 'selected')) { + var url = lis[i].getAttribute('data-url'); + var title = lis[i].getAttribute('data-title') || url.substr(url.lastIndexOf('/') + 1); + list.push({ + title: title, + url: url + }); + } + } + return list; + } + }; + + +})(); \ No newline at end of file diff --git a/admin/dialogs/attachment/fileTypeImages/icon_chm.gif b/admin/dialogs/attachment/fileTypeImages/icon_chm.gif new file mode 100644 index 0000000000000000000000000000000000000000..9ca4fb6a23c7ed528374426575c3e7f67730cfb7 GIT binary patch literal 923 zcmcJOy=xR;49270U`4Q~ICz36hzbru@Ut$0C6w

    O|E|nVb+VhLPxFEtyI^j`FqLyNd0EWpleq^){o+_2ylTHaqGF zO<^H5(sh%@qktPU&w(pp9-3Gs((CnPZEbBZ81Rip*?#=*AAA0G)`@(VL$#^?6S8qi z-Vg0MaQMyXC!K9~zh3K)&rGar-!b{?e)rh3&E1`oQ)AtaFLu8>vh-!*#^>7|90SDQAhmyv(gsfKv~ literal 0 HcmV?d00001 diff --git a/admin/dialogs/attachment/fileTypeImages/icon_default.png b/admin/dialogs/attachment/fileTypeImages/icon_default.png new file mode 100644 index 0000000000000000000000000000000000000000..50ac1cb1654c147225f6c99f98fa820d8b1d47d3 GIT binary patch literal 841 zcmV-P1GfB$P)co5FHFQKPb3$yKB3yz3uJ2{(i*w{Y&32Y&5pHX#fNS%^lB?7Jx7e!!R@$ zW0V*MWri^ri!cCJuK&9D^Ig~)02-}VrVlRsat{^*C5gDx3qnV6$+=~+!PF21FkmZ@ z8b~H%=~Nv3aQ@;fylx>sluRWqyg8GMN5*##@7VOdNHQ%N3Cf&vJG&}(BO_ z0GI~5dh^d~zu)gPH#)1!5T+sR()iww-#)pz`cI)Sn%1`>N($3(G-m*$wuS~`$(U{O z3G;I( z%j~rr>P1P%W??GsP=NTpKmX&MwYt}DZ~eRS;O_04GsmW;j~~@ibUGeLsHM{BJj|YC8%N`o7<+Z@C+_!oGc#1Cx`LO0hUGI$B7llhKIN?RNhM@52iI TG@H!B00000NkvXXu0mjfSaX$T literal 0 HcmV?d00001 diff --git a/admin/dialogs/attachment/fileTypeImages/icon_doc.gif b/admin/dialogs/attachment/fileTypeImages/icon_doc.gif new file mode 100644 index 0000000000000000000000000000000000000000..206fede4ee7495c3d4fa8dbbb76425e23566e9cc GIT binary patch literal 1012 zcmW+#T};hk7=Mn8YGYk-BW7+*XP!uF(_J6BXv?Neo2k~53o+@FE|ATt^)Y4hQe0@P zSYMk?afGon-bF^G(&-43w{{O_}gnhA@5fnj7M8-aCj50=y zVPnWvS{tp57Ngl{vQ4FpQbvhUY!um9(MFUJF~Ua3uCg|)42xklOh7WE4Jkunhz+3t zHlTrpWlWRhu}^6&TC>(YQGFd~m#uKGjDYE`Ri%LWZD&tI*hU=i4-s$()c}KNsKh9AfEd_-1{T@mY#TKmi;xWx{y>Y0S(uP3>_P>aLM((F zku(B;E{r2+xJ8u612VCVIG_oJ;Sj0;2GQ7rEa(6+umMf>M0Of&)Odu8AxQWGEh;Aa zaoAj)d)uaSLL0Ml6+7z$ZBuu$v#U-V_6Uwci{yy5H*s`WUt=M+p zn)~SevRiXicW3`B{d+b3x9iEs+fRYf&nr{kgLA)De=Y{eT~yySb+dP(rDxFpb)})X z_j>E&!pg?wKmecq_T{xM7^R)ifIlLFD0GNA!!9O99O)|$T@5?_qRt;vFf&kn_)FW? z_`GnRYjoh$4o~IE$IRoKH*V=YJ>#wBrOt`{dF~IT+>(|Pf8s;e(6dXaz8IS9e|j*t z=3Q*=kAlHxo(+-b@~2-GW_ZFWttoKza)`U8q34AEw<{?<%ICf3>%N_l-tOzE_U8}Q z7oYS!sEM2(ic1;U<#{}~=FT^Xy5lXG?+$z3UwdQvQQ7pP6mQ9-w=|Y>&o0$8Wu0G{ isn`^mx;yvvmFWdDjr#c zLa{?BIQR=Hso)@-gFi5$h(?e?1}9O3!1?a`KX}6zj=OvJ-n-BDNC6L6Km!tBLTo}4 zi^J?j?#VEBbr*N!T4rW$>LzYT7A&f{s;jsnNwHVVMP0-N6NB+4N|K{}~ZKoJoX!9fm} zBM(~o#KEm(O)!!sOVVPE zi-}EWVsRKLD07CIi5XHK*D_Nz6;q^KvS3lvL`*>SB*k8X8pJ?(^n)}xO*^QcB&d+A z2}aUn$yV~Ua!;X@Eadx`Qv~8*!H*R z1Jb}XTM)URaq3M_BZ+<>;dB>fia`oDqncq{}&s`b$QtO-@+w}C? z;Nq!~gPU6~Dz(9{-TvCj!(Htg`{x(uCg+CR6V+R1T7A<43$vfP-MtrguipE)w!F3Z LqusxL9gh72jO~@^ literal 0 HcmV?d00001 diff --git a/admin/dialogs/attachment/fileTypeImages/icon_mp3.gif b/admin/dialogs/attachment/fileTypeImages/icon_mp3.gif new file mode 100644 index 0000000000000000000000000000000000000000..b351a1f2a294cd0f8e145e20c2c455a38cad2001 GIT binary patch literal 986 zcmW+#OGuPa6h7I6wK1usMoI`3X2DsMWI-EEY2_v@7Zr3CQ7Q#xDA5CHkz|Fbmn^6$ zdu+7Vn5dzZIN3$9%xdyg;HxyPQD@YdxqbJ)yTdu>d!7H!$V}gndN`J1DL`cG)5a)c z#27Y)Y^Al)%4ji~jV9Yv+9+j|7{x}BofU0F84)9FgzPG7!^*H2X2S#|L)wrsB!<`! z3Sa{oSXjn1Sswe8)}l3QO_mmwQd)^ttQA=mXo}JzT38ENQJ7_=Sv0d|f<~-rQkp~) zYXU1&0}P^}60*<(F|Yv*EG&~XWNSQ8ij^Yk545O6l&})AcA)}I7R9WX;2xqdt4I{F zBG^M7kcn-?0sjyIhfobLh=xjxLI;R}4QODIP0qGaFXe8ekBOO~`@{5Ca>~WKU$L(MF9&xEO+jKhUCL zvLA=d)w#EAIw!O-J6Ex@PS7@WCp)|9#9@!%IJ8KPXnPY!hXr<^@j2j12oIh>6$*ux zmKHCUe`={p) zzwLH7IG43C5ubkIf@>L!QZh8)kBB8&*+5TM#qX_8Xe$_MO>#wd-P&_}=vih>^_H5o zg)25>S3JtEd6gfXvF(myC5ih_CjpcNI+~ z1pOIXrw&{QB)mA-kn*SH)JW$*yOgGMLYik+JFZE literal 0 HcmV?d00001 diff --git a/admin/dialogs/attachment/fileTypeImages/icon_mv.gif b/admin/dialogs/attachment/fileTypeImages/icon_mv.gif new file mode 100644 index 0000000000000000000000000000000000000000..26019b099d96b382a549fa383bd81315cd6d295c GIT binary patch literal 1001 zcmW+#TS!$=5S_p%q=$ihRGNrTSo%=|Wl4e&+5@B?2{ojLOjtg`N-j#~hfj#Gq+|;c z1QiB~BHGowB$g7jg(4^`Me}B48Di?a>h-!?`^?{*nOU>entf7Fq$C_VA4Xy1Co(p) zG0GS*hK(VcX>GJJT8w6+$rhD1N*N_au~B4uMH^8@#0VQ9JIdOyGAxGKFagPsHlz%R zAvS~r*nkEWhS5!Sj}4`@Xw6!aU5iX9twbx?{nprb}BStkT zO`?f4VJlbz45Yylv{1uhU;`Rh7$z&o<_J-Wl_IMTYmtd4VI^ecf(42!idiv1JxHNf zktkwCkOx0N6VtE*`auE;!5Uy74VGvH4=e^Ypn*l!Ia@}KU=gxLLLb&5V-_a(3b|l` zq7VzgM>q`wzzgj#8fsxB`~Xc%!wztQU?>D@fPpk7K?^*v7}$U&dm`J7GI9jrVlWc= zuofAUeH_+T=iavHoY30rT*dY}MqAe%@9d~!hdqL$&>}gc?M)mW7TAHtbHJ5g9yDRq z>S{0;TyY}M*Vot6)8lr#T`pI4`I8-K72A??<5Dl2EUe#KI(V?&yF0V`db_uxXX^Rz z{QI%#(Z9>f%S*wPz|x|BVSa9Ic6KEYSoHh-KA&&Fe)u^#IX*TvFficpcse>dT3TA_ z>guYhs_^uqmqOM+D8+#T{)jN5^@G%z>rH7pmwaOa4-`fm zE=u|sx$)W6D9^QNYQOk2Ei$$y(D*5)bJOYc8&k)--#thlPjXH4*Z#?Ajc?BX_V%)O z-Hhrk`u?>s=KkG>N6UP#n-Uv}+Y;`Tt<9{xw0UQ5$-=Lp($B3;TPuST`-(SY?4K+P X4d%*-doJfz=*#Bpp_0z7a!ULUk{Ai+ literal 0 HcmV?d00001 diff --git a/admin/dialogs/attachment/fileTypeImages/icon_pdf.gif b/admin/dialogs/attachment/fileTypeImages/icon_pdf.gif new file mode 100644 index 0000000000000000000000000000000000000000..bbb65c837dea9a6c28d6209ca1b1140a37988423 GIT binary patch literal 996 zcmW+#OGuPa6h47kZE6CejXiWDMGNUrrnSm4q(vaKDU@n)7n&%QMHv`Ts}dJNaY1Jm z1%)xttY%cue2lg@;j0pL1`5YVHoj^e%{0#KyZ>4JhjY$%zVAEtzgSgyy6lFFT$Cg- zHpCchj53CeA)AR9(MFUJHbSmT8mbqSu|M|C@L*ViDFS?Nuiguuo7lr0!NGr zX(1)VLf8t{00U{T1TECC7}$UY7KX_RvN=L&&03SyhqcI*(u%brD;F$KWTlxk6V!tg zdNnCctO@eq2WVm%c0fN!Kp|KI45Yylt>A&hzy>t1$U0}s$Pug*StFqjYmqT4Cin`u zV1c3{Rs;3ry4U%$;nF- zrBbn2EEn{ief)z6-Jp;EBfd`ky_8jVeTK&hz2O8aFtv^S73*9B2zWtF;HMPE?f}2k=uA(oM PSLc_Xzst?bp)>yhr3M#0 literal 0 HcmV?d00001 diff --git a/admin/dialogs/attachment/fileTypeImages/icon_ppt.gif b/admin/dialogs/attachment/fileTypeImages/icon_ppt.gif new file mode 100644 index 0000000000000000000000000000000000000000..ccb26fbebdff5521eab7418d22e99fbae6c1d08c GIT binary patch literal 1001 zcmW+#TS$~q5FViig{X~sv5e>~C`M52PqY*C`39biRR&OdL%%zX2G-<*@4v2#=EF&o(^Or%XH zt)_scWI{;6Qjn1g7AUfi%#sP} zK?=Q+gd~;(dGG@?F%3JQA0(gc0k$hWT1#y8Q>U^EiJ(_cNaAO=Ed9XQ}e*ob1A$rqR0<`46gx0%!XIm#cEx9b24x9#1v-6J4L2;{%(Yx0E;vP_|dsDD=Bqr6K zlHm7+$8t;U2TSW-{OnCS>CRfYv7yHk`q$jys&5*5AI!X%Ro!^Ls4C>TvM3?g5=?S; dtLf~)4_`YgyED9bxo14v@(;Dvr3@ER+J8}<4t)Rs literal 0 HcmV?d00001 diff --git a/admin/dialogs/attachment/fileTypeImages/icon_psd.gif b/admin/dialogs/attachment/fileTypeImages/icon_psd.gif new file mode 100644 index 0000000000000000000000000000000000000000..2e8743a2705b98b9c546c28c97fe724dd4668b16 GIT binary patch literal 1009 zcmW+#T}V|y5FX8kBEk#Si<*%J5ovK9!7{1n!IT1pEV7cg5JRb%rl^$FgQNr{MG-7& zA`xU1A_`tmEGaW%)l9|mH^r2+ydDOkN^7H)(PA_kO}44DQOYPWij5*WE82)MB1YH<*;Uqtm0>Z=h6zZ9v>|0k46z{; zzy>t1u#9Q4JoYKAMQhfYEG;Ufv=XgYE3zuk6s1M9uokkSFw07_XlBg>jab#BG>InG z1Xid97(_!QWT6LQU;`RhSSD-8)_9^6D@E2HXiU9wr2Ei%NyMkpF_J&`0YLK7n!ypd%%@ko>=}l@3A-fW=Hs`+liI4{u!_R zJ@o-MCR`=o!|wiwC~n{V@aK+;)v;~|ifp4t6BC)6X zNY-$)^uNy?@fJ-lrA;-xIvblk5|a^9wr8sK+EnAE)Y`6)xT`ZQ_lBpVDtf99_0~L{ z=}wQmmDtrA(ebGEQ;{!hVQw(_Nqo)eoe7sa%4^;g4K8%`{k=aLSLzy1U$>H7*_tKo z?hDH)jF-g$H!2(mEu+l^ml1h9)R3{_R zN+{4&BvL7dheA~CWs)UwOqF5B!RW`y}SP8Q*0ZGURX(1)VLMVU@ zXkcL((`0$<)5a)c*ch_3sI)d(8O=tMRe`3`Mk%A%D6*n3%i6Fq%!UaXv1&*gQij+N zSfLtV5Dk@(g&v534QOCtnXDmO<0-9KYqI`8i%Kc2SSzx2p#n`-nprc!Jw#zvlhVYR zU=MjfCbkg={6hpBLN&l38Y(dg9Uulapn*j;Ion2!$4Ze668=DoidiusSJ;ILG!?NT z`cdZNvdhFbs!K4KRqtCS*Yeh=C1gvL~|BXrsm>Tns_NA81iA z*^k5K>fGBlofF!aovYYcCup0xlbv04;;=_>99kqtw7rR=!vZ_d_#AL0ga=QcT3T8< z<=R-i>3I9ihKoM2lSwUuoqZ$2BQrmK#>X8XzYq$FpIcabGw!|J+&@0~jgD6Rn*IHD zYU*J_gIA>EUC-4U*8(b%5;IQ(N3L1D-lx5b+S*z!r;vBaQ?%dj<&*o3m6bEy-Cgzd z%gf7Nuh;E%eU|NsNa*$rtBcF| zyk*2Qx4ovf+`S`nruXcsh=cR3xoPb?(_#u%q!dP%WtCUfMD^y5?XF6Her}@Ud*@JN zR#JAj$JM;zL)wdit+9jteY2rawR5d!2K?9E8$Mq`ciulptVrE=A*%YMZ*gr`TuJ|{ z(z2$eFL}wMSGG+Dq$lSUuPlpR9NA3ywWC9IrH}KT<}duqn4ccJzBi_D;`Bu5K&ybF0xCVru0xy zLa>Ldm34nuFN?9hw?M?7)Rv5bKzH}sb=_Uxp7)#Ed^7XR^E~r@SFc?;bGE0MnyE}= zT^MWCTCtX`C6^gvjanntur=h0YOJbNvC3A-^@_2gR>TThAvem#vRW3)Y?**$$yicL zVu>vw0XCq4g<*7)+v7rw5o6dGa%+*P8Wp2#lpG5bMU99NHbRaRdRYyNVKz+Qh*3jo zNDQ$dYz1q8fizfx7HU`wY(N7G!{h|H93iT#N=_fvA`?+z6>@UH0!0>ORwk$iDfB9d z5-UL-`~Xc%!w%>N2`B_>fPpkvq7^)_7}$UY7CGl!899PQ$QcQJSc{BVnBXhqf(42~ zECe6nGz zR(E#l^?I#Vt4>c($K&x>EH*eeSSXZoxnJ}13)SlO_I9OSt5&wk<&sy(Z+eA7F`uuY zP^nb5w(z-JDwRCXD;765Hda?wve|4VlS!x3sZ=VNOePYEXf!%8F%gMG!r^c*7{t>* zQrW!=Lg@rJ;E!k~Y8)rqpWD-SyM1VBq23t_FUFtz{Mx?sD0C|jZ2C9Sbm)4^Oz+y? z)NEU5?fiq>-2Lw#Pj*iB{YZA*d>J~N?LXc*G#V&$2YN3)-Dis(c-P&AvG|vcl}Pm7 ha8EkcUOioGJ2wXc!R{Rj722e<$L literal 0 HcmV?d00001 diff --git a/admin/dialogs/attachment/fileTypeImages/icon_xls.gif b/admin/dialogs/attachment/fileTypeImages/icon_xls.gif new file mode 100644 index 0000000000000000000000000000000000000000..e86c1c6631b34ecd605b655baf3d7b1ae643d014 GIT binary patch literal 1005 zcmW+#Sx8n<5S~OS9}KaFd{U%W$zY07N%BQgM2kWK39;Zvw5XMcSs{ptw3ukd!DvAW zOUSa^MRP$(k0NGD>TjW9qHS6!zy3LW=bpD=X1;Cijg5;r5T52w{na(1=w-+K@8DhQJEd z0E1|#ge>$x3~WFH3(I5;*&0u2&03T72U=80X~kNRwF?z!veL|&3GN{ZvznA9)&zUV z12VCVIN%>5;1H?-2GLN7QRo0MumKG$vdP&tYCKkoY>@B=T2#!63Aw^9RG_Jd6(L6? zjR2qv;|LmV5he0~Ol%_#Xo6ulgld36G&Ug%IzS9;K$AU@okklq9^qmL68=DoiphQ) zHdp7~w&|SE#_U|h&N@Nc)Sc|?suPDjg5%I4Iil@N932+efyU>6D&6#&)VjN>|V zv-8~R>nCf{GTvkb-3s1$HZb}{bVgT3@w?(fB~dl5>apdK*}q@9UF`{1qs)Bgsw~gR z=r5V~h#Q}Nh}(M$j8Z5x;E(Vp+SX66eUHZ;aWxlg`{dh`oKe|bG})HBk$k7J>&nXF znW?~}na0bDp}hrOKKbvIaHygA>osR74c^g{8LV9&?8bPWVl?=6FUHC(Dw~C1%a`M-0X^ zUTDZ(=qbF}x@WkhBY(X3Lqp?a*Tv5PRVfK4D#P2o2A&MKE9$~CZ}>dh(HH(8{nF#G b^xlfyQ$tzRM+;I8wp1>Sze?TeO_BcrMy(F| literal 0 HcmV?d00001 diff --git a/admin/dialogs/attachment/images/alignicon.gif b/admin/dialogs/attachment/images/alignicon.gif new file mode 100644 index 0000000000000000000000000000000000000000..005a5ac65a3ddc9cdac037abdb5fe92267155a0d GIT binary patch literal 1051 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 literal 0 HcmV?d00001 diff --git a/admin/dialogs/attachment/images/file-icons.png b/admin/dialogs/attachment/images/file-icons.png new file mode 100644 index 0000000000000000000000000000000000000000..3ff82c8c488f53a7aff67fbe39742e3321183eca GIT binary patch literal 44070 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

    *vGSxI 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 literal 0 HcmV?d00001 diff --git a/admin/dialogs/attachment/images/icons.gif b/admin/dialogs/attachment/images/icons.gif new file mode 100644 index 0000000000000000000000000000000000000000..78459dea7b12ccbeec81d19ecdab22b1658e93b4 GIT binary patch literal 453 zcmZ?wbhEHbbY#$A*vtR||Ns9FJNP^N(4UCIf1{56|NHmvpFe+o|NadW2g{=nia%Kx z85lSjbU>mYGZarn*x(aH@fLZq!wgUiaA+%BrQuMGlI(3v}$4ket=c%G-JG_a6@d zUMtW1Dv_dMk(#;&JDULU);6IIt*+RD80Beh(v#{r8-@JE7rOMyrKZ@`PM+5- zK4PEn@UifH&1a7opNKNDvAy~H((Lt@PiCLrh`sqL^yyzFM}*_N9gV+*y1bvCcd{tw zP+atQ`ojjtR_?nOH&4iCw(0v^v}@~SfpwBi-JHA%0-p_?kEd#ga=ENn_|&M5?L?$c z!i1+jT>6R+ul!uQ+^$n$Hm~o7%Nb0wJ#GK7NE~>4aE?#6+>{R=oUZeJnouMg`B^J) rUi3;Xl^IQMkE|4#X6EZ{`gBG$ultcLuMHMNRKNMR>qv$%6N5DXx{1lO literal 0 HcmV?d00001 diff --git a/admin/dialogs/attachment/images/icons.png b/admin/dialogs/attachment/images/icons.png new file mode 100644 index 0000000000000000000000000000000000000000..12e4700163ac87fa38ae3d92a2c39d0fb4690fed GIT binary patch literal 2678 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 literal 0 HcmV?d00001 diff --git a/admin/dialogs/attachment/images/progress.png b/admin/dialogs/attachment/images/progress.png new file mode 100644 index 0000000000000000000000000000000000000000..717c4865c90a959c6a0e9ad1af9c777d900a2e9c GIT binary patch literal 1269 zcmeAS@N?(olHy`uVBq!ia0vp^f8U}fi7AzZCsS=07??9MLn2Bde0{8v^Kf6`()~Xj@TAnpKdC8`Lf!&sHg;q@=(~U%$M( zT(8_%FTW^V-_X+15@d#vkuFe$ZgFK^Nn(X=Ua>OF1ees}t-3#_`hBq$Z(46Le)Ln;eW^@CE2 z^Gl18f$@>14ATq@JNy=b6armi>cVAJd5X6R;MWawh(V&G(G=xXffXz1o@ zX=ZL{;B08&Z0-!x>zP+vl9-pA3bQv8XfIT+GhV$`&PAz-CHX}m`T04p6cCV+Uy@&( zkzb(T9Bihb;hUJ8nFkWk1Vs?Uzb>gonPsUdZbkXI3g8g7%EaOV0~10%hv-cqC)D(T zj?o7t52WM*69T3|5EGvGfgE`DNzDW1nId53*cQ_-&cMK^?CIhdQgN$ga=rIq1A(^5 zYKwg&`wo`WvF`u>{iFU|`!+wz>b#B?t8F4hxRm$~lz-tTH#6E8xZnKlv%`YRwvA{oKseqmK8(Gfx|> z#)dT+Zy!CGH{+89Q&m{rC!PyyIjq?Y9m+ziHPqr6qxfF`+2Qt=-KQ=fE8_j%1#Y2} z>NffN)P;AQIhrE)QQzeqbFS^A8(M1XGuQqTO<=fcH+M~2lzlL$Ao6teb6Mw<&;$U? C61Fb@ literal 0 HcmV?d00001 diff --git a/admin/dialogs/attachment/images/success.gif b/admin/dialogs/attachment/images/success.gif new file mode 100644 index 0000000000000000000000000000000000000000..8d4f3112b9d1df2147ed3b67d9736163dedd11e1 GIT binary patch literal 445 zcmZ?wbhEHb)L_tHxXJ(m|NsC0{`>#WKmY&!`~ULm|4%>v3rzVXIOUh{)L$ageu+>2 zB{Acd%*pZwE#>TlQSztb-KopJH+%!_|l-~7Ag*59?a z{_c7B@6_{ur(gU#_wwKE_y6vG`1j=VzZYNsfBgCX$DjXizW@L859r4KV8@~pia%Kx z85k@WbU+dyKQXY~a+p)#p(E9QVoA}-BeJtDJbfs+R&065YSGzOop#2q7tzUUTK@E- z1Qpqe*fm*b*T-Fam_8!ZPiJg?eRTb9ku+5;xVnw>Wr$>Ce}(b zvq{bgY~#~oR8Cparp&0%zbdUw!o*Z6ds70hP&$teqekA&7*16-748@%Mnl0vSqU6+ zOpICr!NSHY@7SLk+rBLP3&#jWP!Xxbb jiN%_{Rv%uKKTTNF#>acL^G5)OtDBg<-IWs>91PX~W`xy? literal 0 HcmV?d00001 diff --git a/admin/dialogs/attachment/images/success.png b/admin/dialogs/attachment/images/success.png new file mode 100644 index 0000000000000000000000000000000000000000..94f968dc8fd3c7ca8f6cb599d006ef3f23b62c7d GIT binary patch literal 1621 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m{l@EB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMwS&*t9 zlvO-#?>2=9ZF3nBND}m`vLFhHXsTY(OatnYqyQCInmZhe+73JqDfIV%MiQ6rPIL(9V zO~LIJBb<8mfsWA!MJ-ZP!-Rn82gHOYTp$OY^i%VI>AeV;u(vXbonl~MI_~M>7*cWT z%njcRVMh`65C6~Q2yI{K`NBQQh9heAinXE1(JfB=Ul%M;Ke#x6g%L8^f5l4Te zj&BcK1znDIyZS2~eC7F3K+}tVTa$=u*HTU0W4>0#`+Qf%|GkyBERBs#$Y}P@k7@U2 zd#*XsYr~WGeCA1uSK>2HTD)g9mP}Xrpg$+`K&8dx2JS~bjCx(hj5}1;-8qn2_>|?> zp{d+2q{I0hbQS!U-jOut`kSEi+IhQJGmBl4O%se*W?OGKZ0Mp?XmGnRgezL^8vCJ4 z#-ek9(R&%4!h+;oXA~Mtbyie=u#0PDiI#!iX`%2?^@kRL8ma*r6?+*}W4e|_8~J&& z+-+*Ub3{dDcAIF|!MTDz0#78qKYeaeVU$wDOOs3cR=e5FZ*O2e-6xc{Uu=$;!s>*M z>nZ|V>zUp8-oE6^wXjV+_UOvuE&SORr`;3hnBKu~e3rzlY@NRjD|5Ui2t>^@Ve7jy z)2vT>u1vesjJgG`f;l_n`FmbR~b^~{VzXB}7CdU_pt>lO9l=E;X#4<2bZu32r~J^e^%TSISQ_Qm$= z7d{rOo2%^RUGseJkpn9(MWszUQdl(i&RN5PBgZ0d#S7ZipShU3W`>Nsy6C#pCD*KW zyxHW%b?m|pr;dF;L$saa#oaeO`u=>jkXTjl9*cLEvOD!Jdr4ooKJW9gY7?D{e?uM^ z`_}E4`0yR0boA=9>3>WXzUH{&pDfpZ;_2xb=j*pKsk#WyD%J#5t{1#azeB z4SJq8H2*dJVX$xugZHVh{7U`u4@oM|quz5j-hRJi{qwh1k5uNqu`W>3HJG&Y^R}6R z$Gq-HPue$sd${oT*XKO8zN>Oe_%K^bZNm3^-vf7@5X# + + + + + + + +

    +
    + + +
    +
    +
    +
    + +
    +
    + + +
    +
    +
    + : +
    +
    +
    +
    +
    + +
    +
    + : +
    +
    + :x:px  y:px +
    +
    +
    + +
    +
    +
    +
    +
    +
    + + + diff --git a/admin/dialogs/background/background.js b/admin/dialogs/background/background.js new file mode 100644 index 0000000..a847677 --- /dev/null +++ b/admin/dialogs/background/background.js @@ -0,0 +1,377 @@ +(function () { + + var onlineImage, + backupStyle = editor.queryCommandValue('background'); + + window.onload = function () { + initTabs(); + initColorSelector(); + }; + + /* 初始化tab标签 */ + function initTabs() { + var tabs = $G('tabHeads').children; + for (var i = 0; i < tabs.length; i++) { + domUtils.on(tabs[i], "click", function (e) { + var target = e.target || e.srcElement; + for (var j = 0; j < tabs.length; j++) { + if (tabs[j] == target) { + tabs[j].className = "focus"; + var contentId = tabs[j].getAttribute('data-content-id'); + $G(contentId).style.display = "block"; + if (contentId == 'imgManager') { + initImagePanel(); + } + } else { + tabs[j].className = ""; + $G(tabs[j].getAttribute('data-content-id')).style.display = "none"; + } + } + }); + } + } + + /* 初始化颜色设置 */ + function initColorSelector() { + var obj = editor.queryCommandValue('background'); + if (obj) { + var color = obj['background-color'], + repeat = obj['background-repeat'] || 'repeat', + image = obj['background-image'] || '', + position = obj['background-position'] || 'center center', + pos = position.split(' '), + x = parseInt(pos[0]) || 0, + y = parseInt(pos[1]) || 0; + + if (repeat == 'no-repeat' && (x || y)) repeat = 'self'; + + image = image.match(/url[\s]*\(([^\)]*)\)/); + image = image ? image[1] : ''; + updateFormState('colored', color, image, repeat, x, y); + } else { + updateFormState(); + } + + var updateHandler = function () { + updateFormState(); + updateBackground(); + } + domUtils.on($G('nocolorRadio'), 'click', updateBackground); + domUtils.on($G('coloredRadio'), 'click', updateHandler); + domUtils.on($G('url'), 'keyup', function () { + if ($G('url').value && $G('alignment').style.display == "none") { + utils.each($G('repeatType').children, function (item) { + item.selected = ('repeat' == item.getAttribute('value') ? 'selected' : false); + }); + } + updateHandler(); + }); + domUtils.on($G('repeatType'), 'change', updateHandler); + domUtils.on($G('x'), 'keyup', updateBackground); + domUtils.on($G('y'), 'keyup', updateBackground); + + initColorPicker(); + } + + /* 初始化颜色选择器 */ + function initColorPicker() { + var me = editor, + cp = $G("colorPicker"); + + /* 生成颜色选择器ui对象 */ + var popup = new UE.ui.Popup({ + content: new UE.ui.ColorPicker({ + noColorText: me.getLang("clearColor"), + editor: me, + onpickcolor: function (t, color) { + updateFormState('colored', color); + updateBackground(); + UE.ui.Popup.postHide(); + }, + onpicknocolor: function (t, color) { + updateFormState('colored', 'transparent'); + updateBackground(); + UE.ui.Popup.postHide(); + } + }), + editor: me, + onhide: function () { + } + }); + + /* 设置颜色选择器 */ + domUtils.on(cp, "click", function () { + popup.showAnchor(this); + }); + domUtils.on(document, 'mousedown', function (evt) { + var el = evt.target || evt.srcElement; + UE.ui.Popup.postHide(el); + }); + domUtils.on(window, 'scroll', function () { + UE.ui.Popup.postHide(); + }); + } + + /* 初始化在线图片列表 */ + function initImagePanel() { + onlineImage = onlineImage || new OnlineImage('imageList'); + } + + /* 更新背景色设置面板 */ + function updateFormState(radio, color, url, align, x, y) { + var nocolorRadio = $G('nocolorRadio'), + coloredRadio = $G('coloredRadio'); + + if (radio) { + nocolorRadio.checked = (radio == 'colored' ? false : 'checked'); + coloredRadio.checked = (radio == 'colored' ? 'checked' : false); + } + if (color) { + domUtils.setStyle($G("colorPicker"), "background-color", color); + } + + if (url && /^\//.test(url)) { + var a = document.createElement('a'); + a.href = url; + browser.ie && (a.href = a.href); + url = browser.ie ? a.href : (a.protocol + '//' + a.host + a.pathname + a.search + a.hash); + } + + if (url || url === '') { + $G('url').value = url; + } + if (align) { + utils.each($G('repeatType').children, function (item) { + item.selected = (align == item.getAttribute('value') ? 'selected' : false); + }); + } + if (x || y) { + $G('x').value = parseInt(x) || 0; + $G('y').value = parseInt(y) || 0; + } + + $G('alignment').style.display = coloredRadio.checked && $G('url').value ? '' : 'none'; + $G('custom').style.display = coloredRadio.checked && $G('url').value && $G('repeatType').value == 'self' ? '' : 'none'; + } + + /* 更新背景颜色 */ + function updateBackground() { + if ($G('coloredRadio').checked) { + var color = domUtils.getStyle($G("colorPicker"), "background-color"), + bgimg = $G("url").value, + align = $G("repeatType").value, + backgroundObj = { + "background-repeat": "no-repeat", + "background-position": "center center" + }; + + if (color) backgroundObj["background-color"] = color; + if (bgimg) backgroundObj["background-image"] = 'url(' + bgimg + ')'; + if (align == 'self') { + backgroundObj["background-position"] = $G("x").value + "px " + $G("y").value + "px"; + } else if (align == 'repeat-x' || align == 'repeat-y' || align == 'repeat') { + backgroundObj["background-repeat"] = align; + } + + editor.execCommand('background', backgroundObj); + } else { + editor.execCommand('background', null); + } + } + + + /* 在线图片 */ + function OnlineImage(target) { + this.container = utils.isString(target) ? document.getElementById(target) : target; + this.init(); + } + + OnlineImage.prototype = { + init: function () { + this.reset(); + this.initEvents(); + }, + /* 初始化容器 */ + initContainer: function () { + this.container.innerHTML = ''; + this.list = document.createElement('ul'); + this.clearFloat = document.createElement('li'); + + domUtils.addClass(this.list, 'list'); + domUtils.addClass(this.clearFloat, 'clearFloat'); + + this.list.id = 'imageListUl'; + this.list.appendChild(this.clearFloat); + this.container.appendChild(this.list); + }, + /* 初始化滚动事件,滚动到地步自动拉取数据 */ + initEvents: function () { + var _this = this; + + /* 滚动拉取图片 */ + domUtils.on($G('imageList'), 'scroll', function (e) { + var panel = this; + if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) { + _this.getImageData(); + } + }); + /* 选中图片 */ + domUtils.on(this.container, 'click', function (e) { + var target = e.target || e.srcElement, + li = target.parentNode, + nodes = $G('imageListUl').childNodes; + + if (li.tagName.toLowerCase() == 'li') { + updateFormState('nocolor', null, ''); + for (var i = 0, node; node = nodes[i++];) { + if (node == li && !domUtils.hasClass(node, 'selected')) { + domUtils.addClass(node, 'selected'); + updateFormState('colored', null, li.firstChild.getAttribute("_src"), 'repeat'); + } else { + domUtils.removeClasses(node, 'selected'); + } + } + updateBackground(); + } + }); + }, + /* 初始化第一次的数据 */ + initData: function () { + + /* 拉取数据需要使用的值 */ + this.state = 0; + this.listSize = editor.getOpt('imageManagerListSize'); + this.listIndex = 0; + this.listEnd = false; + + /* 第一次拉取数据 */ + this.getImageData(); + }, + /* 重置界面 */ + reset: function () { + this.initContainer(); + this.initData(); + }, + /* 向后台拉取图片列表数据 */ + getImageData: function () { + var _this = this; + + if (!_this.listEnd && !this.isLoadingData) { + this.isLoadingData = true; + var url = editor.getActionUrl(editor.getOpt('imageManagerActionName')), + isJsonp = utils.isCrossDomainUrl(url); + ajax.request(url, { + 'timeout': 100000, + 'dataType': isJsonp ? 'jsonp' : '', + 'data': utils.extend({ + start: this.listIndex, + size: this.listSize + }, editor.queryCommandValue('serverparam')), + 'method': 'get', + 'onsuccess': function (r) { + try { + var json = isJsonp ? r : eval('(' + r.responseText + ')'); + if (json.state == 'SUCCESS') { + _this.pushData(json.list); + _this.listIndex = parseInt(json.start) + parseInt(json.list.length); + if (_this.listIndex >= json.total) { + _this.listEnd = true; + } + _this.isLoadingData = false; + } + } catch (e) { + if (r.responseText.indexOf('ue_separate_ue') != -1) { + var list = r.responseText.split(r.responseText); + _this.pushData(list); + _this.listIndex = parseInt(list.length); + _this.listEnd = true; + _this.isLoadingData = false; + } + } + }, + 'onerror': function () { + _this.isLoadingData = false; + } + }); + } + }, + /* 添加图片到列表界面上 */ + pushData: function (list) { + var i, item, img, icon, _this = this, + urlPrefix = editor.getOpt('imageManagerUrlPrefix'); + for (i = 0; i < list.length; i++) { + if (list[i] && list[i].url) { + item = document.createElement('li'); + img = document.createElement('img'); + icon = document.createElement('span'); + + domUtils.on(img, 'load', (function (image) { + return function () { + _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight); + } + })(img)); + img.width = 113; + img.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=' : '&noCache=') + (+new Date()).toString(36)); + img.setAttribute('_src', urlPrefix + list[i].url); + domUtils.addClass(icon, 'icon'); + + item.appendChild(img); + item.appendChild(icon); + this.list.insertBefore(item, this.clearFloat); + } + } + }, + /* 改变图片大小 */ + scale: function (img, w, h, type) { + var ow = img.width, + oh = img.height; + + if (type == 'justify') { + if (ow >= oh) { + img.width = w; + img.height = h * oh / ow; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w * ow / oh; + img.height = h; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + } else { + if (ow >= oh) { + img.width = w * ow / oh; + img.height = h; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w; + img.height = h * oh / ow; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + } + }, + getInsertList: function () { + var i, lis = this.list.children, list = [], align = getAlign(); + for (i = 0; i < lis.length; i++) { + if (domUtils.hasClass(lis[i], 'selected')) { + var img = lis[i].firstChild, + src = img.getAttribute('_src'); + list.push({ + src: src, + _src: src, + floatStyle: align + }); + } + + } + return list; + } + }; + + dialog.onok = function () { + updateBackground(); + editor.fireEvent('saveScene'); + }; + dialog.oncancel = function () { + editor.execCommand('background', backupStyle); + }; + +})(); \ No newline at end of file diff --git a/admin/dialogs/background/images/bg.png b/admin/dialogs/background/images/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..580be0a01dff4c70c72f78a3f40186660ee8eee0 GIT binary patch literal 2810 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' + this.point.name + ': ' + (Math.round(this.point.percentage * 100) / 100) + ' %'; + } + } + } + } + } +]; diff --git a/admin/dialogs/charts/charts.css b/admin/dialogs/charts/charts.css new file mode 100644 index 0000000..e1435b9 --- /dev/null +++ b/admin/dialogs/charts/charts.css @@ -0,0 +1,165 @@ +html, body { + width: 100%; + height: 100%; + margin: 0; + padding: 0; + overflow-x: hidden; +} + +.main { + width: 100%; + overflow: hidden; +} + +.table-view { + height: 100%; + float: left; + margin: 20px; + width: 40%; +} + +.table-view .table-container { + width: 100%; + margin-bottom: 50px; + overflow: scroll; +} + +.table-view th { + padding: 5px 10px; + background-color: #F7F7F7; +} + +.table-view td { + width: 50px; + text-align: center; + padding: 0; +} + +.table-container input { + width: 40px; + padding: 5px; + border: none; + outline: none; +} + +.table-view caption { + font-size: 18px; + text-align: left; +} + +.charts-view { + /*margin-left: 49%!important;*/ + width: 50%; + margin-left: 49%; + height: 400px; +} + +.charts-container { + border-left: 1px solid #c3c3c3; +} + +.charts-format fieldset { + padding-left: 20px; + margin-bottom: 50px; +} + +.charts-format legend { + padding-left: 10px; + padding-right: 10px; +} + +.format-item-container { + padding: 20px; +} + +.format-item-container label { + display: block; + margin: 10px 0; +} + +.charts-format .data-item { + border: 1px solid black; + outline: none; + padding: 2px 3px; +} + +/* 图表类型 */ + +.charts-type { + margin-top: 50px; + height: 300px; +} + +.scroll-view { + border: 1px solid #c3c3c3; + border-left: none; + border-right: none; + overflow: hidden; +} + +.scroll-container { + margin: 20px; + width: 100%; + overflow: hidden; +} + +.scroll-bed { + width: 10000px; + _margin-top: 20px; + -webkit-transition: margin-left .5s ease; + -moz-transition: margin-left .5s ease; + transition: margin-left .5s ease; +} + +.view-box { + display: inline-block; + *display: inline; + *zoom: 1; + margin-right: 20px; + border: 2px solid white; + line-height: 0; + overflow: hidden; + cursor: pointer; +} + +.view-box img { + border: 1px solid #cecece; +} + +.view-box.selected { + border-color: #7274A7; +} + +.button-container { + margin-bottom: 20px; + text-align: center; +} + +.button-container a { + display: inline-block; + width: 100px; + height: 25px; + line-height: 25px; + border: 1px solid #c2ccd1; + margin-right: 30px; + text-decoration: none; + color: black; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; +} + +.button-container a:HOVER { + background: #fcfcfc; +} + +.button-container a:ACTIVE { + border-top-color: #c2ccd1; + box-shadow: inset 0 5px 4px -4px rgba(49, 49, 64, 0.1); +} + +.edui-charts-not-data { + height: 100px; + line-height: 100px; + text-align: center; +} \ No newline at end of file diff --git a/admin/dialogs/charts/charts.html b/admin/dialogs/charts/charts.html new file mode 100644 index 0000000..17d6826 --- /dev/null +++ b/admin/dialogs/charts/charts.html @@ -0,0 +1,94 @@ + + + + chart + + + + + +
    +
    +

    +
    +

    + +
    +
    + +
    + + +
    +
    +
    +
    + +
    + + + + +
    +
    +
    + +
    + +

    +
    +
    +
    + +
    + +

    +
    +
    +
    + +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + + + + + \ No newline at end of file diff --git a/admin/dialogs/charts/charts.js b/admin/dialogs/charts/charts.js new file mode 100644 index 0000000..0b4e4e7 --- /dev/null +++ b/admin/dialogs/charts/charts.js @@ -0,0 +1,519 @@ +/* + * 图片转换对话框脚本 + **/ + +var tableData = [], + //编辑器页面table + editorTable = null, + chartsConfig = window.typeConfig, + resizeTimer = null, + //初始默认图表类型 + currentChartType = 0; + +window.onload = function () { + + editorTable = domUtils.findParentByTagName(editor.selection.getRange().startContainer, 'table', true); + + //未找到表格, 显示错误页面 + if (!editorTable) { + document.body.innerHTML = "
    未找到数据
    "; + return; + } + + //初始化图表类型选择 + initChartsTypeView(); + renderTable(editorTable); + initEvent(); + initUserConfig(editorTable.getAttribute("data-chart")); + $("#scrollBed .view-box:eq(" + currentChartType + ")").trigger("click"); + updateViewType(currentChartType); + + dialog.addListener("resize", function () { + + if (resizeTimer != null) { + window.clearTimeout(resizeTimer); + } + + resizeTimer = window.setTimeout(function () { + + resizeTimer = null; + + renderCharts(); + + }, 500); + + }); + +}; + +function initChartsTypeView() { + + var contents = []; + + for (var i = 0, len = chartsConfig.length; i < len; i++) { + + contents.push('
    '); + + } + + $("#scrollBed").html(contents.join("")); + +} + +//渲染table, 以便用户修改数据 +function renderTable(table) { + + var tableHtml = []; + + //构造数据 + for (var i = 0, row; row = table.rows[i]; i++) { + + tableData[i] = []; + tableHtml[i] = []; + + for (var j = 0, cell; cell = row.cells[j]; j++) { + + var value = getCellValue(cell); + + if (i > 0 && j > 0) { + value = +value; + } + + if (i === 0 || j === 0) { + tableHtml[i].push('' + value + ''); + } else { + tableHtml[i].push(''); + } + + tableData[i][j] = value; + + } + + tableHtml[i] = tableHtml[i].join(""); + + } + + //draw 表格 + $("#tableContainer").html('' + tableHtml.join("") + '
    '); + +} + +/* + * 根据表格已有的图表属性初始化当前图表属性 + */ +function initUserConfig(config) { + + var parsedConfig = {}; + + if (!config) { + return; + } + + config = config.split(";"); + + $.each(config, function (index, item) { + + item = item.split(":"); + parsedConfig[item[0]] = item[1]; + + }); + + setUserConfig(parsedConfig); + +} + +function initEvent() { + + var cacheValue = null, + //图表类型数 + typeViewCount = chartsConfig.length - 1, + $chartsTypeViewBox = $('#scrollBed .view-box'); + + $(".charts-format").delegate(".format-ctrl", "change", function () { + + renderCharts(); + + }) + + $(".table-view").delegate(".data-item", "focus", function () { + + cacheValue = this.value; + + }).delegate(".data-item", "blur", function () { + + if (this.value !== cacheValue) { + renderCharts(); + } + + cacheValue = null; + + }); + + $("#buttonContainer").delegate("a", "click", function (e) { + + e.preventDefault(); + + if (this.getAttribute("data-title") === 'prev') { + + if (currentChartType > 0) { + currentChartType--; + updateViewType(currentChartType); + } + + } else { + + if (currentChartType < typeViewCount) { + currentChartType++; + updateViewType(currentChartType); + } + + } + + }); + + //图表类型变化 + $('#scrollBed').delegate(".view-box", "click", function (e) { + + var index = $(this).attr("data-chart-type"); + $chartsTypeViewBox.removeClass("selected"); + $($chartsTypeViewBox[index]).addClass("selected"); + + currentChartType = index | 0; + + //饼图, 禁用部分配置 + if (currentChartType === chartsConfig.length - 1) { + + disableNotPieConfig(); + + //启用完整配置 + } else { + + enableNotPieConfig(); + + } + + renderCharts(); + + }); + +} + +function renderCharts() { + + var data = collectData(); + + $('#chartsContainer').highcharts($.extend({}, chartsConfig[currentChartType], { + + credits: { + enabled: false + }, + exporting: { + enabled: false + }, + title: { + text: data.title, + x: -20 //center + }, + subtitle: { + text: data.subTitle, + x: -20 + }, + xAxis: { + title: { + text: data.xTitle + }, + categories: data.categories + }, + yAxis: { + title: { + text: data.yTitle + }, + plotLines: [{ + value: 0, + width: 1, + color: '#808080' + }] + }, + tooltip: { + enabled: true, + valueSuffix: data.suffix + }, + legend: { + layout: 'vertical', + align: 'right', + verticalAlign: 'middle', + borderWidth: 1 + }, + series: data.series + + })); + +} + +function updateViewType(index) { + + $("#scrollBed").css('marginLeft', -index * 324 + 'px'); + +} + +function collectData() { + + var form = document.forms['data-form'], + data = null; + + if (currentChartType !== chartsConfig.length - 1) { + + data = getSeriesAndCategories(); + $.extend(data, getUserConfig()); + + //饼图数据格式 + } else { + data = getSeriesForPieChart(); + data.title = form['title'].value; + data.suffix = form['unit'].value; + } + + return data; + +} + +/** + * 获取用户配置信息 + */ +function getUserConfig() { + + var form = document.forms['data-form'], + info = { + title: form['title'].value, + subTitle: form['sub-title'].value, + xTitle: form['x-title'].value, + yTitle: form['y-title'].value, + suffix: form['unit'].value, + //数据对齐方式 + tableDataFormat: getTableDataFormat(), + //饼图提示文字 + tip: $("#tipInput").val() + }; + + return info; + +} + +function setUserConfig(config) { + + var form = document.forms['data-form']; + + config.title && (form['title'].value = config.title); + config.subTitle && (form['sub-title'].value = config.subTitle); + config.xTitle && (form['x-title'].value = config.xTitle); + config.yTitle && (form['y-title'].value = config.yTitle); + config.suffix && (form['unit'].value = config.suffix); + config.dataFormat == "-1" && (form['charts-format'][1].checked = true); + config.tip && (form['tip'].value = config.tip); + currentChartType = config.chartType || 0; + +} + +function getSeriesAndCategories() { + + var form = document.forms['data-form'], + series = [], + categories = [], + tmp = [], + tableData = getTableData(); + + //反转数据 + if (getTableDataFormat() === "-1") { + + for (var i = 0, len = tableData.length; i < len; i++) { + + for (var j = 0, jlen = tableData[i].length; j < jlen; j++) { + + if (!tmp[j]) { + tmp[j] = []; + } + + tmp[j][i] = tableData[i][j]; + + } + + } + + tableData = tmp; + + } + + categories = tableData[0].slice(1); + + for (var i = 1, data; data = tableData[i]; i++) { + + series.push({ + name: data[0], + data: data.slice(1) + }); + + } + + return { + series: series, + categories: categories + }; + +} + +/* + * 获取数据源数据对齐方式 + */ +function getTableDataFormat() { + + var form = document.forms['data-form'], + items = form['charts-format']; + + return items[0].checked ? items[0].value : items[1].value; + +} + +/* + * 禁用非饼图类型的配置项 + */ +function disableNotPieConfig() { + + updateConfigItem('disable'); + +} + +/* + * 启用非饼图类型的配置项 + */ +function enableNotPieConfig() { + + updateConfigItem('enable'); + +} + +function updateConfigItem(value) { + + var table = $("#showTable")[0], + isDisable = value === 'disable' ? true : false; + + //table中的input处理 + for (var i = 2, row; row = table.rows[i]; i++) { + + for (var j = 1, cell; cell = row.cells[j]; j++) { + + $("input", cell).attr("disabled", isDisable); + + } + + } + + //其他项处理 + $("input.not-pie-item").attr("disabled", isDisable); + $("#tipInput").attr("disabled", !isDisable) + +} + +/* + * 获取饼图数据 + * 饼图的数据只取第一行的 + **/ +function getSeriesForPieChart() { + + var series = { + type: 'pie', + name: $("#tipInput").val(), + data: [] + }, + tableData = getTableData(); + + + for (var j = 1, jlen = tableData[0].length; j < jlen; j++) { + + var title = tableData[0][j], + val = tableData[1][j]; + + series.data.push([title, val]); + + } + + return { + series: [series] + }; + +} + +function getTableData() { + + var table = document.getElementById("showTable"), + xCount = table.rows[0].cells.length - 1, + values = getTableInputValue(); + + for (var i = 0, value; value = values[i]; i++) { + + tableData[Math.floor(i / xCount) + 1][i % xCount + 1] = values[i]; + + } + + return tableData; + +} + +function getTableInputValue() { + + var table = document.getElementById("showTable"), + inputs = table.getElementsByTagName("input"), + values = []; + + for (var i = 0, input; input = inputs[i]; i++) { + values.push(input.value | 0); + } + + return values; + +} + +function getCellValue(cell) { + + var value = utils.trim((cell.innerText || cell.textContent || '')); + + return value.replace(new RegExp(UE.dom.domUtils.fillChar, 'g'), '').replace(/^\s+|\s+$/g, ''); + +} + + +//dialog确认事件 +dialog.onok = function () { + + //收集信息 + var form = document.forms['data-form'], + info = getUserConfig(); + + //添加图表类型 + info.chartType = currentChartType; + + //同步表格数据到编辑器 + syncTableData(); + + //执行图表命令 + editor.execCommand('charts', info); + +}; + +/* + * 同步图表编辑视图的表格数据到编辑器里的原始表格 + */ +function syncTableData() { + + var tableData = getTableData(); + + for (var i = 1, row; row = editorTable.rows[i]; i++) { + + for (var j = 1, cell; cell = row.cells[j]; j++) { + + cell.innerHTML = tableData[i] [j]; + + } + + } + +} \ No newline at end of file diff --git a/admin/dialogs/charts/images/charts0.png b/admin/dialogs/charts/images/charts0.png new file mode 100644 index 0000000000000000000000000000000000000000..9485e5ed8f83888e782eafae6f7505c79671a985 GIT binary patch literal 25306 zcmbTd1yEdF*EQHkAR%ag0Kp-_U4v_oV8H^x-5r8MLkOht;O_43F2P-bLxA884GoRW z<$2!s`)a0Ys{WZukqa04o^#LHvi92R1b^SWgR`HGBJmjkIYKfE0;KO;Ny?Hu}ObSg6$a0f*G@A7B z^af4aLC+9F4oh~~kdTm`U)*laJ0=qa8JdkTjqKc?&suMfBsr&3#$t`1`?zx?g#j}G zF@?od0i%OJ2FL@VPnY1I{=lX473I^5_`MTHd3qDM@94W3d$57tewaD4tn~KS$Mzd++4toDDb^O@XQu9aP_-F zyZ`s+|AWzRIG)DQq%xrZE|rp`VJjez9Y$((EQA9LFI8Z5^weLm7jhUSUro@()yb#lhol$GnYSouhsQ20szZP8S7Rin%3B(p3+@)HufID5~1 z6XYS=#8^0cPz#-m6-nE+SH5Anw6|d#O;PyxD2*o!IZs+#kr|zn-r|*z)6a-cE*P96 z&(!62J5Jq3fIyB{THKD8n~GEmfH6jbgRYd;cW~>lIp#A&hjxZLcBEuS5y?=XH1)&x_17 zB5o_S1QuN`kq)^8mK>?@sjY}zR747uOU|%+|Dp7pUnd*+rw1)G3q=Q|xZN|g<< z;t{~6ZYBTJD}LLC&?MohS`&S`)}p$_8iE^duwo$+zrL;%KeswS0VBL7#$YV+O-kP(W;(&ExqZ zY$kAKWDrMRs>KK@BIt-x59HTw!Aq-^AYjCV-g!M@ozH_}0rGnZEGn>>%lEf1Zb5w* z-z4EnB)~%DzE`pRW2pb@Pw0k=#hTlZlPQ#sn(IZc36#NS@pgvL3gFKT6}kKnNv6RtS#Zz!xl0VOg43$FQ-yk4sCFksU7Bd6$w81F04?lZVQ=zafNtS!3E z2PSjsC_=(BuHZ|lG9B#&A77La?sO+a?IY=M9$vnp`vh+JA-l`}))r@H<@hIIk zD9NarjR%R|`uS3TkSvRMWqM%6BK`;Kl*i2ye=ADQS;~C5e0;7xYXhr=&VlW>zWXXb ztF3yq!V(P+1ywzLT2Dj(6?;8{@zR4a)1d_*ndLvqLM7(Zk zIaF<}&b;$*G};EPg)g`a+Ij1P%)cmf5#zh_60zPrs#{&wlsr0RVZG>#HthI!o&US+ z|F;nJ{|FlYyBGhjv2Eb{)yvSZFcY%g-rhoQ*_-#kCi=O`zeD;UB~^_h{ZMtM8n_AE z18H%_RaM4!hkG9f2L~J8hCJPKF=QZu1daio0b&EG61}8ux)IfqQ&5pWhwk~`*aituAny@P5+n*2#GBYeP&8D@lMb}9{-=ru|8g$Sfnq)}+xl|XQw{UaH^9E66msZ2? zcTR{)gg~A2K;ZZL5pDmOk^JtgdH$3c0ff})O#!NO;g!oT}eUx^JI!#-uwijPTeg4CGtxQswyWlTQ+cJ*=j^h4X{x{9RpicIYU=)zt znY7)}R_o$$Q=P{7!QaRhv{Ikt!;I7Yx76^zJ1uA@M&Bmc#v=|SbiMeO-c+`MI+=kf zSv2&1Rgm9pO4UfwU8Q(b0TXDG^S02o@(b;)$O{vw=`bnN^)iXI0^}7Y1YRDg+1-@$SZ*++7kI8MJpOARBbX` z&-Bw{u7Od#6PQq(avO6|tNgO0r0V^%m;J84-co`%0|6u4_D@=lQU6@wq{12F<-L5^ zG$1s@ya0Z9@V^k34G6REPvNW{&aPT%Y^Mk9k^*l=s9^Tx{wgwSd--Y)R@%LXGY|Y&m8OQzpB)9=`>R>#H%@$Wcxoq*g+Tx zD>BI(7?9yv9uWELiv~LCsSfx>pTv!ZT2@wAbTg@H<`fxOlBP$)?YxuX46E`b>pV>S zm}Zen0+Ms)Yl!!ln4$3a zP5OwU5=n$9p@?V!PJZ+DU5A}@agmFcYn(0t7C}EI?drbup_HY>#H8nCF4;6&HfzAmtZ_dksUN4EcspNuS9ibo2keFWT0O@R;`F8i{uA_rq!Y2v{0W~$ zD$PJ;GtH0o=R)TNg4DLPo0F;hkPy}WiIKo)&0)`IN~qk)xx3&MvNdA~s=}xf>VsIP zoBMJ@M~t6{`viy<0eqVIfGFMGu?Fhl(j(9m!7@mer$ZVPQP(7{IDZdHe0g)6aV8YP z;Va^FHT9Ls>0oknXsEcc_8SD*`^V;43(D;kK}avyZ26V?-10!?fJ7`0yY zHrJJjjoaBq8ZxU6i!V!b$AaN}qd zu173l%~<&;=qD=%KU#b6QXoFKUWmC@7BRu z2F|>$aG4PGg&wBstdVA}0PEt%Gr-8SaJR5}{r&B>bl9983Byw$QXS$&>_bzDvaLKDAoiPGN=qY zq_<_W{g&!V+cEq*1o-&!k06^Q-udX^`BJUNz4Qt!+{xX7px%?!-j&ArNgO@koGqseO_WN%KT^@U-#d#ag?}vWs87 z&k?12HLiEfGxzL!ao(tQ%uvn8gW!Sw(XsIr--|Oes^opvdA6SLPys~E=Rg3sMh%2c z_c&*&cNCH8qGDWDuCeuC{0fcpA-vy;PpdL1L==~FVaS08d{>bTuqo~^Fs*zE{|l-O z0CpFPK9^j-qd&JTpy+@CReQC&YDJG|_SZZHm#!2&1$2KE5%`EG))FhVAYc%+PyQw; zdD|g!brnP^4<`~HS-Uy2TnJy4{C-T1@#4cqV2Q9i|D^y?u^+Y(wqFE*YM6$@!?elT zbOc_KjqWWx-d8CIv@s6G-7VL{&YiSp5$AjT;{_+EjBD@RI_4rR zjl^M*m_QUDC|^uWkCTv0S=DZSzwu7dzQ2#6o%EywhYTVHN(KzF5>Flk1YB%o)&{cC z>ip>Hk5v0x+vj5`FTH~zbW=1xGkE$PleZbXe6HYmwf8hL7ae(>xmubmE^fJRgvb*# zfFZmV69%!Ha5%XgT|JzGl`=?LX`476jPSE=r7O@?MIo0DQPCMw#ldt|o{>MZ()ij4 zL~jj9@$pR$c|f3@zP8ho5HIl?YC$puFJXu7nT1doLE3oHyX=PalZP%BJdqjVjCMU% zc@G|D>RVSmLvQhDd8zR*!l9L;J`5+OS3D*OytyW_I%)jqlJ?l5)=vx6ExOjV_Kqy( z1a^73N5Ez}Sg&7fwV!g^GJouuM-W23uWL@*pJ1+NXBVH==5h~{oAbTf8o4$Pa&z6- zKM=J0nG=vUdy~2t%M={8D|@0yvhqCBr&E(q^j1S<_Px_@FPMGWyXZ4_L8@x!<9p2k zfo>EpDo^Ih;e*X);+F8E<)jOZ*X4@?c-V_=mu*Gk&z#&UdP~%mrH5Yx<|1eX_)_?} zD$>1*OusSPN-O!ybG0Jfs-+QcNbTU9Qu*;?8cO5SMCWq56#MLqZ+8}!gbo8`zwq7c zec_XiNE>2hA{FwMk@gZ`Ip&@iU7aoJA#bV!$ITGDB<{x$hmrYN0i=P&_;;$azkK$0 zaULmiU90yCv#z>A2PXtBf86Tozg8Y~w$uhK?Q>_^?5s+pxO$uVA&M7fKA&Jf%cCBC_cNm7YZgV2l}QH(G|WO&LmS!ZB;*2NUY+-<9u4 zX@tj)%rG;fOXTJV^1~879-)H{-o=rRcg{nNt-OJ03yye`kO=u88J9pC4Py=5(&^u1E4V#m4R}(F4 z@QQpg;X*%bG+CrtWPr>%8s+@~PVTTNYm}O@A0T{lWoE02%Ikl5zN1@O>K-?XWg~DZ zb?K%l(lgpZj7Ir}NL!Rni19}YqPQ#1XIyfET>P2sHSp<0#zxdV$pkTSr>F?FXv_KN zddBOHwqOW9jCj`cx&*Vnm5(~D3cAw!pNJ&M1uvp(X=vS` zRh%rETmVsaWpK!7U7jkUASom*-O6sykJ2$R_upK*0gMMM7aM@)fSQ^E%gD$`tv%P9 z1mvs0s9U)qVR+1~hkCoCuXnSz;YfJL;bytF@KVE8etZb$lyud@xoZQG04e;aqac~~ z3{DRZBSaR>kMXCXre1(hKWaV{bvuGyYB1T%JG|X#Svh!9f>vgG=q3f`*zo`x^P)i| z=w5ZSIrevb$Cc#TTPWb|=x`a!hCz1c{l_oy1Lno2dISZ0`CDkwWCNaY#G$`ciV;LM zSa+q>IF_St{Ay!utZrz&V<*yQyJzYFMcX)`!i$SNuk$5c zol-JH+$zt_2sj)p86#r9n%s73>!S<)nR2fI?$1nc-C1FZ+dmir<&W1E2ksO4si>-6 z&J%)SqGN}Zm=D!poyA$#=PS-$DR1&NrJl9&Tc3v?%!SRqrKP2fk})Z5(S{HNWHddP z=jR?Pb5+&tof@5T0)@FwJtM4U0xOyPrG|950D+E(!FJ$2w*O#%oPWw6gOZEg|q~O(S>QGZsCCPtY zJI$1kZeM+Ddg*&*`0SSuZ*#>z+Iqot(75HL% z_Tf2-hX2>X1ATK`V~EB2a?*3rc;ia@N1z%&_C`fmTTjb-=`N^sca={Lo&-0*`iPEI z??|opP3?WOquuL1p3I@LapzaFgkkWb2bKoFMGgF~GCDeFo2v8m`VMctQq$82QwBp^ zZGCs*l2pT1_}OZSi5eglz!2&OA}be{hQJu}{%JZRf#xq|jYTjlU;uH10Fv`P4PCgf z?vd8U@$8oG#mjR?P4fL9w2+Ah0L~I-od3~KGS^0? z_@qSlN(oK7+Y()z($ZoL2peIt9;XLI!kCh=@#&=XyGPy8P9hoY{hMytXjFx7$pgmj zYa>Iomzm;NB3T)5c_~rEZUF#fz%>-0KXO(JJsfn7hgiQo5&+qX%t~*a;cuQ0Hoh}s zuBbGD#(K;~F9HBpXlZq4!{xh$acIsTGNA8c|r-Xma#((L8&?95exop)-@1_Cr zbNBu=$V_4D55dJ0kO{kAw^5fzAxDBe$A7~XtwBIj;9gd4JRPr|ko|dP88p=&Zz@s{ zAS=H0XYvDM)=7%eb>gXqltFGHms(XxaG?@%Bk zZ~Y0!#FUhB*6BuBO9vhrtJ+*bp@>KB95MbZ(G==N$bL%rC^vH&O-8tUkHeBJ#I_;0XukD#sagb+^_`Rh;D5_ z;ZNhEZ+8ImFq$N{vRf>&8|1gk&vgg zo*e|B0w~|>-%}O@M%bEoTLAbLq;lO8C~5mF)~bFcmv!0=yzGG6jf?ZC$B3<&{SJ;0 zvafCP8|QZEgebKBm&X~j+2ZTZs2H&ID5z+N@zr&W9)~eY7PKyONqmm@pOf9sEh;y? z8)+FK=ne+lzyT)!1zM^4Km$9pDmga+srKD?X98AjKm$x6PK5I5m+z;>5I?Ew z8cwd|=wc{fp;p?IUf=7|KwZfuJ8qqaINe=z9)IOhZFl5sMG!2Du=-H6-#TzH=REi~ zszlFDsP+6Mz9FNBoAWqTpXAAT$%lBO!#OW2eHod;NP9INFj+QWLQV^P-XU?j1zpkIuaPJK#Tdqk86=KE6(Me6$gZucOis!wJ5t<+E zDrmTX^e>y$*9}XvCaQ6DZh71UOiAHzM)a9cSJgH)x98^B%wXF1K8^x$ajM3NX52%f zL%_0CuzGlFS?h*gOp&xq^6MxNZmW%qUKD_a>M|Z9NpNMY?7mn2G;s_t8Il;{G1%WanH5*b|z@%$3zXSyP_kVn)0<{NUUVBVf*< zS79@v_s*`bfNGVG-ewSZn@i#VlB2TrhVwds2QH$(67A)My1u_>ksY2{Q#k$4|~y;CQWDZl5InxTv_`RrXQD^Pon94g_EuAg z@rM+q^mH1m*-9n-&83#;qj1!n28#6=rWZJdp4f@+B@W{dCRhgD9!t?(Ul1*RxkQcSx=8d zSKoQ$qn9a15)-}gy9-nHY0NAjVF1YgXI48>(w>+k*Q~zZo|r-P6MB_zzm?wVBM1Y= z^76TqR*bldQo7EN5ti#?L@G0LQ*l*jx$CC8v|hYCHgSKCqW}rrgiAI5J^M1G{GblunX0)EA?U18WIKK zDMP8{$=ZFB?@9*eUnMt3J-yThUYx+4?PPI{pPtWP<0)T%{PZ`*&PVkR2CCkP*q{{= z=s2kNkAMrm<7sGD`#r|wr*~HQO@uxQw^5FpA<;3xkhPYEle?Rdu49Ry`LD84jemf9_Iy-wP zMidqDMGowY<=vQ++&LV2#J-P@*DJWYePVxdSi0}CH~YRjLLRjX5U&-5p1aMZ#xiYWnN$p2H5r??s!u!ms9U$njH+ zuGJZ8p=e}uJehOYRUUu}OX4|-3@64{{LIN%$i|oC@yX-f(?=a2XI4XfrOh{u&m9K8 zl&We}z}WQiWI)XUwl7w%(c$axYbsA3p3e#z*iUgXwyK*%;JaRkPMXU;Z1q^k_mO>! zt&X2vXh6~=ezyOuhTd4oQ~con5OGAK->;5=(G$L9MuGAXSxkTeXz9f05P_>gxQ-tT znRJ@i|3!Wcj|UXo`p}+oUT#?2c}+ULL$beCh;aM*x{tVcYHOQP(2up{2Bme~ zfbG#~NB=}MI+Fn9Djo2v8pI69$FbDOQx($dyCRXh39rNX&*NPEn3P#Eg7h}Bo}b5z zk#6_gB-pvxga&p$7QfM7Ow(ZYsZEK@X`5{bZCw^vs)g$Td{}6w>m&B0wZE<&`J8SK zZ#4pB0j>R`&dL{q?`gGp;n|FVRr0XNoV44@RUC!{&r4UbtVivJ*FN(Bhkgl&3Vp>; z@z|7MztQNX9 zVn^Nt28bcuOxAeS!}a3UgGlL(^^KHNeKWnkb$el;6FvV!{PM= zy;bi=4r=%^^jILaHsw`y+e*+CGdOo$Ak~?%u^yZJ3rmkgG7}kz-)2>jrW`8jY?tKa z6&K1LI($fj$>9P3ZQ3Q25{~be8=gJAK+G`|fvwDo znqjbZq@w}1q=!Rayx1dtmE9kx6%>U-0E+~02**O^&BaUbeI1R+<5ct4x$K-ql_ z4!K+aX_B|{G;f_`-SWt~W2IQ=LS9S^`p|iK5#dkaoU1TveAbO>IN9S^V??&A~(a z#p%64gN`E-bpexXB`KZdwpy+$0|AII6ZdqLS0w3@*P*7e-SMwNI-0w8VZ{9~C%}ndR)g1j?GX z=)%^www+^1&J~eO@85#Q53Fr#*(=f+_0ed7b2&Mj8yks>AAm52FdUDO%&W8oBATY` z9l?IX`zN4(+5AmwTQbK6FK0d~kqXc#P5(OtbfJMpsaru{b6L0sC#}{E`#mSplT2h1 zD7eZM=tf!WDax9`1M>(nzI$G4<(mQb^#=_pVtnxV=g1=@=EGsaLsQ1a_IL;D;d@F;f~Gq~bYnCa-Se_AKJ!B&?i{#r@Jo-fcS&+^1}h%7;e0^%AT zxJBX{9p(_~Y&%Th zO%(5m-=4j+Jw1CFoZzIVbf$R$OLmYXC(Y~c(+dkRDnO&J$m0#gq}=Sw1ejT%pa<|q zqnS7n1c!*IDAoU`m#CZP-UDU!|5U~`6106b+Bqj?^$=aSq9k?O>V(l=%X?PVv85D9 zx3hDeIAu0g0a{EsrT?EktuW?@#J?RLc0L@t`+tfsdfna zHc(l+9v#3VEW3HPKf>_*iuciCYIy&uJ$!6t_A!U;?Em?5DoSODc`hWFXgLNE)-jly zszEY2x8AE^^i>>N?L@bZfa>u#k8@D-!ZO0@Vo>CKJwMGr$tWcRh#L_mjvWPPlPB{B zMHx7;FF>--YdiX7H zq3qkM!_2_=-&4cm&b)P)S*_jCld9W9z7p&n=hFf0VW*u;mOZLp7Nz??=F-q7JJsLZW?u4&P0k{F zRb72)F_9%vUtZqKH8nUW`}WnI)3aeUuY=E9>pk5WV6$|7bfPKK4au&HaXeny&jY^i zvLj}emaO~(;tG^gZe$dF2V1lswHeFEMXYwKpY;`;X=<*lmk_4~UXlVGd_59}j)qO7 z9Il>S#5kDK^=YRYo2H;3#XSWQ7g-^QriIXJUQ_gz;I>@hV zlcJccH0%KqmhjhOt4CiS^rqJ;tF>oX1*o=dlvs`2486Q5Sp-P`_;YBAbQU2 z-^muChsz$5_QfljF-hp>zlGV}ylpzrSU~r`xq+_SJ)|^q*W)*{`j`W`OG!$SjX2qr zRFLq(SN>;A0}S%@K&n(5=D_UZ`;hnbz=HG={7#^=~1)zNB*fY=~^!%Z6oGjsK!nV^9HMYN z4TYeLr3ujRziIJIdKu`mck=LndasBnlxE#inj-ymgHOxtx;X?wR%&%o?&{h5my8DG z>+AO+#n%7ych12(`p4M&0w@KXby@3K3%%SAM8qv7PY(QAKcI zOLcV`0MyAaONEAT;if6ZYd>fmRM+s-THdAhd@RiX4xrEjnUOlB@4GJ?-1LF^`^kZ%uI4SfXX9C$3AfNJ<7w0F`rW+2f zJ*Xor3H)*aCabW}#|Ivpo4@!RdEEPaFtwHonWDz*+#$hFeCAnGvxCSo?Qf>|fB{i#E>$qfDeWmhUx`zA;1LvQ9LY z)~!$B0n834jTSCf`a;ML8x#(7*VwOT+iyNdzV)!l41Ki(V@Ra_Js52UuCfWqlH(a( z0@}@T8jsN;-7XA-?YxkObh6qT_h0r4udWQ7%titEoIQa@lN*m&MiRa8gZaJhS#pGs zXfB>)Vg%8RVsgFf{D6MttlQo^v5AwHDab-bXAWv*Bj)NM0VY@~LQsr`n^B!R){z%T z&|(w&c{Vkr-dmCrAQb+2xB*Z!!@H#1r71Ub-!G7(0=Ub(Cv07GevNDddt}WgrzX@9 z?K!hf9s7e!bhp?_zp6_WMg8eVy|V7EO#i#x1)=aMGB$$Laa5Ht2~abjle>4b5mRU@ z?Fc>6xVWrmdkc6WP)NJF?7BFNzb-?XXcCz0Rb}sSu&8iw-D}B7^Qt`IIf`#L-byf~ zw^n;DDrw>)c{iF7`Ge&B@7qCh^ffA)gMogE6wKeD+ie!t@s-sd^M+94RB`+e$L0dr zi3gm02rB7Fo@D~mYI>W?3c&53UF!n4xVC+)NoTgL8vGgzbKpcK1;#iXo@yj@Y?1ze zhUyXVyIOnpg;F?CmCv-QeVgs|=fVEWF+|_EMzizOcm0@$Gh3_?t4Z@xpA16SUZa?8 zt4Uoh_D&^xF5rRt)w_hCgnk>i(Jok`lC}408S#2gND8HcNmcn{$a&WrLyz;U+3?3< zTB)=cfa^b1dA&`@j-hzF=u*7>{qyjUTbtm%3L1Q#cB~;tBjX%_swF(V+UI(|;bLkP{~baV(9H5?X|(eQp~e8>vsvXvxNA2W zH3cvllDTU}7M@t5xgF@=fd|LcD!c3smEP*>S3fj|&{}SLc`C}vu>D?jkct!=YJcwo z6DfiP(+%_+wvDx*ir)sj2{u4^k0B}v*pgXH@^EnVk4#E0;({+dm|v4_)i(RftJ|-* zZ*G1BVYXr8o5uFN7kB}*ZlM3Rzz3aI0Y#0JWl-x}|JTRyRz0BM8_P5(*K%Q3tR;++ zO!(fE{x54T_ZJlapfuL2kE+#gfj?I=KXBFo1BKp+FO(1GXz?zB z%ncmN6XKe#e6QUYbT3MH_pRQ@Gl1dU7ao0xhx9Q{l$XJu@AH~D^07Q!tC>cIJ=ND6 zfLg>`U=>h{zHToGawVPBvJWdx&~0lphWI}1IHu~es28I8W3UNh5PbVo39xM-{^1Um zdhk3P*GPM?#yw8&FMVig5()ZFlEI!sBhqp3rz@*KNu5sw^H%>HFSws1?+ArOkse#_GAT<_6r6J8P^n-`ne>kn@vv_R5%89Ao98`z_`k4gs z=+$-GB1vZ(mu~gkA-}wp#$Qxb1!X9iCA06E6}fnLD+@ z$9$eoWauF5U{|wM!Z5>iT9$Kh-Aa**^ZF8~$HKn(Z@;Se+*V%!SwJ@tZWeCN404HF}-Tnq%h%ATl0Rb zZyaLby4zbuzRPTT_vL(r7c6gzh<%abR+1Q}|6;Qbup9>kVHEWnwIJP&Va4{OG=Y}^QX1rUw_jcySDS9DFjP5hz_2P!AUJc!X=(y&Myl7hg@autHpPoWu=Vc<5!E^PVzhJDBA~9< z#26dL$NBi7Uu5lFwqZJ{NZLw`j}jK*>nr(Z#;@kMZRLuu*%b~AhPBD}c~<9?BMEls zKxt!I;5xd9hlk*)DNA719a56m$_;*gL)LT889O@N0oDXZSF`163Vta$GrI;Bw<+za zC*<5BblHnAx#=>J4Hy9$lC(8m`&BeViA*yx$T@~36db0Rm$$5#fN;ef9uihfJ);F2 z2he1#*uV3pipE($Lk5VHaLooq{ZWubiF8`R{TjI2SQtlLr{zjjMn*x*KRjj{QdsC` zI*dO3N;N|4e|pT=s4G(j-`Hs1g!OnM{S3$Nm<2&^_h+9}No13%CmoR>btAL6im~P+VCYd^~ z&kn~Sw8WR9n~TC?VN_-Bk(7xAUueP}zxUr(iC^dB`d-oc#+zV3x3qaCaCxqsU#lD& zTg6duu0hQBP-=)edl*28kH%WAoltN5<4#PPwF0uNvyy_4N!`?R$4PTzYmT|9DD$3( zY?bcy5|BiJJT&4^Mh`>5QQnv>ww1+?Mp^J9tIrraUYK6^J#{QPw?4ik4Tv2m9=_;TtPV;)SPy{S4vh*C;V4HZf0Rt~gkrmU zd|7%lc2WAX#ZAeg2)hF9mIEm6d+k8q_M00*$-YE7+YNRA|NX1|6PJ8SF=V_~9B?wj z^GX(U^dC74kaGkG<)4el{u7eJCH;Ozjaht}{15fbxcdO0mOJ>36BRDXM#I0ziWp1| zoMU=_KM}Vu#9p|uSQoRt4zpXP$Tk=;!hPzo z(c+Q-G0er+)MiEjoB=^vFGq(GR6VM`rz$VvJH2NoWz}X;e1vb9Tp~bLF26zU5?I0q zh9y9VH4_qlc&+Efh#7sQ7I4f$xO(1E{0WT3d(4vy-fh?##zKAOD5Sg?TOh*;aOPeTP#rqW$!8wv5hPHxOuIm}|c6=8lOw`KSrVZ7(T&2dH8lrz{#Px&lnyhBHSt&{9U z3Qnu}!ELin&1~AIJn{8G$a9+;Of!XcUW;Wv?(?;sbKE@I-oC4s7+baP^4Eyf06ONi zzBh2{!M{QWqI6># z7ND2zH6^m3dKJ%>UxQRkvj+ad+>(et`l_#VOPrq8dykYHun~rE(kJ((ZKD(%V;Z6FAX?Gc^ z+`C1UJcGDbB?Pnl)kW=NBBZ1$;Q0qM)cL(29KUVqQ z1IQIkAd3Mx6CnODQJ>w{dwb-_{1rBnpT9hKE^6?5Uaab)>~A$HUS8neRi=te~~axGL*g+ zcv-RkwV?#a-Ezo5vfdq4!av~V4-1Ho-vubor%N=(0hj%XCCYsCodF+BHGx@x%f&+0 zieatCcq)pTQ&lyswe2e$9YiClfKHX|w>508+qU@i^pBUNnY!xK88K&+Zp}Rt4*hasG+xm6jz&adU$K@BY-H zbJ3$@>dH5GnENX(g;yb109p(*gk4v0ac@zO>dgdrZ>sWOt|^@i!9WI3EnG;E9Blu| z;XtY5Qr1dMpdA~YwwD{BLIH%8O7M<$386zk`&0w_dm;i}n`gEP$c~NOm{Gf-{zXqe z@`fGhQzD^>%ko&TnSsv8)c>%~fH;kqv`;p8R#|ns3SnT)-tU;e#*$VIAYzlYh8LQ~ zaW^*5>s#LX`O6Z2_)$Jm9BV>9j$uS6A8YoY=b(H&1l>VluP0#@ajy!2 zRef_3@C}ax8|M-o&6ASv%V>+5qLrPcRLxNTVG=W`2KZS-;wPV{BRtz;^73Ir39*p@ zFE$F%Yg>U@s*m>V9y_S6_MfN#Fu^0sJO5B72?xHcAl2Vi=l}%|5Vy|YYyUJk;`9{8 z)AK1Wxsi7$h8h?(|0QUDex0WtV)ZX#UjvyK|03V13Bq_n9stkPkq|E>xjLQy)K_-- zfbO^VGg6H5fjv#&>a+09VnIf_Zd-FxRTM-p9W4B}_XUfV5z7<2g9cFNja1)!rL^1h z`T8anRf6M^Z}Pl}mWC$ih!GJt*1gW^D*f)?BJJe0SBftvnkVGdl%6r-1ds!Ow)BXP zA|dawp4OYS9%?9buShzQ3go|4+2EMWeTdD;yL%8CGyH3BXa|ac0U#C}{JT462HvgQ zQ6oESoG0n5Rl9U%q=Z7-VVS)gAYXjb@*$HRb4RiU{J!~FBHr6#(#H zZr?AB;z#>)m$hH(o8%8~Gh@&a$xy;5Q0lyH$JfjeCxC|G2pwqfCUN)Kkrqz)=Nt@GJmb_v`KX?JfT`1{xmeZMjD&OP;?1^Pb}Sk+ zomU+p$>n7bm+_T|;1M^wgWr39c~%FhM!ETG&6=O!u|HJ! za|vmwU~r+sh1nM8k&w{A#RY4bw%cZ>|7wYb+kVAC#4of}ZNb}>GW~}*4*@!phaZdt z@A+M(PA)HZ%M3s3uR5^cOr|Ebnl0o|jokC|wz8|usYCrAnU0Y7eJL%r{;LJpU_c^z z*3Q@X`F{^jo;!=pc}1f_9mvtiS?r$9N~rFX@0Xw!>ZCp#&GNq4U6(R&19y0Gc_s@4P;wI0{UpH;d5;h-oY6#?M>rMivq!*P*OGcY(Woy_RdaqW5hZHie)W}B z1nbQ~cbMJd%`K3@A;+?0^P1CLf$1bi6oqS)Y&U72B;bd97bm>9ec>g8<0t&?4!e8P z<3~$BK**Uk|04UtOwEc+ia4-mBq_1$J-_P5GoUBxnL%kH6<{RUt6GIYkY^w{((BM- zUW}*^@~#-2zYxoW>YK z4LMcKsF@;i?Q&zQ69B^}{l3}5+z<%=I8Bj6oRln>UcLwxkYF*%YFZ(JtG(B`r&cFp zJq!IRS*J#7YK!I>ILaE}N1z7uWU91#&A$7K^}Krc03Q?c;_!Ob8!M+4RgI$wAP%Y( z*GeBKvP$#YzpTF}0GBL)YOOB>Dn?SXH)j*WJ56R4%4xmOI^HWudSgYhPfpHXyv!_n zh!A5aB?L>aKVPCW+5F2z#lRp6HvKLyfzGO)VKn=Ic@8$ahUz zXa7-hdN}zcTc^ejG_1LN9^3B6* zN7?S1#HNu_yQS`oeGTWInF1MlY5u+htG`_nx~^Q3ib8ds z&SMMs(zY#8H59-NfBJN3#@ASn!}+ULN|u(tq~n7^AvUq4?9hKSUKr=U@d6 z_zDfeqB%Tz--@f(`f2iwbWf{Uuz*R0-wHrSX z@Du6)L1hxqC6`^E1E+$jI3LntGzRXh|NI@0Mn_aI5XKgi7ZJ%9N>wA=-DETWUeh&& zwf7qddYZ9WEwz*o3Mq8_qH*wuR`zyO@^6FZU;e35*7eo@Vlc5 z`3JMG*IsjX*Q64LY{**P%CjzU1L2>6fRN`^jMK?SU()}pxvPq+>S@;t3F%T&Y7eK=nsoGt?u8cZQsH=epe&BwG-H=< zb2r2pt{QbCK(kFs-MM|*f}*A(Jv8MIW^B{b4(%fhcJU#EVGFi5e9;V$B~Ui8S@w~} zo*b^Awx0LS6~_31 zd!NnfwW7Ixdo8bhU9@&FLK8!hprMV4x#4)dfa=pH*EE1Sd z>LpI6uCk8|+0{^$_?h#mZ*1o`hln&QVu(efopP*?<#5~vvbqCo00?RCzhG^f#O%;Z zzfVW}4>8Wa6+=f411apVi76ms^zyESdWZxq5bfnkhV6a zq2qCiGh!H8c#f{cy_Aw(+Kv!)+4-=1cE{dVq}o)kG*WI&AXmwQ)ix?YHLB12#sEO= zO}m>wb_E}XSOE|q`=s3)0id?BXRNdjJ$9NzJTj*000#DLOL_nNVb-`PGwN(*1B4~p z%_&fSSmx)8AN*n$x*>&(qW_D50kT;8W_f@w`HB0s3&vGE*#)gUwJr2WfiieZN^z2q zVP8pOnzrRuh}FgrJ)Y*4ocJYm-b6HQD!A7>Tm*F%h|S6<*r(UdD8S{>{0Hp3b#~~8 zD+yT`H}xY|Z`#8?WjdCLBiMB!xUudTGPqwhoF@wacpCs{dAzz~W3~KYK8rgUblvtA@~&hQ z1Xv(Gi{XxG2VwNPxVg>he=?kFRCI>U$AU;?B)@?LGII4#@;L#R;7Esk`)$2{!%l4{ zhrriQ(y3;1C zh@b{{27mZOQErwXmJtLsq-qt(96i93EX`+RMpZ2}E^QHk;QLHjtLPUxu4kXZ+nWD9jB(P&rWvCOg>$hUyzVJVSPstV-A1q0uKjg zu7)-M{^t*`?32-@Rn6}8&@ffY(pH_@akWATkddg(t+ASiiy z6?w5J%3~^J(sX?u|8~NSEw&=;)fS*0-=cNmi(_}oK;#m z)mj>(FE#SMPMs}ue>#u5`!)#Ed*X7}jj!~h8Dw)K#s{^4@O&R0NUT%INJvRMXobAFNrxLn2Wjrxo%q5-FZZ%yp|<7B`@j zdiC8=hEO(x5e4~bO8+TcO)qAf4-O6l@g%Pg=FiNCWUjDmnX3qJTAtlK^WEB{MGk1? z%+#7t<$OvY!5}sq0(4i#^sGFtb)3!qtAkswGWJH!kW;>}RL`)T1;2OMJ!FcYL^=ziF3aQUIr|C>i4SSsOu zta^Ah4RC*ep5&Z=vY`oh`#7;?M`uvn2Jz_qr-a*yod|5~UlPsfF;46P0_*~n&n}$0 zE6T2}d}X9j%9#c>n*m^Da0SV;dmYTCk!Q-JWW6dV>rvENs;zduA~#~1kDd8WAd}JL z7g%?awLvojSfqgVvA2xt&91JQ=5#Yp9ufW(6HCv)oAwmAUr>*!D6dOw#$@#ov`tu` zZKcdQ9AytBK47SYb))3lbDyJPh2E)JI(Bi0m|SBMIlZh9WaWSOr8GGt;pf05vAZyR zgD84-2S;lKPE7X2+S;1)KX!uv^!d1r|M=Y-KkpBk-xp7L@?Oa18_j@4|z@f z$IXL=P6#p3mT*ukpE3Z|&r`t&4f%UwSPCmUA(r!P%fy0C%M5 ztNV7}V9paxPPU>VF14=hQ4f1mP2UZ<-turTp)5Qx;L%>hatpIEJ{FbcqO%{?GSvA& zXZAzAJS(dO2E(z%bNWpPS2r`uy%@bVmDT zN}~PBom%ed9#r7(WU4ihO@dMlFh|wVXeJ0FfVLx2N*QlGQ>c_Q{b3TI@oB1mYXSw+ zh%jsLnQ6r_MAgHB2|IC$q}kw7RQRQ!Y{n&W|CE6Nti3l5_7OflYG-6p^I(;vw54Qk zR_b7-ra|exjKh10Yu}8r6^E*Iy{GkSN^dL5YwI<--{&PZE)4*}{ZF~ruJQ~E z7jn&>Q&|yYza1{8mZGhtBLKQyNwz0H?SX3U1n}UmiL`fwlUaTnuU)rKSWmnn#<9Qw zI#$Fmeg5nM4z{$q75s;G{K_K^nR*8_gjs_o~4H62qhqR@tC?10~PE@j6xJfq|AI?Q2(Il^_I;z zV)hr$z3t_d*MJ!UvQ2w?JWcFMRgEyNFer;J@OGCSJaf3IDlvD!s zEj{xgtT2(`@2jdXP*8lV^w?#*BMk49wd}+4^!~)%HBwzdX!fi6&W4S`zw*lD(s^*# zVP<*5hWOfJu=IQaS6^5bDQ}HU20*{ChrORAC~N=e1lLKYo?qJ5*L=z0zht6y+X6d< z_C7U1d^w3(%0VCq?_piSqIwIS?dUp>lfh>rCk&nb-8}iEl(#ZQB&BgxIMf;5-jK3Q zL{cL9#pE2tUNni}HW%pne9d01R#)f1j*z@$8LW-VNSYrcn6({2MC<4jTXRUip?E`z zcQ^SPuWW{*kbrdn-N!2dIC0heMkRL!zp4Yj%fz0(9iRTKtu6M}vtD60x8GYU6O9cC zYdN!{ZYozARsP@ODCpDm+wT|H%{2u=Sd!8krTK#F2jD*Mf^hSyPR>$?KNl)w1ulT%LBmdu4IP_u^=QqWa|9 z+_UOb2+cyH6Qe~W{TPV%HzF1hQpK!VN^^dx~T5%Ni7n{`N*7D{iW8uI%%X0 zn)S1{^(*_^%gkON8k(!J<0F{9Ig=oP`K z>Sy`{)*owcG{y#&z2>AXrM~|Zx3Vy=-Hv0;PJd>Zn}$uOh2y6@eiizDswmq@VLqR( zd-qe{cwVIeY_b3kv7;A(3$M@NF|P=$Jqc*mxX#BuPo7j|;=$hJ$lWaO(QCXNX;UtF z)SJ~Lx~=tfL9?KkhMR@kc4DLm89G9sOL2CF9LzEDYk_ljN!xGJ&w0-eqH;Rlq+t5D zZfpBC-n>E+zg2xYw?5}MFr)eVAf%_VRvHTHKOJD8Rp;vVGct&xUU~S7*hep;#xanbwFpI=E_T5m~fzpH${p#s7ySG(y| zx2Ml<6+t1mwK>s9^Dtidl^_Xp)D{Z~^nbmw#c@5nraWK!%eDWpNxqF%Mw6)n*+!WE2b zu{3Q^UCfc6ZL$$(2P5)|3G~VBR|(kA4fyW33_ z@9i$fDic_D1raV0fL%h6^m*c-@4L~;x9yL@KIVPB3gQAj+4;rJGiPNv(qTqVqh1j* zV`A*R`&r8O+_$1^l`;KC2CFQAH3PL9>oQXSKg9{7)N$~QYAX?>PrP34M)1Z?X4^;4>L!X zlzqq6ghLmXS(6>a&6ti)GqKIRd2*_)#TSo#M}ok>MVTiFltc9T`WR%S(xOiN`fW^j zv4KNlwjv%puZ|C*`pV7@944FAD^D@jOws1dvRP^`iG|~zuh9MzA9fwi}UmMhw2RqU+~m@ zZOxxA>abnDZ}M9KV#n>@yr57WNVnQ4FWK+V9?};QIh++k3t)=2c(jV7M zMZ6FQ9NO%X%%Ez;8%T*dK~Gn!+Iv2%%QEX&+pX8)ggif%66G(5!ei<#^DNMB*tj1* zZhU8{I@#hCBm@oakwRNel?Bbk&ZWo~&Oahgrk_>6t16+24HWJ9j29yW7HefmLJ@@l z*-j3=AR}hM^hz{_G<2>;szpmL6o1M<70;_h_E$;9{7&oYuoSw2z*KHeVTHN(L-Uk1 zrJueIDHmSl{FY=QZCvpkt`jk!SB?#AVi$s%@63LwtJkvk^pqRixPznSTCWK0(b$v2 z4|2SEqeg>*PYr1pvT8qs+24=_!^FtW#ys+pS+V+vC-vHlX|l-vX=6iUCgQK4AVfqx zt8sN~QnRpdf!E4(2?cE4U7i-; zZWQ5CDp(X$h-oNoDzV@L2JxZW)?)EXw`A(J?p{Jr46~zImO2M(FbAJ74fS8#8Gf}b z{9B!o>7vfa!bzii>x--&&M z!}h2rUU)xW*HY!<n5^9H;F<)n>mkE7CE3y7X4`;~kskkE`_{L^e*NFK3!ZeZck?jk{l?IC_3$8} z=Kr?M1u@od*Mil6mF7OjQCyz)Tv!$!fpR^~J9lPh4UQPm9W*P0z>`L$pKIopzVIlr zT{^l?5bCdwC?WvDPV&cuS_TF?J-)_{yCo6&53PL`;%@Ga_N@rGRu+g2)t0YMtNv8d zub-@ncL^$r7)#5Zf@Q(jQ^&-%9m8!@DszVCmK-?{j?yl2h!Xiu=IN^G{EGD;~^&TD;n7%L>*8PMNK?CZF3Aqz#|{ zP!aE{1{DO&GN0G*cXFUZe7}*#O31!)dOYN=a~7_o4|X&oT>XZw?e3rJ|630wOb8$k z_&S0ONv6Uu+4dacGnW7PLqX;gc2^XH1xf0Fm<2%+|N8wTF;Kv4UlY>pQe`QkhX+AU z5RjgOPRYi9Ku`cgb9FM@le2O9KmkK3D(4VTFAV5iY=EU zd_}fEyn|&bwsN!iRzdSCwN8yJ%Q<*XS#R2ywpKrP2M2gDEk#z__#Lrw40~klE3rHnWdj$ z*kOFZyUdzu{kM}HU;EB2*!Kkd@-xq7W1-FUnL6{tms{AlEdl*syR7k3kGT8QE%yE^DIc?}{xxwWI9*#q9HHFpG|nL>?!Mj136(Y8W7`i?Itup` z++%6B#{;zH{y0!juD*Q7qoDh-)Qy(mXI$D%R}om>Ybwo_SFyzW2ob_LajMN=N-^@h zuE+A}b+dAv#fk29^13hKW*i0~v{3oM?n6=^4A^-WC8Tl*IL+qveB{- z)KvWWbB~?EmdxMGG+6H#J9!dLw_TR=t-`eu?rExEs&W(7e*FJHY%f#1%J zU_t(cEoV=#`My+{Omo*oTGF)GU1&!fppfIr=3gU#8e>2xTiS_fvVPkrOyMMGf!m64 z^hx}Zzv@e4czKSJv~QFY$blizdqR?j+u`HYsS7X4IM)sXk16h@Y|CDMCt+MtSSa4f zw}e;!RTL1|fll8v9wg)`O5k?@uOP3B^!nZKs2fjP)k4ttb-I#>|D@fUs>!GE_gLHx zfeiIGzI!Pj;)Rqu1HBOl%)o&7JP3litvl^}KpV#r&9F1m^@kAl8XkIexT?A`eKUtc z(7f^Ao37+o^vln1f`Q`+WxZuYy#)@npR7Na>OA;%!T#`5DMx%0sAt|DyAR&!}AV_zMlyo-?NC-+xs5H{u-QC^Y-QCQ2_&ttbr1*E@XowX+;QF4eLeGCR$2@bjTjArAj}WqBJvP~hyXzdiKq|2Gwy$H zD8LWo&yr#y5d8jMVr_ajc;=CnxSA~lVYS@=xpT}!?d`Zk*O{$D)Y@VDeK%*#g`U_ zFQR{}W=cI~Y{f;4_e5Apd|NND=TH@g+x+^?xqJVu3;&JY+FJad0BbDEylq>pUyWuQ z=wLi?#wm7);3u9SG8ngu$p7P`q8Ku3OfLfk5(JgBMnZa4Hs2=AIG$p}Ti`>GC-Ykw zR;=rre+cRLfBhK!auyP-t)i775F+hz%hwh- z+FItgNvfumIg>ATfA4}!I(TJ?(qPmfC|Jt{$8uQCb2}^DZH%H9zq7l%cyvPNais-G zQ6M7NA9x4j(%+qvARHjB_b0%w=i#us8)w3P%h9aSH~qZBSxWTf{PTy(*S}nwU zcOOMj2XjLVv=#hh>(A%K1&VgjvW{V-wCmZe5qxeZLf{?0^M%KoH#YAz<6ZEdAcQ*qwVQ6_$8<&ooE zvI}3R)po1wIgFCY1<)N-Pxe!68XP-oKXKA}gLRJrj7On{1xqher6G`>u%ddUYzny}flCd7is&!79T$6*C zwI`{o8`}e|%#ztUy*2}_$GK#!Tj%z8-kNR<*c{W5uEnmjWNt7s9SjE?|=)hh6%TGr3>Wn2*JbrKr!zQ<~NF0}L`kwLmEcGKo z_3yyUP0pn>j#h72B+8o{b6`5tIyx%-$WZ=Ya#T;rx>$iW3-Uk|g=p+2*t6mg16XZE zDG9PNxrQSxi_5SZwr+z>FT0{u|6R-LrBjkyAP3C(GnH4`e6IY27ASuH( zx+WRDNz{#@d44y@@2hIc6Z*) zOs4@Y%J$8(ZL>$vX(HHjNUZi9)7;qQqd79NBW*|joA_ORiMaacbl5q!#sfj$4na>2 zw&%#B&i!QdGVBG!q$RGw^>=%aCYa}fWzBfLUSu;be)kGKhjLK550U5j05(!aG%u2> zFSZ!UGpU6lSK;jNXZSqTO%~ajypwVmCgKf6RrH&`ehNt1-|h7!FkOX0xq9`lAt+HS z(Dy!aQ2i4>{6(}~h4<-UK4qcqT$ z3yt$=COkggVv`<3zb~kz`V{Egt{|3SXBaSi?AZD`Q)bXj5K@BVx#r{N_bV!jZWayd z@(&4dTvn#*5)9t@s<}R=0HT|nxc$9(K>UeO7%N{WK5C;#W#T~40iO4ynQ|3oy{MiJCV%hawta@Jq_LPlDR<)_mnVPNS4ePFUO|DeQ4}_L zmPNfn*1*)(1fCh5=_1Qbn;nzo@=3Bp$2smldP*>bC-t`qSM~h$Mo*=PXv>H zlVA&u$6^>}TA?s07?^A8o`zf!9tSGTuPROO(Oy?>H$}6b8Dv92V3h~*zon2SJWM1H z*6N|p>3X9K|LrlT>N06FV@81NecEYADTIibd{s(n?~48tXMvP`5VFgnq-@JZcsZ_W zUs1r_uX?I?*V-(~t}L)S`|2eJ_r_RXuPKwxpTeSnt#m#fq+7czy4&jGZU;?@M+kjj z<2J&w9t>3s>F2DY0rs`1`Qt0kRYtB$IqU_kX8RyQDtP_ek_E9^7M1^1Iyi^8!)G8F%;*5{`c`df16_hWxhx~dB6ZN`~tqb zTFA)oa!O9RtKFw-0t9XI&b(xNFm80IQm^Mo9rwHRCZ&ihGd*3~fUmC5P^R;5@4C2< z=R+b?C{JG5-e9utv+=_wjcPV>u*PE5GEQYV?VKwgHlltTW;&M1%S=P$3UbIM9e2La z!ecN4G94TFIuy}r|Fk2iir8PLGgGO~W{QdJ-7dVr&yi41^(kmwap)>&D52UvrBfH9 z{NbaGBvUBb!`uUMYW=xd(e3XaUMA+WFB8CA9VUa9eh?Q^JbL$Qq=+Bq6^bYE#H`PD z!{!!ZdUk5J)-a*7!}h)VfD-5k-FtE4ox{7Sc%Sc4`hEFc(rmxzNuDRQl<)bmQdTlKdu zvBNq-qDC@5H*CQ!a=wnfZu0b@1AD{7 zo+Um!{mN=A%fMaJN#Fd}a{EcP9f`Y11x|W^=@3Uk_l!NeVvJlnLG zm3YH7mpo__9PntUPD$4|akSyQ`IdrVdxtuuK%X*L2wfEtWGMwSME(RRH0 z$DZS*%&rCZQBz4$9h6B1d1QpjxY`EkDo*)O4k%c0AooI^i&VR0wr09Vd@)art2cii z2a{HLC6bwBf)Hq_caXh!rHMPU9{ox3iHo(=A~5BZ>HH@;iIm)o=ZJ~)XVg7$~egMPO z0A6^5>8;bHezB|8ou+s6Tv6GcCci)(^)U&4#&j!f5*@hu&byI0vS12!3cM>8Pe5&bGLD(XAr2MgpY-a24#?X)F^2a?uN&lR=J%Vxiyt)l!j8z*?+_8kLB z@EBYo(^BqMq9ci1KhmtI#zV!ZGv%$k2i`Uza5qIf9C~E>{K3HM?8bZ*Ke2Ml$BA~y zR*?mULFR~|I6_xChluhzj5K0^hcQ=fk9{yclpO?+5BX~-viO-LHTp=6dRd>Qe=py zp7kOX7yBgGKM2c(Zh2(!Z*+y$ItBzLd zhI%Vkh5UWUD9>j}EjVI`ZoH_0?^p-Oka8*DKKXJnU26_T(SC3ALTaOtkBu)u1ci{h{||oWQyJLWDzb#*^eIOMp|IqpaFQn+@o%OW0KIhm8j;= zqvxGYQ)Y00F6~x!+cXciRYtWoGCKe<4csEVK$;EGx%dY_M-D{ zjR@cNkLWSh**T9HwK;GrBJ#f zEFRw=fFU@>G3EU!?fT+4a@)5@$#02OlI0%YDbwa4u}7q?Z4NUOeK)mcD^ZRbEyjlf zS#oJ<7JoT*HlF%5$$){pjeB>f+CE*yrjlqdz$)oHFc7cX|Dp`+p~bNTa+T%Olgm-& z^^n60VMz9k^VMUa=jRx4p#$9c1%_uPdd{c#AiaM|R{181z4cB2XQpuT)8x)*+Ye&f z@(xeO_hsoR7<-3S$VCzYHqR*qv3JtQFI5!Zb*2s^wk5s8Xi0u&6QoqELXGro|2{p|GGAdC@Q$kx_O)bXLq z`c46w621EB1@i1!G9w|<>bnd9lfMWRAt#9Jp}$bvdDC!NP??V0_(FFDpUw(+!YOYB zmB5W<3}WfnM!z8u-?60Oy5=1Vpm_e|InGH z8^%uA{*^#I9J&qLDg42G`IoFCGVgy>0S)cq0`eJw`(q#%n@4lOKdM(lTJZsACZK9UT1d3c~PhD)oV2N6Mf4z(1 z>l|j5aK-vY?yUr@Rn!s1#8E5vU|v6Z@ok`kB8mPuDDE}gC>=qhTgw}Hu&N1%MLM9Dt)rT1{+`O|`Eey9&X zS^U#r?e|CAU$jj;V*~cF2tXER=ua zAu~?{*(FK)p3Jt}awu%!Jg3WB8%A-Jw=KLIua+-RbJ?xA4RUvEeV|hqLYZbxRJh;s zY+G@Gfe?^K1c;`MVajrAcST0Zcqwy}CPG4{VzfN);igF3#7FnLRMRLYPIW8j2T*?e zn;I>%5#M_Fy4jWEIw%41F^aWC23rLfGfDtV&~j>gF>)RdflOD0uk!lTI&qG+vD{IN=hZ4itdUy~D3K zwxa(shkOm`vV25FW{tG=i~RwB5qtaidE%}MN_K|`#D*lEJ~+tUzu(k6L+Btu6@=~E zMmyVr^%+_tqS_Wz`AUg&HsQ3k>a+rF7>qDYjVpV z-&s!c?*@?+;6}Wrm;I^X@O;+#tEKY-};J+sK+%w*Z|KK_9mpiM+JOU?adGkB?{iH=glOmQIjcH&N4 zM^mlfw`h>o`TqeUpuSUe?{urkFkJb&+~*kMx8`KZu+x312kIgt##w9K!8O~}(X|Dr z`NC%`c^RfLl`ykxp0z6##@QoBt;K~x0Ctz3XnJ#c#-@87-`m9pm2xeYSv_9i=iTfj zC@I|xRPk)FZV*oeJ&{+4v*)_Fsc+4R$w_z_3mM59aq>>Laa?9zXNYwqW}~#G(TcvX z!*({g+?;Kv7fV^KzY(;nEmQO5cBV)C5GQE&5CQX7*`+4%AYUAi5mmk&c5d63C4GI0 zKq&%JLvehavbxyeAN+?q%xfq$^0?-uALv}u9_&rpmrxz<>ZC$!MV2CC!{bjpKiy*= z9)+GD+l4CN%Y-R*PHQ3NUWgbvyPQGd-RZLG!>Y8zveY20#Hbmi@YPq9VLEXXn*Wo4 zBI+W3clqEv)}=#>bI5i!+m17rNq#Z4%y1p>i1KB`7*oD};&mEh(msmSbegvTa~?~S zN{lZKfUB`@GlGT~hvJ?nOoqyN;0xtwoYiH0#!(cdiy#o1c`_U*WX$+EA452nNxqN~SPs0XyHTqhtX`RIJzHzC$rsNAiPD zEl&|2b$NQaNKCs~Oa`M5jhq|dPV*1&2yGH<0^&j~SQB@6@pK(dOgwYbMmAoGimgy! zE=$|}?O5m@py&`0NF|jhJFy^khWSCX4$pF(Oq>4zT0zKvB|d5R3H2q0l0=iY$7C%$ zar9mBq}glDQu@xI*?e^DYxBJm&$?R1c9fG{8ZA_G%uQ!uPRp_rM}cR&R6Z4(S9x{L zZzoDY;SJW5&ZK8>Q3{0H9}oEN8FPuBWw)U0dMqU3%MLS8Eg2Kweik{e-YacW5}gp9 z;G(oPKB-}Qrf<>1Z(SwspZ!E;`F)VZ224xbsu)hjE3a%l7{s$b!BnK+_hr-Ovbqo2^ zE@|*j<)_Zu!6)LPS9m8cU|h>L;SZ-Bc6(=j*WSgLM|meT_AXz|#MZhy8rYZOP%%7r za&Pl1o1}7Wx9DEY<#J6$PfaUIxa0I!HlY&;JOzZ$7=KaV{xvmoQ9UYlh?;dIt(b5{{sU&5YUrQM^G76esN1Hga9L@&~D~*WT zJN0svPZZSTyPjX>8@_&;r&;;=_0uLHuW%IX*n^2?{_O5=T6hxKvE$ocf74>4Qi4LL z+krr`TKnFj96nn5s zzLLuK25!Jh{pq}kA#I*}5#K)eAhSFEheKZa`KJU&A zaTfnbnOc{-Ro^ffN2g^UY--$#XKIt66aj+=yEGeJ+-@T63I+|PxHDf)xXiD7Btrn^ zq+Ox!o2s!9%+DF(@_KU+#qZ_x>sl6&$ouKKW^`V>j8H}yL-Cs9+6=d|<|w;=KY@{iu6hw|&Ua&lvtq!KT;LQCFLLD@I7*_V~)x^ZQfv5MEAescoh z#$%k{HO7Fb*_`Kms?S)4j5m~toD=U?G;lIz&7(>K{C1LR9Zu_>X0lkh{rBft`-Gi} z_uQ#kcA%@Y;v-7=tM?xze<)Uoa<>wHZ&1>_IVio>?Jd)Z|LiDTT@si?-eaty8E{ZA zh)oj$d+7}S+Kdjbq&nW-Nx;5kwZ7UO3cLaarS0;KaW>n*V{1OCT>|h?fT#g+9l!yB zH61tS-`YPODzzRHiPIq$F$N%)2;C8B89o2WKRoZ|n3Q0Cy~-!4l7}laq5OA3t4$U) z%t^&Vto!NTuP$=~jJLgNOHzlE^>0#%PKmOMS(S}GyxH=b;cM{jubg+>tOMSd;bZU zTUlq7by0bmoc9wkc!m7IcIsEIre$^DqUW^h^!>WBiQ4McDB1bTx9_8nJ{I_Q6qr`!x`qO&NNMPX+r_Oc02hI=3b6s4rJF^^~mp*MZwzOe`=ETv|1Lv#c-Y z`)#KJ$0zSSch_6^L9nPB-p0>ryh9Dls3*U;e!g`7TI)LA)&46d2laA*CSAmx+4X(( zkrUuM6pYqG0xObsqCuQR)cW)vEr2rz#1i%B^tIBM{I#Y|Yie4F2kdawqwKfuBn51K zo!7u=>F*`;%Zb+&Uq01qAfHvIUii)%jYy^rVY4`CuIyy3r zNkR+pH0F8*bDkhEs#ljQs&7nw?kqz$EDm+xPC2WT27d0U*GN0$lV36I!Y|+)>(9N>A*Tk{%jC09DycwiXBDzEqZYESblc(%XxEWTt&#&4tS*ig#g zEBWok);8lGlHyzr>f&fQ_;4e&kbg|xe%41^cFB7r3t-GAQDf}S{fZ4!z07Nqe0BS) zs^sM&!XReDmTz0<_orxmHb5?Hi?B{6mr$;fll5dv2BG0Js<$JB=u~)*%<9N)FjOww z2WLCVT@WKHACP!EN^R6eCO$ZQ=&6g`Iy-;Rz68v|5-q~MCdlmMh}e!W!Sx$$^BGm) zy&RMxU#yP5>%H%Zy{Z@r@;YLO35!(H!~`d@ewPw(}aXh1`-i%(ov& zk6&+-3Q12T^WVai_XI+XUf5!C;G(Ny=B0RG(pEnv{GNT6cIXg>M{5;QSAc zPlVl%=Qe*BR1=^)oRcz6P*Dw6QKj+m4?-gzp%&R3%k+(a5iqGyO1Y48?aUE{x3dru z_eK8h`YHdSv%EF3&c*N}+4)U`byun6wEWO9Hi2r$6m~7w&ZzDn7(l>{i91Duxul~e zs20=!`D1pF-Tb#Xn%!ca%5y`nb?~Qvr|o0ir0qBS1ucnWvw53?rN>$J^L_3f)@yA$ zm2YUfRb)H^e$bnkWAF9lpSVkw1UTys@cgU(s++QWBEK~Jf{6uoOMx@^;BY$BGnvnQ{INF+yd$#gDeiwrph$R7It77(SKV(qQ*v#mo$T8* zzzj&9i+(jvwk%Q;-KX6e5vyx$h^#()N?4pz^9j`SU@G8?JGd$G78$rLv~N@duSRdX!2K=!Z*T0(SFo^v)99G%tQ0BfbpdQd202# zN2VQK@8^SKoB$j2*wCBgaiE`lxl8nH{Ajr_4ixsUqqJd5!wSYR{jX-J*pDQTi-<2j zQ(%}BfJzlKAppt&eLi>o!T>D##9fC6j9Qh_5&~&QKS1oY(5ik8pp{~ZkQ!rC^IAX5 zWP6GRfK=C_#Fx$|D`IUj>B1RxE+Q!Ihx)%jafwDbRL=uHXws`}qXVr!rk)@_rXC%g zh%f~zAMrgRZlen2`i0pHlqV|VBHjJ^o#bC0ln!D3GR*qs)FFL2O%sXhb;6-Q zN6MBC-Sa+oU9@?E18g(4F+mU}?wv;RRoY3=(}V$azh^=th>iImQiCqcQgzJ_VEJMm zdx;5<;%B;WhvbNY73`b2p3D$<$z=erjOZ@<_fl^Bpqd651593WsvI>mN*+&0e`ocHs>P%nl+o#LTpvjpPNcp1WdDodD~{TDylG4If4N+r=3o`CL1A zQivSAmJVnOF_Du~Gp4?^8MLltOx;L!p?F07`5?ZecO6(5^FPMK$RaNgS0xW!S?)ci z6!F{WpkJHvYO=jwVOnL9px!vHKPoWyUJacR-gFVvK}ObvxUgM&R@-$v}+9}m9 zS(uO5fJ!6RFBMOXmUzmcs$vZ=+t`GoK+~a3MBqMtnj}%)k^V#>{suPApY82 zYeYo28QlG8SQIlplywsm*c@Gg$6M>avrz zy?n}R0fZQq=5OhJ{6jEdN=DsoT6~+cI1?qtr>T-c{vcGJ5|Pi@xvLn&puEgp$DHM0 z(0OUjRtBh~X@|Yjq4#>Qu}AvWU=_;kjrrM^N8)jn`g2|$ET`ht4q>;XympEN)b1Ev zGM;C=zhxyws<%!Z*RxBjPPEIEb2#k0H7yd3ivH*YgkS?a|HyqU{k!8SXQWDx({61` z1noKb+nr1v87ZmKY0(u<(1?gK>_b6$TGyQomZyIEi|OemX8lw!?nOlyz=Sjc;)Q0 z$l{?cF-Yi|hF0af@W}KmqNb!w9CZ+Mv8$_y;9UZ02Q#MV46bo~aqI>s!krSFXamnL z-|Kh5FRC8Lz6ZMTE4LisT-f=72k?P*M8b44yd&*ABdujcWT-*piQ4t zaydLo;OCvPJxi+Ka?W-nbj@+6b4W@#DRmUEn76gsD78)+Z{s^GS7C~XpqqW!;6ch` zeH9Y&F?3GnJUG^Ar^Og#MH;U9sP^8@ZLaHqXZc*$AIq-H%CF^g*4OLH<*<=-tV(*` z$K{}To)n;L4MlEWVY~MfO%uAtJs_h67HYP*4Xl%s=H`1)o8~y^G3BJ^2ZdlV<#W`R zlzlO2dj%A2!h5ezJ$Ofj#+^;Ie^+oLvk)NDk}^ux|0}*nsKiv4VP5E)(bhBH@4IW$ z$@q@+^@9a#;r;LX^X22Vwge11wYq!P0f0L!9{e2u3{*RGNO!oA)i~iVPztzTA{Z6h z#jTJS1Z3Cz{tBVfT0&y^cR<;~Y9rx;)5#~ij&Xj>*ALA625fYS7Bjat^ipuKSgqV=EW_jP z|IKPKG$9sYftM(jUwd6xGN`I5en8#4ce_y>Ddg{a98Zfpx>>wScz2gjEabm&@WL|0 zY@V9Cj!vjAZm4bqev$l?}60&0Vuv%0P*5Amsk}TZ0c`ZtoGjnjt-44OqvirSPuPydDf?e{j;m)$*I zFaWUA#bw)@omuf&d8C$aCJTd(za^%3zICpF-t-5Y3OiI~)E( zK$ezpx1ULBHs;$i?-910IK|nX6qRu^;X@z7(S2|LPVC)yyL}#rT~Q>P8PLte{j*l@ zoMfLF>;-c){J|Sps8o#&{*Y3nEsLT1aq(-*sjBU;!{PP5SRoJdI3S(60V0#*;vcN% zziLYtch+WX)+JxjNs68d4y1!xGax%?h%5s%H0OcBYQDVjw2JrqPPpU#_2m)Y*Ouu#V*uu5+tXK4X(8PJkRZfJA3mRg@5b^$aS_2*cC zwED~Irxv?2A2&Jf+BAs7w~&skRR%!2-R;uKs`-C%Al2}X3rE6>k-tbv(d$kwq*^0s zgEXY+hF@nBh9r;6yX)u~;1dd5j$Z*v0hKZu<>4IXMesFpyDu{5dg+$+;^JazYN|x} z1K8)4Py|s?(V>TwE%wh|+%4;DJM4DHUEeLW5@n|aIv=EwjnmD(FEyoVL3hXOwrTd@ zCp_u-;gzw_?TcS87Obl!<>*ke(dZZOj|RDJ;!UYG`g3l0K&%Uel;pG<6VQ}KWtZDo z)bYUo;s{|r6wHg58_%|qi9VxYc8kAm!b@{Un2H4312CyHQ9ml>&%M3=f!_iA)3C)` z%f8VOb-y4$&8-!wt}8Pe7It=6*IE#a8IT7jTY3RAn#i?1)zQz&_s3>UDc>nOa903%8HE1pn z%cIwP6?xJH_++7`e@KxBezp01d90l`?DCK$a z{Kg*v-vO*}Ti}F+Bf)W{PJ6Ko1vi2T`APgU^z3n$fdOy8BDMuD0U3!8jv=L)aOm#O zEr~)6>=k`3vCX$&1wMVrkp}JhHb#C*a?A|^q6?rqOL~Xq*y8jSk?ZR5q`2kS9-~&- za?|49`EONAdftAgSUSbyC$mX5-CT|i*v^jnuD-+@2s@4l4PI(`_JFox`#0m^R9_oU zIZut)7!KN+4AXKqKy`IwQjA0Ow!um#|3K`zw1DBsmAQqpwr(U26$hR8p<0-QUOhVG zz+(DQ<0-ng(GItISYfg1)V>hvV5xaS28@wx<5`kfHgE7P6ZBR^)5OK1&ucZC6ZKo0 zVhDy0GJrC$%6z-Y;Lm!S2AkqG{R7t)SStG6=piJ4n0xnhXssU)3^b7+5K{5{MvY%< zbRG)p(Y3*Jt%d=q543ZZ{E9CyT}6G_>+)4Dl5f?odSUw@jf8PvWMx*4lo*Exj;aay z4=k+Vwg)C25P8}nUe6Zk&BEOaE_5szE?SDlCw$uPTEzUaGAx2bfZ&l*vp^`h2Z&I0 z_84c~Yvik@07wB7NxeO|`3CglJ%+`NpPs_uWYHjfk?TU5M(k`H=f1Cm_pObL=$#OW zI%rI$(~|pwo^6#DM+W?>o#jzku1I`_hV}aS3F@EFfhqa@9nPEwp(}R+bC;8T`LBk^ zAaz=D;`;`q@v$K*TN-kp@2He7LWi^K3awMhAz+2vO8cKP9#i}HqnYvoB}F1x670g5Ym~ptZZ0tS>VuL`3Ut1lZmD79#?g1c1(5qlrBKH?2Xfl5JEFbU$vu+tP zCVvv-%F7QzT#Pi1xO9dVeyxh3uk*n-yoDo7i6Mc-up}0hGpD?9{(&k{fzTJudKr>^ z4&XJn>NE57Gw^S<&jGQiQL%Ci3Qj5?R7{I_xBdn|MVU{RIs#_@Ap)xB`hR8hp@E5v z@BQPBUvem8xSP?4I*9D+0=L*l3^ZnTXUZ!Lz(Sv18^E4}Vlq%k4gFV6s4`DU^s&LE zI2D9&z)!rSds+)&TbY)O3=XJL7AvQabQbWB835ASQ>T z34_P3DQ}^J_z!yIM5mvAvVrZnZ3QI1t@W3l$Rx-ToA3gKHB>k{cqp%2b81YnuBRXD z@BTji-mlX>A^%$xtn}MsTjN4>``-@9f0p;oFEAmT%bkK+u1IW6&YGb+>n-ZB4xX7%Q?shF8;MaxWkG1T^jvobB#ItO7v7eB5m= zwF|KI>+{-HzyhcKTqpUQANO`mx9si1M9QH7Rkc=8N}thz-^WRi*m?s2QAgds%2LZp z?thDQCdk&Y@RiA#a_-4uv>h`1FI;&SVB`uzX7fMD=6^AQ3KMKv1TW$N;(sFpCQN&H zIs_eZfVyZYS}5C_Spdi0Bi~ANYI)`+=M5200Hcc7?A+31OBs;NGEU1e%f=W-%{xw^M9FUD4)|*S=Yp%5`C``l_(>ce#HEhX1 z3BL%07G(IZ9oKC0nF@H=kjue4R$R97>hRAnvh->SRBDL~J21kSrLWGhQ`hO4G~)CK zsMMcz-&F8Z?7oM7O2iW~sp+b%%Ss5iF+m5CM@faCh^#D56W^}5vpev|SpsDe-3&h_ z72>3BIeCWK@O!?$T3g`6N2TJItW%-tE#3Lp_ zS_mXeOj4U4Q_#L@KZPPdK5vo{&;exorpc1lZGzj5u0%Y-Mi3jDAzl4TpUF?JQ7M~* zh5g^1f`+IA?^M14IR4`3*TpEdw?np+3bN;y4pMvX#!n>Udw}J2Km@d!1#mR5<(@d7 zL9M36UFxyWFEgrnwVS^*RCMGjCOuQ&M#<7)uTQ}P4v*CG6y26rt^yIYkpDzR;yXT} z2#W}JP`wdGXkG!qt&RRhuWrbhY0{_gt!`&pS?f&WSx${yiFmbj97x;sTu&1E8KI&{ zdeJZ;wg=aPPrG6Q5kf+^{bz*l&}y=pL<@z4rrE({I)##sV=Zdz=ziFz64R?hc!+UUBKJJ+kE zor1E@GFQ~<`Y37op-+-z-WEHs*{eWo35jmdXEw6viTaU7^K4oaYhxP7CmMLJ=60?H zs8b^p*5k>_RNOraUuXF5j_oCXqm?_tfE+}9eDnG*C|()-#QE&rh63ny@cr*bAaELU zu6s#_4l8(Ip6@YCw z^Z$U{)_IPRvO)xD>YfWLS%8+c{Ca2!c6N$hb;rMi1#xcug3RnaL;1^HHJ?P!9B2?5 z(L=n>@+tW&`5xen^_Gj|J^O%E!EFfydG z1=LB#b*i9-1F9WXPK((x+kU`H-&cx&DSk}wBo^o|gx4nMNh~x)kcXbHD;b)&X5#;f zuIryX@9Fm7B!~+q=X~1I%jqy*;Fcthi3ovaa~=SE@|-s+I+l}Fwlbi%q0sgwiggR9 z2YvxsHnbY$C4c+ea))5OwZVZn4dTZv%n=)a@nC(o2Bv-S_xd3TqhdAHF}q(rzDOPi zR~W6)s8GceXes;6;R<-1DS(UrrTmF0HI5nKVgpHt?2jHZ9Ig0DFW!ZMC&z`S=8&|K z)hXpCLYfPEbNgN2%gjczGuu1 z1&X`|t-T@A>-$lA4?PIvkI~zwnd%U%yPfPe=~%Z%{T$r-8ZzAnQK-4?l_4U3=i zDdD8Y!aC+jYQwqg|++NRg9XcXuGIWtgQ z-E)w&{SKJ)RJu-z`<3s(<%2-XbRd1vPc`r7_u-U2iDpxQ#JAaF7zwK(S zem-S!0VvTJ(Dd&GB6zQo^bgmR&|l}l4X3Xx%X*!5`NV8@+GS$&aK4pXzKJxc#K#Qu zRl7(FZ)+8G92wAC$>8Wvz*p38+?$Lpb~NoH>t4hE39vrO%v`m{yfzr|n8XAM{Jyh7s=Q$_4v79TsQScoC z6)s83{;}6S=x^K42$Q+BTsS!r{26Xj{T(pliql>NZzQMC5^&jqM>$U~3pSSeK}@-_Ldp27I*1BU5VSB52vZD)m$ycIG?u-P6+E&v%q)g(+S?J>J0=6F)8 z7WSgk_!C1K2;oOMJ@V69~{j1Zbdl>J2nG_X}Jt;5?kB9u!0tiu>=P zz0mf=E2cR_$n%%#=TM0Up%jRh2(O^Xs7Unt95d&UnQbDT~lV$`<sD0mHF73&<(hofT~0S8aEOYl^2G7 z0-(qVQ=Ucu*u1hS)NL$p6u4vZ=OzoM$;7_#Tj&ob29@S!A z$No$7X8eN(0TqG>2eI|r%VKLCg75O1(iHsW^?r;HQCAaF)zkSLH0EUc7YqRY`FZNc zCqg)$V5pC81z<<9 zcKmcj1;1aAUws8fl*!oTs}LYyB|xwF|M{%+e?L+D|L^ZZ?~%c|4Dh8?1wI_2!Q%@B zVrp7iTKfGLt~VHedIldNpv$U0Vt}L9@qf?25o73|^TpuIuvCPFXS>;?hvw!BNcN-N zajLqoLaGLWAj=`2-j*vayi>3#cV6eQ#u<5fCYhK*?K^s@*&?_TJSJbE3ZH4POM&i7 zmg9gTvvoeX$gZ9)IEmow&IV5J3x7!@?|9;UzlseCY@uI~Hi5A@MT5`6pr1u99cWRF z8AbaLOq_GE|9RRz{jQIfu}l`%T-o;6jLWis820QGo{m0A8`(AeD*cXQ`W8vn$W-el zOFow4>MKS16d^8zitoX~Lupw|Fr6fo;?C!%x4oa7KL&9yJe`wwHRk?p!r&Q(@Q3qD`c$5kJ z__=a!=`?QQPD9YF_m=ZFbMjdeQZ3lbc#y5&ZGRTyWqaX^y2#P7PqfU6(`jAPJJ)B^ z?&BHo@UE)ld`U;tMbaqzmRc%LDJlwMCWgp*}DwW(+{`V`7*ZUo}Mm}sR zCt`uYtoOwMhk`W0@jbQ%GY*|Pw?D)brvd){6?U6HhjO8XC#*P$2*}=x7l+G$-DFzy zKpQ{<$N8WE>VG|si6hzNx*q9Id;77@+uGEHC(t!{OUW;S&uwu9+F~6pMb)^v%NcMI z-xsIc!6H6-pvqM-vG^E%9+{t&4+pu(J)xM{{O)5a$%BRjaPAK-Cu_3_6p;~1T48w> z{EBzrm_0r&cX_~)@FSduV`lZitqm#!v(!(t&DZ&9!E3%`t|yLadf`vo}0k)8Ri2|$;g z#hXO}kFM#R1@7l9s}7oB^WsLE^z*%r=kj0QSTm=OMfmvq1wx;IE^XKi$-rV^6{r>$Gg7wi%w}7RMNg6OY1JD0izj9?_hL37e zQqnB5+*_+cSKrRxANz6}!wPm_nlCGW<~dma`JLy9rox%uutMaKl`Vfx$lI=DzD%eJ6gmFOk0~SNPcE<-;fas{5zj z-CbIj@AodgZa(kJcc2P(L1O8(zc}Lmo^yCT=ZR#y=|wi?!zn=C;W_0mt_YSanSV(UXt&9c ssSM8P{GjZ84QLzEF*tbGU;Z;5n89&W_k!FuU~7fJ)78&qol`;+0K4@pN&o-= literal 0 HcmV?d00001 diff --git a/admin/dialogs/charts/images/charts2.png b/admin/dialogs/charts/images/charts2.png new file mode 100644 index 0000000000000000000000000000000000000000..7c91a39ffac43e0867bec1df89b73e10e0b28c43 GIT binary patch literal 23016 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 PFatGZEv0+~v#0+BCDM7e literal 0 HcmV?d00001 diff --git a/admin/dialogs/charts/images/charts4.png b/admin/dialogs/charts/images/charts4.png new file mode 100644 index 0000000000000000000000000000000000000000..742006adc9cee3c07b1a390da6991a84d1da99d6 GIT binary patch literal 8344 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 literal 0 HcmV?d00001 diff --git a/admin/dialogs/charts/images/charts5.png b/admin/dialogs/charts/images/charts5.png new file mode 100644 index 0000000000000000000000000000000000000000..c49a29609d8e8f9bdf101e91021d40c1cb3d4175 GIT binary patch literal 47084 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'*4h4^s0#X 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 g*Z&=uhxp + + + + + + + + + +
    +
    + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + \ No newline at end of file diff --git a/admin/dialogs/emotion/emotion.js b/admin/dialogs/emotion/emotion.js new file mode 100644 index 0000000..5e907f0 --- /dev/null +++ b/admin/dialogs/emotion/emotion.js @@ -0,0 +1,186 @@ +window.onload = function () { + editor.setOpt({ + emotionLocalization: false + }); + + emotion.SmileyPath = editor.options.emotionLocalization === true ? 'images/' : "http://img.baidu.com/hi/"; + emotion.SmileyBox = createTabList(emotion.tabNum); + emotion.tabExist = createArr(emotion.tabNum); + + initImgName(); + initEvtHandler("tabHeads"); +}; + +function initImgName() { + for (var pro in emotion.SmilmgName) { + var tempName = emotion.SmilmgName[pro], + tempBox = emotion.SmileyBox[pro], + tempStr = ""; + + if (tempBox.length) return; + for (var i = 1; i <= tempName[1]; i++) { + tempStr = tempName[0]; + if (i < 10) tempStr = tempStr + '0'; + tempStr = tempStr + i + '.gif'; + tempBox.push(tempStr); + } + } +} + +function initEvtHandler(conId) { + var tabHeads = $G(conId); + for (var i = 0, j = 0; i < tabHeads.childNodes.length; i++) { + var tabObj = tabHeads.childNodes[i]; + if (tabObj.nodeType == 1) { + domUtils.on(tabObj, "click", (function (index) { + return function () { + switchTab(index); + }; + })(j)); + j++; + } + } + switchTab(0); + $G("tabIconReview").style.display = 'none'; +} + +function InsertSmiley(url, evt) { + var obj = { + src: editor.options.emotionLocalization ? editor.options.UEDITOR_HOME_URL + "dialogs/emotion/" + url : url + }; + obj._src = obj.src; + editor.execCommand('insertimage', obj); + if (!evt.ctrlKey) { + dialog.popup.hide(); + } +} + +function switchTab(index) { + + autoHeight(index); + if (emotion.tabExist[index] == 0) { + emotion.tabExist[index] = 1; + createTab('tab' + index); + } + //获取呈现元素句柄数组 + var tabHeads = $G("tabHeads").getElementsByTagName("span"), + tabBodys = $G("tabBodys").getElementsByTagName("div"), + i = 0, L = tabHeads.length; + //隐藏所有呈现元素 + for (; i < L; i++) { + tabHeads[i].className = ""; + tabBodys[i].style.display = "none"; + } + //显示对应呈现元素 + tabHeads[index].className = "focus"; + tabBodys[index].style.display = "block"; +} + +function autoHeight(index) { + var iframe = dialog.getDom("iframe"), + parent = iframe.parentNode.parentNode; + switch (index) { + case 0: + iframe.style.height = "380px"; + parent.style.height = "392px"; + break; + case 1: + iframe.style.height = "220px"; + parent.style.height = "232px"; + break; + case 2: + iframe.style.height = "260px"; + parent.style.height = "272px"; + break; + case 3: + iframe.style.height = "300px"; + parent.style.height = "312px"; + break; + case 4: + iframe.style.height = "140px"; + parent.style.height = "152px"; + break; + case 5: + iframe.style.height = "260px"; + parent.style.height = "272px"; + break; + case 6: + iframe.style.height = "230px"; + parent.style.height = "242px"; + break; + default: + + } +} + + +function createTab(tabName) { + var faceVersion = "?v=1.1", //版本号 + tab = $G(tabName), //获取将要生成的Div句柄 + imagePath = emotion.SmileyPath + emotion.imageFolders[tabName], //获取显示表情和预览表情的路径 + positionLine = 11 / 2, //中间数 + iWidth = iHeight = 35, //图片长宽 + iColWidth = 3, //表格剩余空间的显示比例 + tableCss = emotion.imageCss[tabName], + cssOffset = emotion.imageCssOffset[tabName], + textHTML = [''], + i = 0, imgNum = emotion.SmileyBox[tabName].length, imgColNum = 11, faceImage, + sUrl, realUrl, posflag, offset, infor; + + for (; i < imgNum;) { + textHTML.push(''); + for (var j = 0; j < imgColNum; j++, i++) { + faceImage = emotion.SmileyBox[tabName][i]; + if (faceImage) { + sUrl = imagePath + faceImage + faceVersion; + realUrl = imagePath + faceImage; + posflag = j < positionLine ? 0 : 1; + offset = cssOffset * i * (-1) - 1; + infor = emotion.SmileyInfor[tabName][i]; + + textHTML.push(''); + } + textHTML.push(''); + } + textHTML.push('
    '); + textHTML.push(''); + textHTML.push(''); + textHTML.push(''); + } else { + textHTML.push(''); + } + textHTML.push('
    '); + textHTML = textHTML.join(""); + tab.innerHTML = textHTML; +} + +function over(td, srcPath, posFlag) { + td.style.backgroundColor = "#ACCD3C"; + $G('faceReview').style.backgroundImage = "url(" + srcPath + ")"; + if (posFlag == 1) $G("tabIconReview").className = "show"; + $G("tabIconReview").style.display = 'block'; +} + +function out(td) { + td.style.backgroundColor = "transparent"; + var tabIconRevew = $G("tabIconReview"); + tabIconRevew.className = ""; + tabIconRevew.style.display = 'none'; +} + +function createTabList(tabNum) { + var obj = {}; + for (var i = 0; i < tabNum; i++) { + obj["tab" + i] = []; + } + return obj; +} + +function createArr(tabNum) { + var arr = []; + for (var i = 0; i < tabNum; i++) { + arr[i] = 0; + } + return arr; +} + diff --git a/admin/dialogs/emotion/images/0.gif b/admin/dialogs/emotion/images/0.gif new file mode 100644 index 0000000000000000000000000000000000000000..6964168b947afc2cf76780a85f43d4f77c257b77 GIT binary patch literal 43 qcmZ?wbhEHbWMp7uXkcLY4+e@qSs2-Y0y+#p0Fq%~V)9{Rum%7ZDGCMv literal 0 HcmV?d00001 diff --git a/admin/dialogs/emotion/images/bface.gif b/admin/dialogs/emotion/images/bface.gif new file mode 100644 index 0000000000000000000000000000000000000000..14fe618ab58a9d46fee90074386b5581d47b92c9 GIT binary patch literal 27167 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 literal 0 HcmV?d00001 diff --git a/admin/dialogs/emotion/images/cface.gif b/admin/dialogs/emotion/images/cface.gif new file mode 100644 index 0000000000000000000000000000000000000000..bff947f5216a49d8cd7fdd8d4e825808b3d14f6e GIT binary patch literal 8603 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 literal 0 HcmV?d00001 diff --git a/admin/dialogs/emotion/images/fface.gif b/admin/dialogs/emotion/images/fface.gif new file mode 100644 index 0000000000000000000000000000000000000000..0d8a6afeb1cb2cc40c5d76f90630d8a9c1323ffe GIT binary patch literal 18479 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 Z1*(9jYzjdPQwkU=rV+{lAZZd106V&Waa;fZ literal 0 HcmV?d00001 diff --git a/admin/dialogs/emotion/images/jxface2.gif b/admin/dialogs/emotion/images/jxface2.gif new file mode 100644 index 0000000000000000000000000000000000000000..a959c90f7eb17adc455982b040244fd583eed888 GIT binary patch literal 40706 zcmW)ncRUr2_y6y{mwR!!cE-K-cFk<}+T+T#ciE#TBFV^Iwz5M>W=7Gq%Bt?QvWg@m z6;jcgB9!L+eZIf*IDeh?QIMUgJc1z$R8ZQ|Kfb_r_e{Z9w5lq*XQcc z9jVL6+Z7d@0e-Xx^soxJ!g&+_IKmeR_|x)cG)v5|>2%*>(b9OMU6b@q|En{{Mc>Fd zmAqBv=v4OHAng6n6B89pNx4*7QZPUF^6&SRMFNih3@mB5qAAnw?U?%>hx72^!5P}kmX;QMmWJ{1@n2Fw;g#Vtu4MMN(f#!H zXB|_tz)fkBO&l>)6C=DtUUmnTxRQsRw8{4rwUKskKS!E-V3Yyezf=Q#gm%1l#kzM{%aVio9lmP6|zV{ z1>aIGIoEb=%4a$p@b5!lSs=M}SM$_elk9Q7Pd`3|-f`NRs_Yo;XG}(LcK#b)n`mro zc=hFtX1?5;H*e0de0q9%6fTQ6HAO7|U>CR{?Y22qj_J`i2Al)bFf* z%b&fIpP%>d!Fx0s&A40oHE-%GXT_*Sd2V;IxFfr8y!=A<*=c$|4u|{jZRFn({oDOu z#lT}ad9r9O{_DX;*uC7&U-eFzj_4dp{K1_Vu`H_*4oEL+fHy*QC6WZWL|i`n(4p{rUnS@N2ks{X2mo*ZYX7H%|I-8j!2$f`lCWd0 zvV0`lMg5P?;n>>$E)UW-3x-P+LCQwaoA`QjV=E)8jn#r|i*#|G^Zs^wa2wvPaGw1i zRzZ`c|2z}bx~8PnFkb`9*h_IWC$h}5OD{c%@NR2JY+qGNn#aMVyArt$KLv>b&D^dC z3vE&?F;Kv^JG`a$R>JLKw!=nNx#hDQ&gj%jE?s+kXuubtR5(7Hy|`URc$!jY>Ab7MVNQ;8V&Gr&(FwV2RfwG{=fYoxhVN(QR05?( z?8A)q?$mD3!vWocD)5;OTjRS1;l}^2=+6ob{5j;a?pn!wg?HWzd!kWI6kJFR=CQJ( z{M;$N8pRux08KXfxhmodidzj3OFXzwrZ)?@JECT}KAut+&;2y(tZudegrgVgZV{Zf z>lQU~)i->v!UBS5Tn=TxsmuT7wM#6e&>kK{CsS%|;A`~*`b95+4NH_YZ^MTZc18)e zi9Pdro)uzofLn3h7ZOJCL2Q_!gH?ik#C7Du_n&U1{A-yr&sJ#NtjpJ5Zmx}-yY|VO zE)|MxkVJGi`dT%VTusmDbgzcbBp5oP(r64{F|QVWef%Q&>E}*h6I=nXsecH5%kzg^-JTi#qgd&_tt%giqOt#R5{gEGDy*K*`I}~d zM3FT!<=1Zsy}t_GF*E2?@%s>y_W>hfmu9U3bj|ijqU777R4(R{-Em*3NbUz?QvAA( zMg|#Nd0SfvtCkKPDmPDzdtFCc-kyn$O;+#1i`^qC+)ikOZ%qeB!v_#+2Jqj{Pn%ki z=_mbA1535K7FvKRPn03}*DM`VJ{XhqW2eVaT|8s*G|2)zfL41(l!yj+mr5gW>0`>^ z@!a#~_4siakxLdv-$&cytqZ}!2r#q}%2w<>O9)sBM4>DwJo-3!X~A)b@)4@)ZtN-G zA0Xh5Vh>Lu@GOXb2=-TT81LSSnpwg=;#?=Nd6b-dxwT)wT&@*izufVJ6a|U≶_= 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 literal 0 HcmV?d00001 diff --git a/admin/dialogs/emotion/images/neweditor-tab-bg.png b/admin/dialogs/emotion/images/neweditor-tab-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..8f398b0958cdc5136a23b9745becc23a833aa325 GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^96&72!3HGF`uUCmDVAa<&kznEsNqQI0P;BtJR*x3 z7^L@rFypT63w8qqANLt@XPdKI8X22WQ%mvv4FO#q2N BK}7%n literal 0 HcmV?d00001 diff --git a/admin/dialogs/emotion/images/tface.gif b/admin/dialogs/emotion/images/tface.gif new file mode 100644 index 0000000000000000000000000000000000000000..1354f54b961211fb0253ccbd27a81da5dab5a639 GIT binary patch literal 19805 zcmdS9`CF3P`~H11%B0;OD2@T5;ux4?S{qOjO$$xUIW#MCC~Ppb2@njY0*7*{)GX07 z(bTl8jZ@jMOKsAot!^tTD>EzGwcmdGJpaY>I@Yn)uj{yub*^HVvZA3uKh@L}oI z?3?%R-oAZ1Gc)t%&70S+U%z_w>eJ-Qsi~>glW*R>`1?06U%q_t;>Gjl&nLzwpFVy1 z`pNV0@$n~5o;-g1_|cO^b()yrL-ot+&W9etNB{?ky|-rj!c(xsM5ZBOg#T3T8zUcA`c+}zaE zbmQFV`iAqr(bSzkckWzWUESHUXKQO~t835HojLorGWTO)(&^KutE#Hbo-F^(i4!ME zOG~fhDN0I8ii?YnA3t7LSXfX{@OgJiet!PTeev>KMPAO)oSYoFTrQKzZl@(@XJ_~9 zIV_eQIh&q#SbRu)_{hP72M-)Lkd>9yni#rw@7_Io_UzuhJ1s43@6P`tH8nLQB_%mI zIVmaW;MUFCwrzXC<38qieqW6#3J#8qjXf9mM_f#7baZr7R8(YSWJE;76Hihv7YGjz z4+{&62#(meabs|B@W!CvprD`<9uN=^ux{Nte}8{JKR-U7@9pi){XhIU9L@zQ)yvDv z)6;X+s#P<(fQN@ivkAP+OxMZXdF9HLj!cIk1Z1xn(bmzS9*45Gx3{yiv$eIgv9Vz= z7}nO-78Vv~0f0uMQK?i4g|dA4a#K@N6B83-V`C#DBQlw6XlSUfuTLNl@OV53g3FdI z)6>(_)z!t}a2N~*jYgwTC>voEx>shuIfT+E9HQz@$8U>mR*qSE*gTe z?{Z6RBeHyiIzW+;gOV~dlU9B2DDEXCk!p!OR>!ebM@O_z7?VurQ3y8e4#j38+I%ZN z9z;t`j1pSUO1Fdpw)5>@$Kr6q{{1@u90Tsf%qC zZI*Zrv8(vdU?e`9zV5UaTs6Bh0D5%v9)IAj5QL+%B@S!1EnQ@)6W%-t9vHJUO|K`> z-?;qGhrL`veA2dI!}eU*ny2^h-(}Q z$9-%Bm9#81q<7z{29O*HYo?k*Ig9C_>`xm_?@eq;y`EALhlq5MT1K+k!#4|nYrqlYDAlc$Sj-nfE?TRFB~ZFG+CGl!ZN+? z>kV4IW^N?SyZqekGE*O?M1Eo@yKg_Lz$nazW4{CyK2K(5-9N@Ts{li0de7UK3%HE>@5s+2hlapW5Bflj&R$L)Ey|bg}mud;7Imd zzneQ@B3WDLcq2EsLd_MOL+rrjXYi^3FtsQ34K37CvKi*y~k5w{NPZDj$Zk?(g4QiOWCNxB%K8mjDcsz%bOTW|2%z( zD`Gzqad3vc3bJwQigfvulpFywv4xx`!E zAm3pAdy^EqcQ^?p=ILBcB&PRrgI86BS&qi%AJT25;51Y1z|EQ+&BNqI_q%Lc;o9`n zJ_-Y8aW%nOW!VGh>vjqn za4ZW%_^JV5nY`J;zKCMG_z#OV>B}=dOW3w&BN#S>EupZF-edzFp6)n$4j<9O+~yxS zvE+~7?AdI)=h^dMr~8SAi((w6|Jo<*YRMqTun(@p-su`XA?TVvd8P>JlDV;p@_e}F zT({mXx*wO96AxR3KXzIw^hpnmr&1o>P0(b@DjeZD(LfFPgbV1Ikrr@MJ%D%JU1sp` z;dyPj1jA=TOPJcyOyy*INL;aZT&pc7uiRES|riyLB|4pj?jJbTqSma zeZy`J!Z}&0#E}5bM6`-t4XlCQUS_gIe|v-WK#(Dx)YNOZXS%Y$x(8h{D^w>_1}Z=b z%w2I4bA7Ir6|br~f2<*sGqVmmFFG;t@1{GHuoqURznHq4mM=Mk#2hm-pssaTzMH~f z8}3iFuaP?R>G?7n4d_i<7BOF7|8I3~B01BVHtBk_+sI+Br=g&bzvwB5Y=^udS8ZA9!ZysZ946 zM;tW^Sk?YBwS##2%cazxQ?(1vH!%#TIf_{})~%O${hEWX!;tL?Sgy>ri-!tHmJGn$ z*3#Ffg#E3XfdBG!FZOg#uHsTMxn*Te^l-;yzZ@F*dMW4o;X`pdNs2ffTX8lg1eEnb z!~=5inoJ|t_Jh`w`U{0IKu)fZ0s4@{W4vw8=| zRy$O`_wW_OzP0U@SZ?TQ+xhq|ZS;kdpVCZm(DdsaY(=?k`t~v7jA8qAee`IYNO$LB zE=;E_mp>)}b@$xuS$1aU_*l)~7i|5@55~EVi|*<*wWUlMSt47uoR5vHG4}bNHS(@0 zGP?G19)`$)!l!$oz3cyD*D+C8#*}WnK#o8{c&jZf31#JcuugN}W&U+$=}G>_=Dk%e zJ^xW{6(>*Mj+a~x2ZnBPxFNUJ{_Jgmtl7Cmy!3*YHF+aZ@}uF>GOHjsK7XupPrCZ> zmK*nj9O%nwY1Bvdc!pUJFG-DaR8f$A76+p7XgUc06ZF2)C!2t{4)p=neA#MuyUaO} zZQJ2m9f!zjRHYbRN)d~m4IU?Qt2DH!6xhPT(UBUor398QK(DK} zwgb^bFf_ai8bUGrWC^nsphK#y-2ojZ5jIkTxjeD?rw%(=gF$#pgPFK})(Cet^o$jP zD281Ik>y?b*;?!c5D9?D=h8ojTG9m#^n=@xIMMQTwT3my!k$(XL>~H(Ve**FwiSuW zC5IAV01-?L#UI)^Z}D-_pk3+~2O`&BqU?X|ikgUs93yDA8`}g$lyAh-h2qdO_(GXc zD|v+vG@9lOjhH#m(S@lL7(M56?$udGDpPqmcG>K;J)a8`f_4x=O!j4b$lO81XaA2+ z7`^*IrzHxkUxT5jj`yf6j4q)vCla?)LkioVKirj0Y?iwQ?ev5(wH=ITMO6aW<+m8P z;i3y%$P3=`)-hW|1knk==4&veTAQk(KUBgKuS=H)D~}OccNhj!^(_kCDoT1lq@55a zo!7?CMr-rY@&zvH&~o@6q$xG{{TPR25WLFY~0Sm%T`Duzf6^V zW}FF4qc`@4RDCN5DXO||ak#n@T`DMjzsDb7uS}vKITKLZYTIw!`c5L+^H7K*1?Dqv zCQftu*^h{`B81}Mc^c(HZ;Y$d(>(4deQcxptYschj;TX2$_?}8&QgmU1HT#Y1!v*^ zf=Nn&!x#II?{!;zS5b>(UFC$}VJz3*KC>D%KM&%d*dLi?*EFJ}VKe@)S+usSQGBXg zVn0}I?zjpSCOV)#TB;J9vEi^XY1G%_3=3%hu13PwB1rsAhnC76B5TwI1bDOn%}c5r z+gCPReBj|Z$6a96E-KQT0qam^kObJIYE)xFCdLhQ)@eoTDpVCOzY_FLa5|k1DpVCV z32o?!TCkuNp*yr@LIQWIMyNncD~QFqp}w6oiaqI<4c5kM(5;%id1@m;kxrwy4kv+s z$p-G;W|?Emc4-{S7m#ig1Wp92)Mg(Jg4Bo%BgMu$Z<0!@p_NS3?;`4Q(i!fJYzGap zW_XtySl`)Mldt5oiUVxtR(tAS{OS+RUO`8SVA!D3E|*qjGGR5+%{@;VP#RRE_<(6O zCOct891ldg8CpNMsGDpT2{xa%v@7V499jB|%-6@4P8`ez_a>Z&j<=$ppT#)+FytOk z9O*anfnD%BsgtT-jU2rgm;pQa7)vv8tDG})*@VuXaMoUXJ>7QR`(oWZP^Gf^dmcD|
    >ucVxd|^`nwXB9}Gd)h+ylVk-g8-#0Nk(cKS+`J2k4UqcUzol8$Xq(MjyJz=D+>NvDz-()Jyx7NMi|pqM!w#&$eLy(iA zu>Z{rw)weZS-ZYv!1qzINUcnpG<0S)_M`^g0<1_hLQYtjWU>n#*w~rw9j4*}Hi-Q3 zZ$B>xas_|`OA|ooNW{Kj_CA3Q|Ca%`^Uy9lQbRnxpPS38fvUAbS#38%scqjE!8zl8 zRO1;!MfdDc;O8xyCmA%h2)%f2WeeMIjfdDt5Y|&=sz=ekCBfVxscx$7APF~Wx8H@Q zp_OGuCk4bfvGtc9^cszRG80$bWWDnjm^tjA-D65p-ZuVhiXZuFbA{tc@hOz141q_g zt5+{&*zd-`dy~PfX}iy#Td615%slI!FC0Q?(8M(Tw0_8!baZDXgAW82X&ouXfb97pMooeKoi77Ut`_YH}jMzgG&rWTI1- zB*00~+$0NadFc0Ji{xE!?lr;hn~Q~8k{2TjML!H2CXStvJGeTKBQ-a|CNAPyVO2O_ zp=W5-e|{Em2$Grm{w)toH4hOrE2Ht*$`L{#&HL0r_>!;9!6J(P%C5apcwdo|-XYMb z)jBJ+t<>AQ1dO&_O{PNo=8{b3ABLQLi%;(h-=4Plm3_urAFIFd4EZ2%yuZoY0Byha z4`bHjUAw`llP!jiE97mjHNP1A_;hDT zq4#asiznZ8RBdc*_RsX)tmnv}a9{7$r#3;J78CErfR#+w5-(@k5ZR`LiCQ|j>P(q< zOOWB%Gmmp7PcQ8zkTSOaQ%Kpj&VD0gWJb5;&0WwI96J~Ts$Da%#5JT5ylvcXAzUd8 z3b*hi8*Q;L>qa-cvzia7wXD~l@JAn_BL4Z#s9-riHd+3UDcYdYZ~URTfg+$tk@m9h z`7^>57gd`{7W@>6-zb7XRvVg85obr!v2o$MR2MTBS6I9S=@je*&oG;~9n5ZzZX~w$=BT6MnCBqJTzHRS4Vg57K#7($|P=xJCYJD*n<8m_4=Cje4 z$dv&p#ED3PDH|I}fw?J16LU}OqKKuJ2*(`ofGvek)7z7Vi`V+@S$aHCyB}A>rquM> zBoE&$Ps45cDx2b>54>cs&OOQNK$j@9+y(5X!RHz_5+C^IO}i`eRH{N6(&_sdOLoS% z`*w*wt!6G0`l1+CgGoGPMAV>pfMF&0J{!=7o(Ez>y4Q#_4qQ*uf?CY0 zqNCvC?(Gq9UFYN0<77*b)7KY1!m*+6{~FwDwsrz%_%)ca2qF>uG_MEn=KjL5b{!51 zXTVl$cendQLf3V<%zos)s)uep2es5fKEHI&tYzi=1eco1k3j8^S$kX8yI4)(&H7Jo zD&)U%G~rc`S`MG6Y0|=5QTDMUQ;iQV2x|Ygw!yn$*V0Htk>k@+;k?dd&~=j&cn)OQ z_Xo>9uikSa1I324AGPn8bhZSsVaE9d>!hyX`sD>I1Id>UJC|E;+^r*N$*y;pxD7FO z|2)VX(+Pq*-Hb=E=UozUhJTYC!}Zl&sMO8h3htP^aYW`%VCz^UOF{h~neW@~^b88W z;zrUJL!rYzLEN!Ym+$jz{nqZb_@U4q!rqr<=^C@qC)&LRCNG=wN+y9D%1awm^H$voOop&G9dV&x-Z z1atx(_p_6Y;;`+~htUqN97$m9GU{Zo1`E_6Ab_;A03u}G9WyZvLlS)Wb5!vb5Iv;{ zh16o;^mLYc{M|8TxUnVDBVHxsDNrf5#@y!%`4#;+=4z%XbXk zfrr3;SHjml;zfo!iuAhm)t_mn5h4jIFD5kGb;e&t)U@`G(=WgZ`RstkylGC+B|34S$k zeIs)Znd$)d8=C@?#+GO!QTrnYAj$F>*$t6>mbVB&l{sgB=@=5Kn*RdALc&$P`HAr4 zd8L?l>FZ3P<}tfzZf?INH@)fp;Y+pp_CqRkqvl*+tyxrdJR8H#MLA&cq4@`ATA2@DdA20UlgLb7QQSFH5PQBARo6law*WD18u+LGk0q&Vcn zu@S5RVYSr%>7@^3n^^(1B&0L4uGu9_aSUwsuNyi>X%Dw3XKOt;#`;V@GjRERuMXouQoyRvAcP`?Ht_0cu14A&tj)>TZ2}Gi4UQ!x5 zp2mj^`yl-cZ&?sxJ`8h<`H@M;)17!mnem49OqR z+C`NnFs+VLuGi_)91JoaxH=%w8!cI52qna3AiV$fo(JdjB^2je0^1Wg!p#r#m~g#$ zA{=sp>)E8_=lMU*kVn_^NiH^ew77z5%wyErg1r&kYJw4&QiHIwM^F@;S8s4HFlLRNR;m)jI?=Z*+AFNHgdq{-GhR{fw=}e4w0VP4S z=C5JS*FCjW*AODS=FSV-lFusBx{TDz@uc&5oy zQ*a>wL$QH*!oF^d3b4Qn00uVp~V!%-#N3!A2GSQ%c z7Ya{Q)}j$`w$a*N^lDI>4M&Of){G#?-)g{vOx~aG7L>5|Uj6kbF@RyheaZ35C=1n) zU=dQ6Tn%h;<`NC6Pk6inmN6*`2$7=0au>=01)DCSV03W85JRVI-PL1~KokY^VGmn{ zXyDFOEZ7M^i=P$%2z4Li4}QOqu2QjV3;+QUn~s~4TM9(9%|a>KmD3_1it)~h=v*XI zOcwWHftg-H-7pMWTB}n7S3>7C=n_jFLWPn+t5McEg80M4EN?n-m_5m=-M=Z)o06Ve zXBn>Rr-vHE3jM&zu z-=ZNSw39`z2qkH<;2T`m#}F1Dx&{jn4rrRZ+BALx&T9Z~3j_g5p?+b64=B~*k$IE4 zOOI4=sI4e}lWYpi9O|dJ;!ms!r4T1GdFHWcDASobXmAv4kwM=?Sl}MlmiWvmeIk@k zU!zp=Vv;Ss$1N40WxDGX9n+v65qy|OXAGgSDkdgXd~ru88m$*(aokVQvT zJGa6b6{fH?&$O77unts)gSbu{T`Kc!vmCW}VW1)?n3QGX2<7&CtoZYl*KrAh47tLj zqXE6a@~AsQ&Yg_vU33ln`^5_2moeVs+T=-hMr!a&QGiEBwPD9C?-kBJ&r>Lad-f{_ z_DicT+53c9qcSd59kfFmg;TK+?(oGrag_VH9C)clnw?Z$;=-@JD4JTTIBH3idkXlN zN_QEtf+y7#j=4H%)kJO@T>s`eOfox$!Cm)vGrupG#7tq-ZUl# z@jP*XPXCOwW88CXoEdzXb<-8D=EmX{KN`DI(3nSGP)87>w5*Y76AMZw@NZznnww&8 z{)J(aj0fJXg52w=G!(8H8~HgT7iInGW=pt_Wf`_kk+jVI-MT#bwnLY;EIfVkCo)|l zH=C_ecZ@|fu(2i0vnM;mu=GRs@qJ)!An}#Gvt*EROgl#C&{Ed6e(Pwt7KLeGKYz2v z?d0e=Xl(Vf7uzS#@U9;^QE`!q%g(sW=U*eGed(ix4PE9h`6w?Yf0;V?K`-Nfl-(q` zjAJ=`X@T-bC~Jor48Zj#vJ4mV#eM-KlN@*1jptt7f(`t z5Onv?TY1C=BU^uYq)kxTa!@NowNkH#W)e5ZYL2mr@KeuXS;zVZR=X&QW??RLQ|M2`wp(l*A@S%WmGI_P#6K8 zG>!OsO8RpZkvU^ps_5!8L8iY|aVXY?xRN@JH>t$Qs!1L>A>X8dA`@k;Dg_(Y6aZzij(1lF;4E5ia(1ap2W+8S-grwxFf)m39s(A;K9fGlApmn7cacych$RJ z4osBojetbTc+#?}6ZzL%=!)2qwOcX}?KFuHu38Jg)^rn@Y&W^cijX01g=PQtmw!jc z*$71tt=+I30FcnN3CxXD!`YM4EL-K_rd%T*u`a`I z|ADfQ>h7h;jBHCEudK7j%*Iq9DESd;RY22a4tRpyYw*e`Ckkiy&%ai?Fi^S%N>~0K zk~WRv_m7JdFSoNbV$v9}{kNeKZr0Vf!bp=Xl&#*oPVQBGYg<||g9Bhh2FHla$-k?1 zd@U&$vO20bhKN;nuKi4h-vDquf~qO#O5ARNx1D6-k&p{oQW8&NTaP?X^ThL04? zxm?n4Tis%C>rN+BoGlbzwYP~S<~*2WzGrLK4`KVibb4^a>(#I!XU7n}(Wh__5I{NV z;)b!y25dzCgRXZF2v8;+voHiC2of8^8ADudFD#5exvL-{Y`I%?;rM&}5=Yr!FubxH zDiHv82$`@2n9_ifUi7C8RnK z_^)M^&7C0?1b#}N1q2$`fVah+M%`EGaPUi0aTe6@E?n85xiBy#^=AhFDp`yVLDgX0 z-Cmegp-&P5*H9bs)#8Wr4e$!mmiIv&|Bh&8)&JuZ85?17U#xO#l*TqjMnJ`GWZNhygpCF~AS4W?vePDPs&Njqv$-Q7MRE}=k7-I4Wp zk{$@(qITs7?pk_M47MG;8$ctWI<-b9#j^4JhU`nD!F>~Tx)dtll@h0SD2#y*!QI3?wEFy4!6!MW zaD_+8wJ=lCivgFI*k2o>rsPW#PZiHx#=<$>F9P#c4Z&syo*hhu;QA#L=6Fxp3m0^U zI}VD&j*_m#=9jJH&8?=T7F&2i)xvCU#OOMKY@HH<5y0UZm@A6x>MnhZ3&vEd4VV>z zVW{4ayg1Wv!;hl(q_SgO2%Q>W@PRZ$jE?9g*fH%it$ta~%YW|JpmAS+4%97EP1t#| z6^y}kd^C@JVK#O7GY!>c1KQT7{OPCmoL9*2wsCoT2F>6(m-^5h@%DNMQPW9`=1#W^DsT|_8 zQn3!qE{9|cFV0iYG(OhyX^x(!u!Nk2fjVch3 z4*jm$?Govd<8g7L23csA*)#VwN6MFv zBtjZ;d`N0wQ}+ekduP?p>U#Lb?vg05|8+4-O@GaF1FEKW3`~r^N^%}hQ+cFpqd6EHJpYF?^d}IfahBB)zUp&nj zlNkwet!};Dc?T8+q)N5_k9&6QZ}`0!G)>EGvh-Tx6cda#khv+vaK2ggi@DDi~3 zqPoPltb5t>d1|*G>UAR*>fEPVZjBE?q~ZLQ{IqekO{oj&{78=Hm7;BIeA2Uw^Pvde!2b^bHuHPYZS^o{OY zvEy0FFIFW-4gd9DZuj}><6MOW8*O!~lmZDC-iB4(zJF|3`oJh`>0tTn&J!pW8$rBW zXg3o^r*^_fiG+f z#`avALzh$xneHrwhO6PnBl7eXPl>E0S^mxbi+l35&+GuqtMc(aV}o}g5oqGP<&OpN&HLt+O1m@4nyT%v-RS48(sA@&R+!{XpQ)&Z|#4 z`!(6#4cILpDjb7Wp%Au|`258m$*{4bimoU{thA?-dG}9~?liqFdH0d`s&G-#cnfA2 zQ6WIg;&Tt3zqV&Bq4TQ8Y=E+}LWzRj4M5PQTZIiiE5fb{)Q#T-I>F-&p|fIiI3e!DC1 zPXMF{U_Ym_N~pJkTHr|sm(_KpPzND@9YG;c{{-ov0H_WDcP@v*l|<@Ur6>e*bU5lX7JfLzRU9-)9w974KbQIzJsJfZVLb&^+u37W!0wz+pC#V4<8gv85sM zau<+C^XeS<6M{>OA_FAQt_GO=fYUWlJAUiRnfH{?EA#3hKg;*3mSEm%dYNzG1}V;# zN@-^^i9u+G^|WJKA6^egw=aTh7d-kv3snbq@T&{_f7lgLHVhx+ zTFd*yU@1;^3b)UTwwc#43$Pg-A;Guo^uyHt2lXK8k!>A{&zKe2s2Zq_Q#&P_oIOX# z!(H(Ll9)<2)pUr3nkNvJ=Li?kyXtvw{l!E>S_+t`D29=ccad)F~qb=-G{o?cV&oj z$2AYAg`q$5&2Q57%2@HkgDF_IQ}jWLxy&ezW4-vQAwk8Nv07?yx=9fCBIb@P_79_c0p}D3YXao21`pRY~2uJfAbUw`w_Jc70Hm2kXGeh(NnvQjP|`HGK?fzn#Ez7!nows zm4~dH{mV^YzF6yy~y%N@qllp|D<4$ZJKl3SV{{1R{4CxmI_E2>7RyW_yETHNVgO>dakAy_$ zMaOYJ_ZJG2!IP9_AKHZl%m3AZa3%(sC2#2A>dA0Z1|(-@(+x~?ALeC*%yvqgZBW8S zT(rCUALfT!37<+-F>5eWbAF+7Qv~iaT}+6q!$vzw$=6W ze`WFd*Lo7Tj+}Z!3|tl6qy=mU-uKbddeQW4FOYbQ15N{XAM$3T(7Ip4hpCo|eoNQZ z+)ogF>a|wN+*pXGEB66)!H=jjHvU&$HJwMw-JaQa_Wq$@9oHI)(fVTm(-RD$ocKp; z_j;{l({me=(gK$cC=qTCcZOsNt>R8Rg5G#E6KWE2&X`XJ~MjZ17^eZ8V#JHfYQRlJo^&~x?J_F)dDEgPMfREe5 zNM_`i@fVq~^!wDq?(Z5xl$gN8dWQ%UVhNELZmsV+eSDcE?jEWFM2>MA=%%QygWJh= z&-YoV=DfKX)SeRUUw%D_`M5+3U_?BtzCDGAaG)W@9$^u3){RrhDV^@3`WEPj?2U6; zeP@QNbssG{bevXn01wBL9T8xZ>-3W zV{|T%YPZ$EovIymnkd;<<=o3AXs%^frILcPChq?5aaU+H`kkH+f)Wft9RB(D6K-y}! z@Mc7j=pt`D4Oz^OcPP@dRIis4^5Bx{Om}Inbbow6XPRA7HTHctA&)X4)F%N>(B0TG ze|%ot$#Pa4{2DCbrA(EW*ht9hG#84A8wu%x&jSD9*AGjp37e|-D4WYb(}D}@(ic}A zJti-z7}no^)#hyNzF_pewh*_^(suqrvD)C5yPx~w-eAYAf0(a`!1Ddk?|rItJTnl% zQQgpW;qf|c%yKF(ieQBo4RtW9;SP%(xd|eDo4uv1L351%F;NOUdUA|okV`)8G4VR+ z{L_?4mVW;0j-~Y;`yU?)QS2D7BADW82Z$qqA-BWv$hva_X^k?I=c|>cLbxyC4Pp}< zcSnixfc{a>(g*Eqx|^DV+0-R9Mz-c|RKy)h_%=& z3;}WjK+x1fO{dp0jCBBl{W(?D0F$uei#^&=@@BA_zW3YCXb&?2y!!t1ND)nf`F5fB zfZ0+<3rYz+A>c|~#vpoz2tY?Eg}GPdVbbe&8~Fi8Pg~0{RC5eEVLh2Xu+?E}sKVFJ z-Dri|D!-+uwpfEd+w-(^@6%?VzmF~U31}cuq!`Z_wJ$Dzl-w0gs}T8m71tx>^ej0YaCRl(lMH#eDtX*Fqs_xU)rFt zfRiVvh#iw$B(62ra()h*lg6IYh}on^JURtJN`#yu8}gL!x0$|JpT0w5&#%uQ(KxBu zVva!u@t6^j&;%jy2Oo8tru5#85mNlsz+FmpMd;s~1`x-MCPsP+<_~hQxNWi%lH;lX)j610GGwVb* z@ri|?PhX*#!~w-YXnJFC{Y=xBtY~<-TzZ@WnBZWQnM*R3!?UHy8_qKi*MJOg!J7@ z=>1f)xy&64(%1%K%*L&7|4|F?*PIoCN*+_r=1W*9+J#W)%2wHqm5Uq(; z`Xp!|hu^!%m)K7CQWm6|)U73ROW}yc+O@MA+zM$rVl1g@y!+H6<`~rZn8DUxA)V84 zbWN{ACrU4ISdx*jg4}TZ1SPPr{E+Ygix!xMlPH2Vc8uV<2cN1xhk`Yz6Mvc{tGMds)*sR_~>{^EV}cClAN zl%6amTC#hmfAFHI9=vy@gVgfcTJxQ9E0mfa&B5{|I_JVIAD-3UA-Qlj=Lqqr!EB(V zmznUkK?A+gtSa2HKHQ10qg0V37)Vj;1p@3D zdO!%+XF@+62A6CQ>EvRnvNZV*$go;Hd2QqRpp5mGAX?+HzZ;r*h0kluhJM>KWZlph z$?KfMGZt}kx}XPKFr_t_*vbnLn}JY&ay$a;!_<;1r{U<;NI$(q*$gPQyR+_-J3&qd6DiEQA_BmUI2?)#rttkCPrr4eq7~Mc>jO157cbBdr>S!mAha+3{Ac55oNS*yoH)N`ft-UW~_Ij zgr;U=z24^fe0b0Z0KT62DeXm^6&_VXYIpN+CxhEAcF^{@u08GC%r}oV)!2NXl)aZQq^#L0%LcxssJv^8yERAW@xM)& zhmgGpgZ0PG=PeGSP&=n%7)7?+47y{OyG&Hzrx=d0WJpce5y5mhF1$DHDKsSGgDC8V z)fo5dhj>P~TzZ|UeRwaPvLjz0X9tM) zypqrYc7a+)Lyu+liI98i0l!snJtFKeIh$sWT$IG^#D8c26Lj=_z^)|-w18dA@BQa= zo?Fu$a{Q_Nq`uq z6SzkyY;wLemCFe=Ai^}&<@SF%Z`geo)fBnGKSaFQzAaQF#(;?j&JR$SytHc&9hBt#%Ve%kWy$>J0QLO! z9{cqI$!7Mf3422jf7bNgJL}a%7_pc39HKP0*AYMN>NrY!6ql2Pus%6ycK&x*HWhg> z>^5nYZPvh8TlI+Ez&%m5?q*A8l{c^!E0Fwrfjk)L<2$`1am)GeYEpg4oF99T=9kZ<6_55I)4;?|jKa(xxO_lO+M_qTj;)oThMG`O*IZ_|^6 zL5y+bd3SiKBDPo!3$qPrswuz zpG(xlm6U(;F~Gii5*=V6PjS(igOXSeZruszt#kOY7UcjtIB4=*5@u(y;5Bc5#%_I= z%GUrgt>PC3Nx(5@ORSIE$JZ9)w-}!A3;!G3zNmA^pMwur`O&AkYoxx&3eNeqdl`bH zvnY>QcY|UN9>4W2vVRy?`pAUuY-iyUwCNtbWyv}(WB_LNO^|TLTRdqDWuxn)D`aU8 zB)+x@5|U!xIG$(Q4)qUq;J@I22`+#Zk@fKmS@G_abY)zL)~rPAi%PB75sfyL82j{@ zEh6+xOYgQJcKgb(;?DgEU(F7_X@K`y`fv@()^WRl%0MUnF6d@UTZbKkCghsfCzHhn z`@Pw+{g;Rt*EsP@n;4XPhO46e18!J$HSwakb?&;YBm2#}#Kn*INAaZCX%@`>^5F*U zNtZ~paw}IYSv-GnKVzKMb(u%GfBR5JSae_1_}jX4Uq+Ysh#FERqWHtpyu&3{B;r@m z6WIkS|Lga)_FRMgzB`(}pBd6x9$e}=SR59o?zQyVU#R>ZDANnjg$J14Q&1PTyXD@} zO-((scW0ND0(e*E`k=@9I8D5bi+%51WPZyAtsf0g=$9>QR{qO+wC6Gxp&>8+7Gvom zyQlYN0M{B=!3t|f9&oD0 z4MGqc!N^Yqmf%>3rbR-yeuV#DzmrkbXcKI)z|W63vcr}N@U{48x*Q?^BtXJ_}y;9@87|5KQpP3(5kVHL(8{93K_dsElql1on2QJ$res)>ra=yy8X~B`foRc_ zLK##r*^{7*MGZ+T+Ej`EYNbsr5J(LrrcwooGBh@15VIfx24@*mYI%?ZP@O$-dX-p7 z1^}iYe;%Y+Qs+T2kk+iJ+i=mFn|c{+lA2`^BoYi6go4?3(3()H-pCNsYOuiyRv&|G zu_@0TRjOL4%Cp8TLn@mF9ci)FE&~#fRP7jK><9-jn_BU{_*oSsNOB{tv1Ln)P}FaZ zNT~p+wZuC|05G75VE3Rmp<28#w#XI$-F7by>Wtt>g_BwCaIiJ9g4aQneA(Q%X#E@2 zEmSb3lCTKcArDo?+DJY0BC6mwRg5tvh@O;Uswe&i3Stm3EUMs$JSqugkdFougTRX* zQDLA8q_|@f5v2(Kjm1`|80e~$7HQ!i4y3?u6G-w9V-byH2t}s_8CpXO22?l#zJ(T% z0zCzHxT}&H4I)96yN>D0vr1lh?2SAINsyo}y^Ki=A+#XjLjcM&2u;0i+Jpm$Dq+u# zgXZ+oiag$U!-_R37$hQ^`b?>XMHb=ULpu3+uwsA%n(T=6OpqcPqyiFfP_czU?8rk!2A)Fn zNXX<8w9}N1z-~&8){t^qkQji@AO@`1f4`vH3RfuE(kOE(f3lai{NJyY+je(8@U=3uQ#X$=#goxzMi3|E^ z(^0jE$POU@;J^x10qBxhDSEL2fk=)hGa@S%5keI^LW!h>3aoIItcMrD;UqY1%Y%bF z?D%sLF)k+4FiOh>zzS^vs5s_Zta!tYsMZzeu2N$LJmy8bvO|kCB5Att#Tl2P>6#hwC)>#!w-^pH)CG0Vq+@`5@TqnZ6{$3 zGYR7VfCLq0lOYl@DiA`5BZR2r-+&8hArFURLO=>*gfWJ+N^Z@l1v{*@-L9wvI!Fd9 zRNw%IUWBP+jfS7vwxIiO!r_Qk$Hb+E04gYpAd?utf&dQW3wg5|$Qo!zg8H0gUyIn+ z8-%BdMOXo54{Hbqv~Zt6j8G~B8%QMl1pu)DFHNXx;Y?y81r;FgEgYef0U;Cwb4f%6 zgHQ$cZU%sQErMfF!+{lswk|RJ%~w&2M1-`k2~=r84MN;kB{UbPBdCA`95_n_RDc7u z9U(%*KmZQ%M*?E#&}a-8L=dDv!{Hz(M*!#w0>oep6{Id+eMy}fq(!z!L_#e9z#E4D zQi8yUEP@!uctf6K@PMmNVo@^-^vp<$Js&-;8L9Xf}yD1P);#av77~|BS@5z zN{IvkBCH~nqNM1@D3$XFs(4I2S0th)9wZO3h(#4!CI9A4@rBzOG6*YZgqHP;gbIdsguU_YH*ctbk#wT}mN&%c zL>L3HGT7=1;Tl)D&Xulpwd-B++CmAmfUkTV!CM>RfhS}l6jb3wgo+`FC+HI-9#8}= zlw}YP@PG=BO#&$!%Zu2}WR`RA5(84P(^n2e0=(b>u(GL$tv-PkZ{Y=F8v={dnyUru z^wJtUOA>Z&6`8;)ZJLfL35|vV3j>kC8YI9sgSh zybM`#)d=$Bfeb@CgQ((?Z)}h!3wg*<9taYiVvJ#Q*~wkzGLZ)oiV`T$ykjQwLAD&_ zH@^X*RF2S?Q?a&~h?&S|zA+EXn-wiAd6eFb^FX9LWgYRL5=*W`C&qkFC7W5!Xa;}^ zLJ?0ylbHcfh{Q0|FqT748qGW~MjZ;0=z%am4V7TPsGnQ{UO++r%Wp1733k`#N>dpY zwM+G#8`1(d``6E8SaGc*v^ZD~xz}a3^g)IVPUE*v7HQd?1WXMUrvrG^MAfeqr=mZ(+K;}Bk8svJ> z!eNcUi&P-t7$iNRrDed2P^e)c>wW_-j5cN<2=N#umcf_{!hkx!f)|TeHyJE~W*Ho# z6SJkRG2#@pQ3mMXQ3fgyjsb;GXeSjB$^$RzPzPEB6W<*Fpml`Cl7}u0!p%tMfEu(= z7Yn2t-#{?N#*LARO3=d3Nw$jx77+?wkUHc5;HA@tYym$TBNUxzbRCdjSs`1bI*8$XD*A3VmWKL{*Tv~CMD+4V_Vyypu7h5U^g$PTn?p8#vFIjJBp zWLN_kke__zFQ56zhrTiEeG5`>O#Gn50 zbKkh%SO5D}K>nt_=@@lQ2*GE z|J1Jl?e75tu=<#Y`lPP~8qfjDkN&>L7-UEV$bc9BDq;FGZ~~*x11kXzh++CRfeU0o zSs2g&DG>cmKnC(G6#O7$e!vP+0samU162Tvc7PXD01o`%)fi9$weJDF&-(lTmw2HO z$bc9&AQg(>{en;hii8*hLI%j75nQbj$lwGv@c$^#{lri^4&n!RAq!D({#1Yq8Ub^P z;0>84`~Z-zXaTkW;0}M_46pA1rJy<_!VYdq51mkZc8k6MU;}vJ1ha4dyw48&fM<@6 zf#8e=JFpRA2Mi&o5>#Xp;J^y%LXQ+N`gnmDUhBoUzz$r^7?{xdD3J>y#kRMusTr7=m6ev2 zbsBIgGb=SK>vRfjva-UmvQ8)deSgFEci;De`+xP|e%8LYV6%9C*4pc}-mJa(z#=3x z*vp$^4lzc4f&6PjZ8@5A(`ucq&MV~^*L{%Fm%3bCU3ZQ|t}n@I>S{DEL-v;&nQX;m zT{dZaZku(+fUp5vasI9JuE=L6Ee;F$`1zmcCQ9j#8=gj4TU&e8>gLI_@s)R$ z?@Ty(hN^mV72*mx_n__G^ZV^xM*~_O*B{?48d&)L%llJO@?}+JT3T9AGiflX$tBnF z_z%j~vK{NLf85S;zw~8A!pV@Ld!~E;TGTY{m2{Rk{pH1y5@uUT%H4du8iknJ^0xf0 z&+zc@y}{PokH@Qm*5?jV=+#%gw4KR08+_==_V*ub_SWy-H=H&_Kpwu_6c!fdmE*eh zKp&&Qtm?_vqPrgA{tz2sJ9U+=O%bW$&XSwYuC~lAxch0a>(#ER$2PZ4q(A?D!@33; zy31$ZKG&|A!qaJG5xYpGXUj>8b$JK3C3Jh7{hN0CYv-=Gg*l!J*wUqm=WP7_{XL3E z>jxGu>7Z;bEd17c>Ec|;nJ-k`oi_}!acTR~lFT%U+x?U)V%2JO;gRIQu2$ZF)lrpG z*=VYD4sq*ko0qR%)}%(ZOxs?#-+ktG$H|wu=NgOej{jAEWp~yU>jf2eTltw0E0%>G zGRQvdbm*-^`PGzTDt7B#$@<2GdG(jcIi+2#=HeRL?h3<0H(GO@O?Ex9N$g%QzxP4; zVNt}n4`05lXgYD~$>i>}XCHW#kYo1y!nMJ@Pn?e_qa1UqPh35*ee6@5l==1hdk@(Y z4FBxlshXUmSb8h9;rcVo;dk%8PoRUqpB-sE)*9PRb=gOH^5lv1-q!x>eL0cj!rRWn z>U}jYsiM0!=je`mFIPW%JW{Erbw*8||9ms1&8GFOU39g}B}Mh+Lt8nzKto z-99$EP|CX}*B!A9JFdU3-|l)xIitj{L75tn5CJ&9Y_s@20kVN%rC_(&Exkdw#x`RKbipUYX3m6}IRPFj_NVxF$D)o0qX+ zJ^5eta*{V}%JVZb`&UE%-u|m|9PYmxTEEfpKRW8TX2UwCd=A&i*^%b-@0x!G`u;5R z3CK<5C}Iy&Rlr4zAA2Xzu@l>f-%h;s1;1zruZ; z{srQH0rMZ!|JA4eqx}C5Sjw7z^WtvG&Hj&JNm=8Rnw`2Xb$#B(pUj;9cV;PTe9|`L zuH)n_%2>x)o9eVSBhA<8e+vJv$M>H{{nHjdZRzxHU;g)@|9dF^pX~e(_x~r=|7WGY z8~G);zj6J>^-BbPN&MSgzj6H%fnO5;cGquQzeM1d#J}D38`m!p_$Bdgcm2loO9XyN z{M%i>as3j3UlRXz*Kb_EMBtaizuom4*Dn$HCGl@}{l@i61b#{U+g-nL{Stv+690DB zZ(P4b;FrX|-Sr#SFA?}9@o#ti#`Q}Ceo6e>UB7Yt5`kY5|901JT)#x%m&Cu_^&8hO z5%?wXZ+HF1^-BbPN&MSgzj6H%fnO5;cGquQzeM1d#Q#@!Vg6^ON9y{Y%R9FGT*m=b z|M=(o-`~E@fBF1r?&F79)%$mEXWqPiHU09%^Jh<|CY4Vf|Mlq4hYu$1-@7}0XKZxj z_N|-4H-@ecUb{Nb-`CrtxN`Z@#Xl~b?>=|-OxNjCogF7n9B)5%^hn#`)i0?OYHO;i_Et*v?A}#TUREkDDJ~KT1$^Gl9ox5UEiB02vUyY9#@rn4hV|>R zvobT%*QTYWtV!muS0}AXT$!*UetBH%vZXQ6tR+#A5#eE>%#h%qzyO9neeohcUx<&l zm#2rjo2!d6&B@Wh-pFeq0XloG(ns}TB7K2715pWO& zKp_yyR}hMXs3G?MS{C-N1!54C8lpxUGbQ9E8eH2pagZxRJ6airHO@Pk1(g=MtiLeW zIkngFcy^azo1z%!XM(Mlm1t_&#Zm3<<*yKihw*!BM-C#7Sld-DS}}Q0|MZ$&mh%bU z9`zqxd%MNGEGav7jWDJz1ecS6iS-|{G$LD?+*pROIuZIwdA>Vz39dGDz;V(n)jDxo zL)`gLIV zG+8$<_tJ_xh;Vn^mi)0)@Veumh2{=o{k0ShLSNgft)QyE(tKGobs$Q|i1f~4gXzW6 zw3NFKMUMG-F~Yz*Mqy@w<7%S=ZN3LoW~OaBmFqp7i^jWPTLZpB3uiw`pYEi;+GQ1a zUv|2Lh`GMyy8Wo->;g*-j|nC0@g?~#5BWux+nZqMgMT^2B?2ZQb;cCgl9JgwY56eT zxtRE#n6kv$ZrG(<>va3_X0b)>e7H^O#hg+%>$zZpHboj;?2(%Ip?sHT?R>CJ9kpPW z+Zfp`1vOfo8%gzbJpZ`v%|9;K>UW7TLqM!vzsP8|jacS09k>zLo)@g2=4O|;ahF|J z_f$YVXi4*LC_KRmbK7JU_C!9~wvie=4pgyvM6txWS0 zw>5176C`E2;92Fve6`OFQRgkKFzOzL?KRRxYM{ok>BNJ$vaT_oH=>ZFk8O6tyDN)N z_D{HK`j}{~oDoGQF|ZDc0!I`;Zj#uhcr+L#WgVJsk;whul$2> z>lz(K9_6XkLLuN|FAs=0u2Ag(vg~Ka5LvD~L$3-tqge}svO7TBIK?0U# zZp@4OfFP+t?T)3N9x^oNn6#RvI}OBO7GNHj}HZ0N$# zG7VCXsm2O{VaI53l$+SMR1s`k&lhXp2_)MJAy!99K(-##7PCfn4lQl+a5Kk$Z$k>z zZp1wv{r<%tM;hoJqloOhX3f8;>)JQ2{ML|yyN(guFmzY&kO~1!8jGCQ`wcXgJ zY80~N!$hh1ho^fem=-T;w8*oJ>4%tsx%W;AwCxo-D8*j4Hln7dai^vN5?%UOY7T^1 zqxaM4S|%${?rpEZB^@QiJrg0Hz9V;R7bC^@0v13;3|)8bJ@gbsvO2o2BqR`&5*{D| z2@+mjeGvpx$#*Bomz(~LG*4GR11;c2vy#z5uZdz0>PP4)TbM(0v|8xi2COg9wsf!W z1Ov&FOXns->|Psaej5xk>Y@eNQ4gQl+0~27lp)-^azw&HjM0M5!-pkwIiY(BB%{s! z6Z~OY$q?v3p|HZIbC0Fs&eBwZ!qkg*bPqF#{OOs({ZX|2k^z{}_GwYbC!I3CHUa4( zD`)|`PO{yXV@m11duBIHZf?v!!dLOJAFOP6S{8c2(rczu&+$+ceF^tcv1?AO*t;zm z_ad)o1sV``6`LC`N=IGy>qi8pp3vGjU%9V0*Cm!!3W9BNbu*?jh%4cVjM+*oNeXJduT0ZOhmo#Og~SR7 zsyKpeY%C7Jr&WSlvjpL?2+_{nH0;tAU6=t2<$HCqSoeGMuKKnRf`Hr*=!-faLX{9B zIAuF0c-rcT5Y&&OMN#JbMHItPLV(3mD0NK|3Ki&;+@Q#jnhob&{UpeHYmxH}a&$Qk zY5Rk}R>OEDmMIpT+IZGmlx8r zG$K=Ldl!XA?`GiX@nWJC4GIQw7-ccl72p1`&WKN@^mmU}66(1nw|Y&AI;3t&dxG!x z*N38QkG6AP@7^qpFkG!>Gchb8zz}^;un>D6e?;7{KQzDq2L+v9a4=iCVR82v_bdT< z#m)n^N^Fk^zj-})_QKuc4=#W=;l-zR9zHz+_wE59If8=kpQ2k){U-6-1^z9QOM(~2 z!o~_qa;U<3=3&2>7K&|Uf zRT)>+5%ngns~6EY7n;6XS+1D>zPNBD;2;A??ZRS8iwd+z@0sto&7fAZfLN~*a8eE_ z_1AQ#1DXV2>j=@9fWNQMT*U)@s!=Nx&~OP@V4*4MlC|L6B3id3(+0a?nhgWi3mn(*q{35b5(+1l6SULt>yl zH0&xtCd14sBT{+foy)A9x7ZD-pe97bEDsbBFk7T%&LO}R$Oid{Lw|{2R?UM)vTqrfE{==P4=iyCj>RiLQ`nOb{);O4#aZ4;WmZA=1wS20<)7LD6$wd5qpLR>|D0i zk_Eg{AfKpkot5~!efVk>Bt(`udWzsE2}xC9yC=z9gF2E9bBhf=l!u?D3o*|41aex_ z3$nqo%;6s7lmsWWiJGRRW1<1E3~om-hxd~^Dfn7+#vudd1_FFqmYFiInbU#XO2} zK#gV56v;ZfY0LVStk-IPYhVO_LWRMRag!Ygm_M$Dg^uQK7|O67E~tBI5Otc4wR*{o z4Im7b7I*HYj&TlTcW-$3!FotlFMHVpu{F1gw|;V7fYh}tAGA-dA@s}OH8Mo1GB$*~ z)a3($Xej@F&-w&AcPXEqMHpD)UMn$A z6}vJS8mG=%%IS7aB@U{q4h;j?I4OZnOW&!B|I-W-9U|W@Sh<5y1^R0g9oE>}62FMt zuvN9(5ayW6bH>t$3sg{HtH#2mE_t>%oWyxp3p!0B(g_v)ymImVFA(K zG-XP_k*)bzu?-`KzsoWcHLgu&;q(FD|( z3UkSp80w5`q2Wj>P%cEbNc_5c77%2PV;#tTdi$KMo|L{5UJad-!3NYcTmuh7`2ex8 zvzex83P%XB{+h>?DBpR|jSV$YCD^AQco>7>%cO4AghG~48V|&28SU&Rx4u}vh=F34 z=fP*;N9n<@JA+>k>spKbqs%CgXOKe3ae#c_{bl~PY4SM7j8?rrtY(>KK2%|Kkk0OyKN5h~dU*o?bPHWBC&U%_oB`w;JBC1c4levC&YO*BrJ+X2kauiM zdAFPW8b|+y1PVEAl#Nc1LDM1N2U>qR4l?Gd0GT3grMTukSZl`vQEp2=k2D{#qhj@ zvzjOy_F*CHZ#EFF(rJ}y@jh+~>#UT2tg`VYdXRMtzUnMGuPue>|6xyrKhRn>qGOby zZ`Y~a)u`3T(^*q_!tBpm4p5Xa>n4T|doqAl*`ILi7_Jne+h`}|5(&mi#5h~?I8W1v zu9-!Ef0DpH%W90+X~_nf!SrLe9%!nL=C{*`2S?CPWawzw;$>`2Z-~YwJpj^9aHQkf zc;FRzqTZ*&i%jrY3%DcCDppjbnpv4my|s9G%8T(4j$%k6-P-c3pRchCj@j0Nuzf54*#>V1#?iE5ANq|C;<4 zj)>qBphCnE%hON7?m&pNd~LagNa5nSW+mbT9!HxT>Oh`gJ;KOW?LUWloSe{Dq7;?c z;uMu8v!EB`SR)x^$dGShR~yTbH09JA(y%_o1Ji@P!}Ct!z`i%?SX?G_vVa4=1jh_X z{AW$VD;*!QZqG7;B@JOIIV%6Cb4R(_r&GI~UJZ*r0Y(E`xzK$cg!_+l%z3(|M<7ug zU!VudYB;W@!!B{5>u;f>Mqx1uc6*1mAJ<#bkqXG+iF=Rs#9&SkUaV&8N2#NqlV0gW zuQ>Xr%gGrwe8XMr=aH09H2P_prjM#>j;(1-bNgygVyTS1LcpZ)0zPwJF67izLr{5- zUq0|YpKS_oq6kaa@CPi!+hxIaJiMg}q|nh%2;h_izeIs9GpJV$K|k6OsLi0)IQmEj zFhw_>BGl!4g{0EZysshh>rmq_n)+Pmx@1ICEqJi_t}gZU{4`C@RT3G?la4+meUI57yy2sR-=W8EphPVI%2W_+MNQPrKlyTgy1 ziqo_|jCisSH)4aQYVP-0j6InTe87MF@Th&Pk(F~Nq)5* z$qTeLK6Gde53%|iX`jF>L;_2v!FXKg4B=(fZLI5v`9LqXmff*LHlHf%tzv(DDg&z) zf4ww}Av+SUkBCsI5}p#&Bvp&B)c z4NmJEm$|GBp6|G}{}{>}osfH%_^PCSO}pXqX=jGe8JAL+=ko!5xN*shf&ZIc(_Mz< z-ZngayP3obu=2YmrO0LN@v_U?MzQ8aSih**7DWST_R4@cv5#rI;={Ab)xn9IeFVAj z@Xp%lHvU=*ySN5Xw$=P0=?RB!y1jhr{DivJ;bxhC@TDWtEW%Cls}UR;bbKNUTxuG< z=9AvG0kVGrkny?pW%wLh)^6=%aewZjoqp6m=bG}b&AuKTdyc(yZ)Mr&%2Q3ICmhIS z(W9~=!*>@PyZW~Zn*O3ItQVm&WhL(0$UO%|x<9X=oip23KweRpL}_mZ{PlwaAK36lzfml(>YEgwzwUZLd;_^cIjgdqW?i znnR7A@OXh?r>?)y>f%w$5#%s>AkN}({!?g9V^`TBnjA=`}7t77Y5TZ(Amlz$4` zy{*M!N!Uns%o684-J)9UC~}&Gxw?5W2p0CdoqN@`c`Q z{z1E_hTG{8p%jNR(OZ0c{P*i6kV;9cp#6vL#YEQ3#nBFOWfFMxzJuTlYHy8UbSPOK zP1}%qc9eP|Bg8P``A{hdueS?Wkzy2E6_$GDd`j%{793V{ML>73(Wb2ZK`T-#FJ0Zw zNHnOcJ5N>0_GW!vRkv#AgS%D-H&6RBQUtykOZrtj--Qo=KnXhjcoQ};&sh};@~C`!V&F^4NqL#*PX zokr=9_++u1FV$Qm71m{?^L3pxSaR|ppT44qgb{N@#5btd<*>}?jb$}=$a}I&uiIQJ z#|$Hfc%`Nh6OAV{5M%cCe!`4TPGu^Y+zp#ZxhB50mB$eE=)J`jX5isZY_md`}NcWlb%3i>vRlQ4Bn+aQu zoWHs!0%_7h>jB@txX#fPv`*;pd(VczW|a_3UoTpt zjbgf61zOd1fHwKP=#Yv@g7;)8sb6VIks=}JQ&tfyuNNeTgUf3>+i zn=?q)2s7l<6^ol>W!_vmuK7ZU#%ARZy>M*zmTa?Y&&azFiAumnS#6lhLS%ZVbC7)& zFP!%j+_ZXZu2Uo>IVGyV^dAA5>*rJPUHo=-eYEtQ+Zr7}&mlu6d5ifd47qIuLd%#B zMt6rSoP5>KGo`TgNp)`TytQKI$2dP`)&~Bw0z25k27-c;;9hdKn43AM9CB}n~#-V52x&@0l93UZy zShZPUp|?(P40s_ybYJJ&l*)O;BxmQ0x#5nJ`Ec`ixzK|ohpOjdkWs3=?$MW%6O9J! zFL?}MlW49$!k}f+>+?1KE8-3s{x#iy72$qJ$IKar8nBbygCuEePOkrp8krDVykW|+ zYRWit=}TIoc{ka*L5W2&&OJJ>L$kJLDW22nF6^Z8&gXUZY&v6S@W$uRAJWrME4^dF zD;oWXaB`$kw*UF>@-MCr{$bd~^OH>4b6jK6CpYT#i{l!dwoN|m*QXwYMCkMtVNVr( zZ#^so95|P%hyoy<3_7BEdJ~ll%|adro;Q!h?i$vwRlsL2NQf~KL7rZJ{MLy8m(R+6 zLp_V$7xo-oH}-&F>`PI>M1Uf{6S=sHy~ktFY3CA!8e(}$f&OQz&vZq+zpt4{KQ`UJ zhNN(^^2*U%q=KSJ@qJod*%%88D3k)}TuLHpy0??j8=@Fy7lum$2fyN&)Qwt?>40P= z$MGyH$a-9bh)fsYvI+dgKN4RCig~zg%wAX^9mNpwjwMfC!#s+ZX6Vr29T=Z*kHbq=8a@)@Web(i{F z%1+B_js_qvN%_$;{0QZQoWVG5csDyun4ve)Gy#BhMVm=II_hZH;;MnyF#|rar$>Ur zt?xk?@i$G2y!_2$E7z~9EL(Bp!)JT-2_ml4=BfGU{5AcE93VV`9ZgwP_s64HyLBjq ziRk7R-xn&)m2A510(y`yK~`My^;qJ#n@KCQO4ZA{F!#Ly|5n{XmZ_j zNQOw7wl^el(KjA-A_aH)bu$Lr?NHH(o?RA(f0sd=qR4K`18c2LZ*O;d=+lKrG$)K( zp$OYpV!w<3fNQ!PZqgQhJ?BZrjZ#HEy{F3Hv>lqu3Vfd(axNHKcs$eLOkjLEq-OKH z;^Zb44aN3 zeyIdjD!}v+XC}c3MnIOb1mV%eeklI6XvM1n&B75FY##SshJ3<;gh`9S=UX=`=*juC z!#qTxHgIWr34@6Y!=V8{$ zinS+TnLyMA8aQDH>L&m6>wg`%1_>BMoBk`}#7QvJebII`4 zOh~#4zIq-BBf}q*nv8iZh*7~G%)xIPLrrLqSM?fkkOMCjBK7zjoT3oDjJHpx<6cfj zGTVyp&Ecm~;5X$OR^hjvD4>rcqT(hrjHOY`HfTB`czzqY+<(<}TTj zVCkuiv=|g*wiVkC@;4}9o73Tx{N1s%BHgwwP=<|)FCy?xd3w1m;_>qGc^i1qixfPK zL5Q(ffFz7+vjO7?d8`uYU+$KZ-$mv{4dIo&np?3k5(5Gz!P2J4Jd0gO4Rt+pq^RSvuV7)C?7$#x1j# zLOiOh*C}F4m+IwXi}S$H*mAn?JWA*rr&0i=>j}^N?_oPAcvAkx0+YG3qzFUT|8}YzacCMZ?bULL)G| zyWu$G>gtx#KcI0|BoW^r+ypuPZoqZ+<>v_i>t}M81f6babQ*z~nuz-%7Wt8* zpTp#5j#oH*1G<86Hmcq8@#g7mh_N=ryu9Ll3vx_3>cl>vayA`jpE9o6tvV9*&y?wn z35{nFQBja3hL{C5N6X5-DQjOTbM{oBPTdK%L^Pn1YfGHMv zh&8s-K_j;gH9SN3r%BKIb_7m_*h+ZR2!ZcVmShqLujNSBHl%C3V0b&;myWx-v^t4YU8Lergb z%#uPvi3=TRKEh+7%9&)XJSxn#=d_F6nAw1<*NtKq6nHo{?(j6YLyTN_NXu-OlCY?X zoX;z4Qvx2qGjmkb{Aj+y)o*e&@kenX3ZQX>=H10W6OwO?x*8~o9Xk_4sX|#*g+$+_ zqe{3;A(Ld1NfK(aEIn@wAjy-yf5kXHAKiYIaTP)gdJ@wJtC@?9)cz@vzF5iomYy&(mOliGY>0{jdn(iPat6=Gz?<$ z;+sH2FX+Y4fex~hpS1Yq15v*f%4S43oFvSk-+tAOg-wVc<(K(NQ2l3#({%Q2d^zoJ z7=?+@bcgs#i7r7u}ZX~AW5>sFy5hEu%2#T{IV zQsg2nN$~=gkW`3LBugoJfhVf2mpVbf>J^56O93Q{}0jQ&-iUq zJkG8XEd|UbUKk$_^?54Hqw<|bh*|{@3)auE5xSG!Hgch!v}efmqh?nEBgKH<*3%2k z!NW&Q4l6}!4e^L)Jb#5(Q1Bg*_fr_Ltt9S_$f6ruN(QasVeYVzd}$HmAm}lu?fRq3 zXXRN>X%P#Bo|pvjT$ujlr<*^zvxH|D=agJ&N!4|%=czmEp1QAYm}9`Su|Mi}8KLRv zbCECeB2{y%-*mC``}{hlw@Za+)m|4x?D{nxey(}kgAXbpMayNIEIKxA>Dk0u9t)LO zmpg(g4;yE6(kVu8aH>xLgUpYK7W{z944lXEK0w(Vki|D`bp@@K)8c8L6$ zC3Q{@2aWWXE3Wh7VFwx>RIDpas~BW;!@|2^rSeNHYs%nE1)l)9Uw)%aDVC-m2}g%t z`7p8M`$K-WkUk+qF@=7l`=Sf>Wl6l28?RT(d(T6F)St6ps8E}1&(`@WU*V9Eeo=Dh z147kvWh=buQepk|*Y&89%?jI#q>TbDl&*wd&g6MRL`XQCKDcq5#nTc0`63+RPnx-* zE&(S*HmgsZC7~SWe_m6cyh-ec?FrB8slmJ}O0c(Rkrxw4d z)p*uq`g(-~6#J`l4}h{C=ko=IGUty^AX!w_!wsep)6lGu@CzMq&wRmSIBMIxJv(M( zunKPizzsWEZx37%Ygzv&KXfSOqLz`zSXRx+rZd6!GP@p*gsnapY-wvLW6p*iCfLRK zmRdd!FD)$nP&9rm2wGQtZ$xf4JCGU(kZXYev#3PBoNX;1-EwcO%JkD;HY6+;!2&c$q z8`rG94UZ*c=pQ|HVl~8IwAu1;`wC{+{3ny|D(;lU3EeWT;QnI$;QEDon%{2QJJ;uV zdhOziUg&l5YIiRpb(>s|@~Gc+=Z_u?^WtdJ)&~PylE`C$<$H$6>u_%=gIr>jj3lrs~U#GdG4(9WDxV$d27|1W-3EZZ6Zi(0y>> znqe;@`65BfAMJ%9L&_X|3LfvSv!F)8M6^z3AiaXmQ@fP+AH3?$aWt^n$GP17)LqUD zI7G}OQFaBEi?mu@ypq-gk&EV8OzOL5uY^9Y6QAy0`1Q<)VqGw#M-;f4sa
    Q#B)e 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℞!!p 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 Yl`jGz%R9~u(Lcw{+`;~ZL;$@14{R%g2><{9 literal 0 HcmV?d00001 diff --git a/admin/dialogs/gmap/gmap.html b/admin/dialogs/gmap/gmap.html new file mode 100644 index 0000000..f1774f2 --- /dev/null +++ b/admin/dialogs/gmap/gmap.html @@ -0,0 +1,109 @@ + + + + + + + + + + +
    + + + + + + +
    +
    +
    + + + \ No newline at end of file diff --git a/admin/dialogs/help/help.css b/admin/dialogs/help/help.css new file mode 100644 index 0000000..0df6d59 --- /dev/null +++ b/admin/dialogs/help/help.css @@ -0,0 +1,37 @@ +.wrapper { + width: 370px; + margin: 10px auto; + zoom: 1; +} + +.tabbody { + height: 360px; +} + +.tabbody .panel { + width: 100%; + height: 360px; + position: absolute; + background: #fff; +} + +.tabbody .panel h1 { + font-size: 26px; + margin: 5px 0 0 5px; +} + +.tabbody .panel p { + font-size: 12px; + margin: 5px 0 0 5px; +} + +.tabbody table { + width: 90%; + line-height: 20px; + margin: 5px 0 0 5px;; +} + +.tabbody table thead { + font-weight: bold; + line-height: 25px; +} \ No newline at end of file diff --git a/admin/dialogs/help/help.html b/admin/dialogs/help/help.html new file mode 100644 index 0000000..9e50060 --- /dev/null +++ b/admin/dialogs/help/help.html @@ -0,0 +1,82 @@ + + + + 帮助 + + + + + +
    +
    + + +
    +
    +
    +

    UEditor

    +

    +

    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ctrl+b
    ctrl+c
    ctrl+x
    ctrl+v
    ctrl+y
    ctrl+z
    ctrl+i
    ctrl+u
    ctrl+a
    shift+enter
    alt+z
    +
    +
    +
    + + + \ No newline at end of file diff --git a/admin/dialogs/help/help.js b/admin/dialogs/help/help.js new file mode 100644 index 0000000..2bcd6dd --- /dev/null +++ b/admin/dialogs/help/help.js @@ -0,0 +1,57 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-9-26 + * Time: 下午1:06 + * To change this template use File | Settings | File Templates. + */ +/** + * tab点击处理事件 + * @param tabHeads + * @param tabBodys + * @param obj + */ +function clickHandler(tabHeads, tabBodys, obj) { + //head样式更改 + for (var k = 0, len = tabHeads.length; k < len; k++) { + tabHeads[k].className = ""; + } + obj.className = "focus"; + //body显隐 + var tabSrc = obj.getAttribute("tabSrc"); + for (var j = 0, length = tabBodys.length; j < length; j++) { + var body = tabBodys[j], + id = body.getAttribute("id"); + body.onclick = function () { + this.style.zoom = 1; + }; + if (id != tabSrc) { + body.style.zIndex = 1; + } else { + body.style.zIndex = 200; + } + } + +} + +/** + * TAB切换 + * @param tabParentId tab的父节点ID或者对象本身 + */ +function switchTab(tabParentId) { + var tabElements = $G(tabParentId).children, + tabHeads = tabElements[0].children, + tabBodys = tabElements[1].children; + + for (var i = 0, length = tabHeads.length; i < length; i++) { + var head = tabHeads[i]; + if (head.className === "focus") clickHandler(tabHeads, tabBodys, head); + head.onclick = function () { + clickHandler(tabHeads, tabBodys, this); + } + } +} + +switchTab("helptab"); + +document.getElementById('version').innerHTML = parent.UE.version; \ No newline at end of file diff --git a/admin/dialogs/image/image.css b/admin/dialogs/image/image.css new file mode 100644 index 0000000..7c4bfbc --- /dev/null +++ b/admin/dialogs/image/image.css @@ -0,0 +1,930 @@ +@charset "utf-8"; +/* dialog样式 */ +.wrapper { + zoom: 1; + width: 630px; + *width: 626px; + height: 380px; + margin: 0 auto; + padding: 10px; + position: relative; + font-family: sans-serif; +} + +/*tab样式框大小*/ +.tabhead { + float: left; +} + +.tabbody { + width: 100%; + height: 346px; + position: relative; + clear: both; +} + +.tabbody .panel { + position: absolute; + width: 0; + height: 0; + background: #fff; + overflow: hidden; + display: none; +} + +.tabbody .panel.focus { + width: 100%; + height: 346px; + display: block; +} + +/* 图片对齐方式 */ +.alignBar { + float: right; + margin-top: 5px; + position: relative; +} + +.alignBar .algnLabel { + float: left; + height: 20px; + line-height: 20px; +} + +.alignBar #alignIcon { + zoom: 1; + _display: inline; + display: inline-block; + position: relative; +} + +.alignBar #alignIcon span { + float: left; + cursor: pointer; + display: block; + width: 19px; + height: 17px; + margin-right: 3px; + margin-left: 3px; + background-image: url(./images/alignicon.jpg); +} + +.alignBar #alignIcon .none-align { + background-position: 0 -18px; +} + +.alignBar #alignIcon .left-align { + background-position: -20px -18px; +} + +.alignBar #alignIcon .right-align { + background-position: -40px -18px; +} + +.alignBar #alignIcon .center-align { + background-position: -60px -18px; +} + +.alignBar #alignIcon .none-align.focus { + background-position: 0 0; +} + +.alignBar #alignIcon .left-align.focus { + background-position: -20px 0; +} + +.alignBar #alignIcon .right-align.focus { + background-position: -40px 0; +} + +.alignBar #alignIcon .center-align.focus { + background-position: -60px 0; +} + +/* 远程图片样式 */ +#remote { + z-index: 200; +} + +#remote .top { + width: 100%; + margin-top: 25px; +} + +#remote .left { + display: block; + float: left; + width: 300px; + height: 10px; +} + +#remote .right { + display: block; + float: right; + width: 300px; + height: 10px; +} + +#remote .row { + margin-left: 20px; + clear: both; + height: 40px; +} + +#remote .row label { + text-align: center; + width: 50px; + zoom: 1; + _display: inline; + display: inline-block; + vertical-align: middle; +} + +#remote .row label.algnLabel { + float: left; + +} + +#remote input.text { + width: 150px; + padding: 3px 6px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} + +#remote input.text:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); +} + +#remote #url { + width: 500px; + margin-bottom: 2px; +} + +#remote #width, +#remote #height { + width: 20px; + margin-left: 2px; + margin-right: 2px; +} + +#remote #border, +#remote #vhSpace, +#remote #title { + width: 180px; + margin-right: 5px; +} + +#remote #lock { +} + +#remote #lockicon { + zoom: 1; + _display: inline; + display: inline-block; + width: 20px; + height: 20px; + background: url("../../themes/default/images/lock.gif") -13px -13px no-repeat; + vertical-align: middle; +} + +#remote #preview { + clear: both; + width: 260px; + height: 240px; + z-index: 9999; + margin-top: 10px; + background-color: #eee; + overflow: hidden; +} + +/* 上传图片 */ +.tabbody #upload.panel { + width: 0; + height: 0; + overflow: hidden; + position: absolute !important; + clip: rect(1px, 1px, 1px, 1px); + background: #fff; + display: block; +} + +.tabbody #upload.panel.focus { + width: 100%; + height: 346px; + display: block; + clip: auto; +} + +#upload .queueList { + margin: 0; + width: 100%; + height: 100%; + position: absolute; + overflow: hidden; +} + +#upload p { + margin: 0; +} + +.element-invisible { + width: 0 !important; + height: 0 !important; + border: 0; + padding: 0; + margin: 0; + overflow: hidden; + position: absolute !important; + clip: rect(1px, 1px, 1px, 1px); +} + +#upload .placeholder { + margin: 10px; + border: 2px dashed #e6e6e6; + *border: 0px dashed #e6e6e6; + height: 172px; + padding-top: 150px; + text-align: center; + background: url(./images/image.png) center 70px no-repeat; + color: #cccccc; + font-size: 18px; + position: relative; + top: 0; + *top: 10px; +} + +#upload .placeholder .webuploader-pick { + font-size: 18px; + background: #00b7ee; + border-radius: 3px; + line-height: 44px; + padding: 0 30px; + *width: 120px; + color: #fff; + display: inline-block; + margin: 0 auto 20px auto; + cursor: pointer; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); +} + +#upload .placeholder .webuploader-pick-hover { + background: #00a2d4; +} + +#filePickerContainer { + text-align: center; +} + +#upload .placeholder .flashTip { + color: #666666; + font-size: 12px; + position: absolute; + width: 100%; + text-align: center; + bottom: 20px; +} + +#upload .placeholder .flashTip a { + color: #0785d1; + text-decoration: none; +} + +#upload .placeholder .flashTip a:hover { + text-decoration: underline; +} + +#upload .placeholder.webuploader-dnd-over { + border-color: #999999; +} + +#upload .filelist { + list-style: none; + margin: 0; + padding: 0; + overflow-x: hidden; + overflow-y: auto; + position: relative; + height: 300px; +} + +#upload .filelist:after { + content: ''; + display: block; + width: 0; + height: 0; + overflow: hidden; + clear: both; + position: relative; +} + +#upload .filelist li { + width: 113px; + height: 113px; + background: url(./images/bg.png); + text-align: center; + margin: 9px 0 0 9px; + *margin: 6px 0 0 6px; + position: relative; + display: block; + float: left; + overflow: hidden; + font-size: 12px; +} + +#upload .filelist li p.log { + position: relative; + top: -45px; +} + +#upload .filelist li p.title { + position: absolute; + top: 0; + left: 0; + width: 100%; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + top: 5px; + text-indent: 5px; + text-align: left; +} + +#upload .filelist li p.progress { + position: absolute; + width: 100%; + bottom: 0; + left: 0; + height: 8px; + overflow: hidden; + z-index: 50; + margin: 0; + border-radius: 0; + background: none; + -webkit-box-shadow: 0 0 0; +} + +#upload .filelist li p.progress span { + display: none; + overflow: hidden; + width: 0; + height: 100%; + background: #1483d8 url(./images/progress.png) repeat-x; + + -webit-transition: width 200ms linear; + -moz-transition: width 200ms linear; + -o-transition: width 200ms linear; + -ms-transition: width 200ms linear; + transition: width 200ms linear; + + -webkit-animation: progressmove 2s linear infinite; + -moz-animation: progressmove 2s linear infinite; + -o-animation: progressmove 2s linear infinite; + -ms-animation: progressmove 2s linear infinite; + animation: progressmove 2s linear infinite; + + -webkit-transform: translateZ(0); +} + +@-webkit-keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +@-moz-keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +@keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +#upload .filelist li p.imgWrap { + position: relative; + z-index: 2; + line-height: 113px; + vertical-align: middle; + overflow: hidden; + width: 113px; + height: 113px; + + -webkit-transform-origin: 50% 50%; + -moz-transform-origin: 50% 50%; + -o-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; + + -webit-transition: 200ms ease-out; + -moz-transition: 200ms ease-out; + -o-transition: 200ms ease-out; + -ms-transition: 200ms ease-out; + transition: 200ms ease-out; +} + +#upload .filelist li img { + width: 100%; +} + +#upload .filelist li p.error { + background: #f43838; + color: #fff; + position: absolute; + bottom: 0; + left: 0; + height: 28px; + line-height: 28px; + width: 100%; + z-index: 100; + display: none; +} + +#upload .filelist li .success { + display: block; + position: absolute; + left: 0; + bottom: 0; + height: 40px; + width: 100%; + z-index: 200; + background: url(./images/success.png) no-repeat right bottom; + background: url(./images/success.gif) no-repeat right bottom \9; +} + +#upload .filelist li.filePickerBlock { + width: 113px; + height: 113px; + background: url(./images/image.png) no-repeat center 12px; + border: 1px solid #eeeeee; + border-radius: 0; +} + +#upload .filelist li.filePickerBlock div.webuploader-pick { + width: 100%; + height: 100%; + margin: 0; + padding: 0; + opacity: 0; + background: none; + font-size: 0; +} + +#upload .filelist div.file-panel { + position: absolute; + height: 0; + filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0; + background: rgba(0, 0, 0, 0.5); + width: 100%; + top: 0; + left: 0; + overflow: hidden; + z-index: 300; +} + +#upload .filelist div.file-panel span { + width: 24px; + height: 24px; + display: inline; + float: right; + text-indent: -9999px; + overflow: hidden; + background: url(./images/icons.png) no-repeat; + background: url(./images/icons.gif) no-repeat \9; + margin: 5px 1px 1px; + cursor: pointer; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +#upload .filelist div.file-panel span.rotateLeft { + display: none; + background-position: 0 -24px; +} + +#upload .filelist div.file-panel span.rotateLeft:hover { + background-position: 0 0; +} + +#upload .filelist div.file-panel span.rotateRight { + display: none; + background-position: -24px -24px; +} + +#upload .filelist div.file-panel span.rotateRight:hover { + background-position: -24px 0; +} + +#upload .filelist div.file-panel span.cancel { + background-position: -48px -24px; +} + +#upload .filelist div.file-panel span.cancel:hover { + background-position: -48px 0; +} + +#upload .statusBar { + height: 45px; + border-bottom: 1px solid #dadada; + margin: 0 10px; + padding: 0; + line-height: 45px; + vertical-align: middle; + position: relative; +} + +#upload .statusBar .progress { + border: 1px solid #1483d8; + width: 198px; + background: #fff; + height: 18px; + position: absolute; + top: 12px; + display: none; + text-align: center; + line-height: 18px; + color: #6dbfff; + margin: 0 10px 0 0; +} + +#upload .statusBar .progress span.percentage { + width: 0; + height: 100%; + left: 0; + top: 0; + background: #1483d8; + position: absolute; +} + +#upload .statusBar .progress span.text { + position: relative; + z-index: 10; +} + +#upload .statusBar .info { + display: inline-block; + font-size: 14px; + color: #666666; +} + +#upload .statusBar .btns { + position: absolute; + top: 7px; + right: 0; + line-height: 30px; +} + +#filePickerBtn { + display: inline-block; + float: left; +} + +#upload .statusBar .btns .webuploader-pick, +#upload .statusBar .btns .uploadBtn, +#upload .statusBar .btns .uploadBtn.state-uploading, +#upload .statusBar .btns .uploadBtn.state-paused { + background: #ffffff; + border: 1px solid #cfcfcf; + color: #565656; + padding: 0 18px; + display: inline-block; + border-radius: 3px; + margin-left: 10px; + cursor: pointer; + font-size: 14px; + float: left; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +#upload .statusBar .btns .webuploader-pick-hover, +#upload .statusBar .btns .uploadBtn:hover, +#upload .statusBar .btns .uploadBtn.state-uploading:hover, +#upload .statusBar .btns .uploadBtn.state-paused:hover { + background: #f0f0f0; +} + +#upload .statusBar .btns .uploadBtn, +#upload .statusBar .btns .uploadBtn.state-paused { + background: #00b7ee; + color: #fff; + border-color: transparent; +} + +#upload .statusBar .btns .uploadBtn:hover, +#upload .statusBar .btns .uploadBtn.state-paused:hover { + background: #00a2d4; +} + +#upload .statusBar .btns .uploadBtn.disabled { + pointer-events: none; + filter: alpha(opacity=60); + -moz-opacity: 0.6; + -khtml-opacity: 0.6; + opacity: 0.6; +} + +/* 图片管理样式 */ +#online { + width: 100%; + height: 336px; + padding: 10px 0 0 0; +} + +#online #imageList { + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + position: relative; +} + +#online ul { + display: block; + list-style: none; + margin: 0; + padding: 0; +} + +#online li { + float: left; + display: block; + list-style: none; + padding: 0; + width: 113px; + height: 113px; + margin: 0 0 9px 9px; + *margin: 0 0 6px 6px; + background-color: #eee; + overflow: hidden; + cursor: pointer; + position: relative; +} + +#online li.clearFloat { + float: none; + clear: both; + display: block; + width: 0; + height: 0; + margin: 0; + padding: 0; +} + +#online li img { + cursor: pointer; +} + +#online li .icon { + cursor: pointer; + width: 113px; + height: 113px; + position: absolute; + top: 0; + left: 0; + z-index: 2; + border: 0; + background-repeat: no-repeat; +} + +#online li .icon:hover { + width: 107px; + height: 107px; + border: 3px solid #1094fa; +} + +#online li.selected .icon { + background-image: url(images/success.png); + background-image: url(images/success.gif) \9; + background-position: 75px 75px; +} + +#online li.selected .icon:hover { + width: 107px; + height: 107px; + border: 3px solid #1094fa; + background-position: 72px 72px; +} + +/* 图片搜索样式 */ +#search .searchBar { + width: 100%; + height: 30px; + margin: 10px 0 5px 0; + padding: 0; +} + +#search input.text { + width: 150px; + padding: 3px 6px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} + +#search input.text:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); +} + +#search input.searchTxt { + margin-left: 5px; + padding-left: 5px; + background: #FFF; + width: 300px; + *width: 260px; + height: 21px; + line-height: 21px; + float: left; + dislay: block; +} + +#search .searchType { + width: 65px; + height: 28px; + padding: 0; + line-height: 28px; + border: 1px solid #d7d7d7; + border-radius: 0; + vertical-align: top; + margin-left: 5px; + float: left; + dislay: block; +} + +#search #searchBtn, +#search #searchReset { + display: inline-block; + margin-bottom: 0; + margin-right: 5px; + padding: 4px 10px; + font-weight: 400; + text-align: center; + vertical-align: middle; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + font-size: 14px; + border-radius: 4px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + vertical-align: top; + float: right; +} + +#search #searchBtn { + color: white; + border-color: #285e8e; + background-color: #3b97d7; +} + +#search #searchReset { + color: #333; + border-color: #ccc; + background-color: #fff; +} + +#search #searchBtn:hover { + background-color: #3276b1; +} + +#search #searchReset:hover { + background-color: #eee; +} + +#search .msg { + margin-left: 5px; +} + +#search .searchList { + width: 100%; + height: 300px; + overflow: hidden; + clear: both; +} + +#search .searchList ul { + margin: 0; + padding: 0; + list-style: none; + clear: both; + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + zoom: 1; + position: relative; +} + +#search .searchList li { + list-style: none; + float: left; + display: block; + width: 115px; + margin: 5px 10px 5px 20px; + *margin: 5px 10px 5px 15px; + padding: 0; + font-size: 12px; + box-shadow: 0 1px 3px rgba(0, 0, 0, .3); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, .3); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, .3); + position: relative; + vertical-align: top; + text-align: center; + overflow: hidden; + cursor: pointer; + filter: alpha(Opacity=100); + -moz-opacity: 1; + opacity: 1; + border: 2px solid #eee; +} + +#search .searchList li.selected { + filter: alpha(Opacity=40); + -moz-opacity: 0.4; + opacity: 0.4; + border: 2px solid #00a0e9; +} + +#search .searchList li p { + background-color: #eee; + margin: 0; + padding: 0; + position: relative; + width: 100%; + height: 115px; + overflow: hidden; +} + +#search .searchList li p img { + cursor: pointer; + border: 0; +} + +#search .searchList li a { + color: #999; + border-top: 1px solid #F2F2F2; + background: #FAFAFA; + text-align: center; + display: block; + padding: 0 5px; + width: 105px; + height: 32px; + line-height: 32px; + white-space: nowrap; + text-overflow: ellipsis; + text-decoration: none; + overflow: hidden; + word-break: break-all; +} + +#search .searchList a:hover { + text-decoration: underline; + color: #333; +} + +#search .searchList .clearFloat { + clear: both; +} \ No newline at end of file diff --git a/admin/dialogs/image/image.html b/admin/dialogs/image/image.html new file mode 100644 index 0000000..bee43f6 --- /dev/null +++ b/admin/dialogs/image/image.html @@ -0,0 +1,126 @@ + + + + + ueditor图片对话框 + + + + + + + + + + + + + + +
    +
    + + + + +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    + + +
    +
    +
    +
    + +   px +   px + +
    +
    + + px +
    +
    + + px +
    +
    + + +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    + 0% + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
      +
    • +
    +
    +
    + + +
    +
    +
    + + + + +
    +
    + + + + \ No newline at end of file diff --git a/admin/dialogs/image/image.js b/admin/dialogs/image/image.js new file mode 100644 index 0000000..1db36f2 --- /dev/null +++ b/admin/dialogs/image/image.js @@ -0,0 +1,1150 @@ +/** + * User: Jinqn + * Date: 14-04-08 + * Time: 下午16:34 + * 上传图片对话框逻辑代码,包括tab: 远程图片/上传图片/在线图片/搜索图片 + */ + +(function () { + + var remoteImage, + uploadImage, + onlineImage, + searchImage; + + window.onload = function () { + initTabs(); + initAlign(); + initButtons(); + }; + + /* 初始化tab标签 */ + function initTabs() { + var tabs = $G('tabhead').children; + for (var i = 0; i < tabs.length; i++) { + domUtils.on(tabs[i], "click", function (e) { + var target = e.target || e.srcElement; + setTabFocus(target.getAttribute('data-content-id')); + }); + } + + var img = editor.selection.getRange().getClosedNode(); + if (img && img.tagName && img.tagName.toLowerCase() == 'img') { + setTabFocus('remote'); + } else { + setTabFocus('upload'); + } + } + + /* 初始化tabbody */ + function setTabFocus(id) { + if (!id) return; + var i, bodyId, tabs = $G('tabhead').children; + for (i = 0; i < tabs.length; i++) { + bodyId = tabs[i].getAttribute('data-content-id'); + if (bodyId == id) { + domUtils.addClass(tabs[i], 'focus'); + domUtils.addClass($G(bodyId), 'focus'); + } else { + domUtils.removeClasses(tabs[i], 'focus'); + domUtils.removeClasses($G(bodyId), 'focus'); + } + } + switch (id) { + case 'remote': + remoteImage = remoteImage || new RemoteImage(); + break; + case 'upload': + setAlign(editor.getOpt('imageInsertAlign')); + uploadImage = uploadImage || new UploadImage('queueList'); + break; + case 'online': + setAlign(editor.getOpt('imageManagerInsertAlign')); + onlineImage = onlineImage || new OnlineImage('imageList'); + onlineImage.reset(); + break; + case 'search': + setAlign(editor.getOpt('imageManagerInsertAlign')); + searchImage = searchImage || new SearchImage(); + break; + } + } + + /* 初始化onok事件 */ + function initButtons() { + + dialog.onok = function () { + var remote = false, list = [], id, tabs = $G('tabhead').children; + for (var i = 0; i < tabs.length; i++) { + if (domUtils.hasClass(tabs[i], 'focus')) { + id = tabs[i].getAttribute('data-content-id'); + break; + } + } + + switch (id) { + case 'remote': + list = remoteImage.getInsertList(); + break; + case 'upload': + list = uploadImage.getInsertList(); + var count = uploadImage.getQueueCount(); + if (count) { + $('.info', '#queueList').html('' + '还有2个未上传文件'.replace(/[\d]/, count) + ''); + return false; + } + break; + case 'online': + list = onlineImage.getInsertList(); + break; + case 'search': + list = searchImage.getInsertList(); + remote = true; + break; + } + + if (list) { + editor.execCommand('insertimage', list); + remote && editor.fireEvent("catchRemoteImage"); + } + }; + } + + + /* 初始化对其方式的点击事件 */ + function initAlign() { + /* 点击align图标 */ + domUtils.on($G("alignIcon"), 'click', function (e) { + var target = e.target || e.srcElement; + if (target.className && target.className.indexOf('-align') != -1) { + setAlign(target.getAttribute('data-align')); + } + }); + } + + /* 设置对齐方式 */ + function setAlign(align) { + align = align || 'none'; + var aligns = $G("alignIcon").children; + for (i = 0; i < aligns.length; i++) { + if (aligns[i].getAttribute('data-align') == align) { + domUtils.addClass(aligns[i], 'focus'); + $G("align").value = aligns[i].getAttribute('data-align'); + } else { + domUtils.removeClasses(aligns[i], 'focus'); + } + } + } + + /* 获取对齐方式 */ + function getAlign() { + var align = $G("align").value || 'none'; + return align == 'none' ? '' : align; + } + + + /* 在线图片 */ + function RemoteImage(target) { + this.container = utils.isString(target) ? document.getElementById(target) : target; + this.init(); + } + + RemoteImage.prototype = { + init: function () { + this.initContainer(); + this.initEvents(); + }, + initContainer: function () { + this.dom = { + 'url': $G('url'), + 'width': $G('width'), + 'height': $G('height'), + 'border': $G('border'), + 'vhSpace': $G('vhSpace'), + 'title': $G('title'), + 'align': $G('align') + }; + var img = editor.selection.getRange().getClosedNode(); + if (img) { + this.setImage(img); + } + }, + initEvents: function () { + var _this = this, + locker = $G('lock'); + + /* 改变url */ + domUtils.on($G("url"), 'keyup', updatePreview); + domUtils.on($G("border"), 'keyup', updatePreview); + domUtils.on($G("title"), 'keyup', updatePreview); + + domUtils.on($G("width"), 'keyup', function () { + updatePreview(); + if (locker.checked) { + var proportion = locker.getAttribute('data-proportion'); + $G('height').value = Math.round(this.value / proportion); + } else { + _this.updateLocker(); + } + }); + domUtils.on($G("height"), 'keyup', function () { + updatePreview(); + if (locker.checked) { + var proportion = locker.getAttribute('data-proportion'); + $G('width').value = Math.round(this.value * proportion); + } else { + _this.updateLocker(); + } + }); + domUtils.on($G("lock"), 'change', function () { + var proportion = parseInt($G("width").value) / parseInt($G("height").value); + locker.setAttribute('data-proportion', proportion); + }); + + function updatePreview() { + _this.setPreview(); + } + }, + updateLocker: function () { + var width = $G('width').value, + height = $G('height').value, + locker = $G('lock'); + if (width && height && width == parseInt(width) && height == parseInt(height)) { + locker.disabled = false; + locker.title = ''; + } else { + locker.checked = false; + locker.disabled = 'disabled'; + locker.title = lang.remoteLockError; + } + }, + setImage: function (img) { + /* 不是正常的图片 */ + if (!img.tagName || img.tagName.toLowerCase() != 'img' && !img.getAttribute("src") || !img.src) return; + + var wordImgFlag = img.getAttribute("word_img"), + src = wordImgFlag ? wordImgFlag.replace("&", "&") : (img.getAttribute('_src') || img.getAttribute("src", 2).replace("&", "&")), + align = editor.queryCommandValue("imageFloat"); + + /* 防止onchange事件循环调用 */ + if (src !== $G("url").value) $G("url").value = src; + if (src) { + /* 设置表单内容 */ + $G("width").value = img.width || ''; + $G("height").value = img.height || ''; + $G("border").value = img.getAttribute("border") || '0'; + $G("vhSpace").value = img.getAttribute("vspace") || '0'; + $G("title").value = img.title || img.alt || ''; + setAlign(align); + this.setPreview(); + this.updateLocker(); + } + }, + getData: function () { + var data = {}; + for (var k in this.dom) { + data[k] = this.dom[k].value; + } + return data; + }, + setPreview: function () { + var url = $G('url').value, + ow = parseInt($G('width').value, 10) || 0, + oh = parseInt($G('height').value, 10) || 0, + border = parseInt($G('border').value, 10) || 0, + title = $G('title').value, + preview = $G('preview'), + width, + height; + + url = utils.unhtmlForUrl(url); + title = utils.unhtml(title); + + width = ((!ow || !oh) ? preview.offsetWidth : Math.min(ow, preview.offsetWidth)); + width = width + (border * 2) > preview.offsetWidth ? width : (preview.offsetWidth - (border * 2)); + height = (!ow || !oh) ? '' : width * oh / ow; + + if (url) { + preview.innerHTML = ''; + } + }, + getInsertList: function () { + var data = this.getData(); + if (data['url']) { + return [{ + src: data['url'], + _src: data['url'], + width: data['width'] || '', + height: data['height'] || '', + border: data['border'] || '', + floatStyle: data['align'] || '', + vspace: data['vhSpace'] || '', + title: data['title'] || '', + alt: data['title'] || '', + style: "width:" + data['width'] + "px;height:" + data['height'] + "px;" + }]; + } else { + return []; + } + } + }; + + + /* 上传图片 */ + function UploadImage(target) { + this.$wrap = target.constructor == String ? $('#' + target) : $(target); + this.init(); + } + + UploadImage.prototype = { + init: function () { + this.imageList = []; + this.initContainer(); + this.initUploader(); + }, + initContainer: function () { + this.$queue = this.$wrap.find('.filelist'); + }, + /* 初始化容器 */ + initUploader: function () { + var _this = this, + $ = jQuery, // just in case. Make sure it's not an other libaray. + $wrap = _this.$wrap, + // 图片容器 + $queue = $wrap.find('.filelist'), + // 状态栏,包括进度和控制按钮 + $statusBar = $wrap.find('.statusBar'), + // 文件总体选择信息。 + $info = $statusBar.find('.info'), + // 上传按钮 + $upload = $wrap.find('.uploadBtn'), + // 上传按钮 + $filePickerBtn = $wrap.find('.filePickerBtn'), + // 上传按钮 + $filePickerBlock = $wrap.find('.filePickerBlock'), + // 没选择文件之前的内容。 + $placeHolder = $wrap.find('.placeholder'), + // 总体进度条 + $progress = $statusBar.find('.progress').hide(), + // 添加的文件数量 + fileCount = 0, + // 添加的文件总大小 + fileSize = 0, + // 优化retina, 在retina下这个值是2 + ratio = window.devicePixelRatio || 1, + // 缩略图大小 + thumbnailWidth = 113 * ratio, + thumbnailHeight = 113 * ratio, + // 可能有pedding, ready, uploading, confirm, done. + state = '', + // 所有文件的进度信息,key为file id + percentages = {}, + supportTransition = (function () { + var s = document.createElement('p').style, + r = 'transition' in s || + 'WebkitTransition' in s || + 'MozTransition' in s || + 'msTransition' in s || + 'OTransition' in s; + s = null; + return r; + })(), + // WebUploader实例 + uploader, + actionUrl = editor.getActionUrl(editor.getOpt('imageActionName')), + acceptExtensions = (editor.getOpt('imageAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, ''), + imageMaxSize = editor.getOpt('imageMaxSize'), + imageCompressBorder = editor.getOpt('imageCompressBorder'); + + if (!WebUploader.Uploader.support()) { + $('#filePickerReady').after($('
    "},postRender:function(){for(var a=this.getDom(),c=0;c
    ').html(lang.errorNotSupport)).hide(); + return; + } else if (!editor.getOpt('imageActionName')) { + $('#filePickerReady').after($('
    ').html(lang.errorLoadConfig)).hide(); + return; + } + + uploader = _this.uploader = WebUploader.create({ + pick: { + id: '#filePickerReady', + label: lang.uploadSelectFile + }, + accept: { + title: 'Images', + extensions: acceptExtensions, + mimeTypes: 'image/*' + }, + swf: '../../third-party/webuploader/Uploader.swf', + server: actionUrl, + fileVal: editor.getOpt('imageFieldName'), + duplicate: true, + fileSingleSizeLimit: imageMaxSize, // 默认 2 M + compress: editor.getOpt('imageCompressEnable') ? { + width: imageCompressBorder, + height: imageCompressBorder, + // 图片质量,只有type为`image/jpeg`的时候才有效。 + quality: 90, + // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false. + allowMagnify: false, + // 是否允许裁剪。 + crop: false, + // 是否保留头部meta信息。 + preserveHeaders: true + } : false + }); + uploader.addButton({ + id: '#filePickerBlock' + }); + uploader.addButton({ + id: '#filePickerBtn', + label: lang.uploadAddFile + }); + + setState('pedding'); + + // 当有文件添加进来时执行,负责view的创建 + function addFile(file) { + var $li = $('
  • ' + + '

    ' + file.name + '

    ' + + '

    ' + + '

    ' + + '
  • '), + + $btns = $('
    ' + + '' + lang.uploadDelete + '' + + '' + lang.uploadTurnRight + '' + + '' + lang.uploadTurnLeft + '
    ').appendTo($li), + $prgress = $li.find('p.progress span'), + $wrap = $li.find('p.imgWrap'), + $info = $('

    ').hide().appendTo($li), + + showError = function (code) { + switch (code) { + case 'exceed_size': + text = lang.errorExceedSize; + break; + case 'interrupt': + text = lang.errorInterrupt; + break; + case 'http': + text = lang.errorHttp; + break; + case 'not_allow_type': + text = lang.errorFileType; + break; + default: + text = lang.errorUploadRetry; + break; + } + $info.text(text).show(); + }; + + if (file.getStatus() === 'invalid') { + showError(file.statusText); + } else { + $wrap.text(lang.uploadPreview); + if (browser.ie && browser.version <= 7) { + $wrap.text(lang.uploadNoPreview); + } else { + uploader.makeThumb(file, function (error, src) { + if (error || !src) { + $wrap.text(lang.uploadNoPreview); + } else { + var $img = $(''); + $wrap.empty().append($img); + $img.on('error', function () { + $wrap.text(lang.uploadNoPreview); + }); + } + }, thumbnailWidth, thumbnailHeight); + } + percentages[file.id] = [file.size, 0]; + file.rotation = 0; + + /* 检查文件格式 */ + if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) { + showError('not_allow_type'); + uploader.removeFile(file); + } + } + + file.on('statuschange', function (cur, prev) { + if (prev === 'progress') { + $prgress.hide().width(0); + } else if (prev === 'queued') { + $li.off('mouseenter mouseleave'); + $btns.remove(); + } + // 成功 + if (cur === 'error' || cur === 'invalid') { + showError(file.statusText); + percentages[file.id][1] = 1; + } else if (cur === 'interrupt') { + showError('interrupt'); + } else if (cur === 'queued') { + percentages[file.id][1] = 0; + } else if (cur === 'progress') { + $info.hide(); + $prgress.css('display', 'block'); + } else if (cur === 'complete') { + } + + $li.removeClass('state-' + prev).addClass('state-' + cur); + }); + + $li.on('mouseenter', function () { + $btns.stop().animate({height: 30}); + }); + $li.on('mouseleave', function () { + $btns.stop().animate({height: 0}); + }); + + $btns.on('click', 'span', function () { + var index = $(this).index(), + deg; + + switch (index) { + case 0: + uploader.removeFile(file); + return; + case 1: + file.rotation += 90; + break; + case 2: + file.rotation -= 90; + break; + } + + if (supportTransition) { + deg = 'rotate(' + file.rotation + 'deg)'; + $wrap.css({ + '-webkit-transform': deg, + '-mos-transform': deg, + '-o-transform': deg, + 'transform': deg + }); + } else { + $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')'); + } + + }); + + $li.insertBefore($filePickerBlock); + } + + // 负责view的销毁 + function removeFile(file) { + var $li = $('#' + file.id); + delete percentages[file.id]; + updateTotalProgress(); + $li.off().find('.file-panel').off().end().remove(); + } + + function updateTotalProgress() { + var loaded = 0, + total = 0, + spans = $progress.children(), + percent; + + $.each(percentages, function (k, v) { + total += v[0]; + loaded += v[0] * v[1]; + }); + + percent = total ? loaded / total : 0; + + spans.eq(0).text(Math.round(percent * 100) + '%'); + spans.eq(1).css('width', Math.round(percent * 100) + '%'); + updateStatus(); + } + + function setState(val, files) { + + if (val != state) { + + var stats = uploader.getStats(); + + $upload.removeClass('state-' + state); + $upload.addClass('state-' + val); + + switch (val) { + + /* 未选择文件 */ + case 'pedding': + $queue.addClass('element-invisible'); + $statusBar.addClass('element-invisible'); + $placeHolder.removeClass('element-invisible'); + $progress.hide(); + $info.hide(); + uploader.refresh(); + break; + + /* 可以开始上传 */ + case 'ready': + $placeHolder.addClass('element-invisible'); + $queue.removeClass('element-invisible'); + $statusBar.removeClass('element-invisible'); + $progress.hide(); + $info.show(); + $upload.text(lang.uploadStart); + uploader.refresh(); + break; + + /* 上传中 */ + case 'uploading': + $progress.show(); + $info.hide(); + $upload.text(lang.uploadPause); + break; + + /* 暂停上传 */ + case 'paused': + $progress.show(); + $info.hide(); + $upload.text(lang.uploadContinue); + break; + + case 'confirm': + $progress.show(); + $info.hide(); + $upload.text(lang.uploadStart); + + stats = uploader.getStats(); + if (stats.successNum && !stats.uploadFailNum) { + setState('finish'); + return; + } + break; + + case 'finish': + $progress.hide(); + $info.show(); + if (stats.uploadFailNum) { + $upload.text(lang.uploadRetry); + } else { + $upload.text(lang.uploadStart); + } + break; + } + + state = val; + updateStatus(); + + } + + if (!_this.getQueueCount()) { + $upload.addClass('disabled') + } else { + $upload.removeClass('disabled') + } + + } + + function updateStatus() { + var text = '', stats; + + if (state === 'ready') { + text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize)); + } else if (state === 'confirm') { + stats = uploader.getStats(); + if (stats.uploadFailNum) { + text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum); + } + } else { + stats = uploader.getStats(); + text = lang.updateStatusFinish.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize)).replace('_', stats.successNum); + + if (stats.uploadFailNum) { + text += lang.updateStatusError.replace('_', stats.uploadFailNum); + } + } + + $info.html(text); + } + + uploader.on('fileQueued', function (file) { + fileCount++; + fileSize += file.size; + + if (fileCount === 1) { + $placeHolder.addClass('element-invisible'); + $statusBar.show(); + } + + addFile(file); + }); + + uploader.on('fileDequeued', function (file) { + fileCount--; + fileSize -= file.size; + + removeFile(file); + updateTotalProgress(); + }); + + uploader.on('filesQueued', function (file) { + if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) { + setState('ready'); + } + updateTotalProgress(); + }); + + uploader.on('all', function (type, files) { + switch (type) { + case 'uploadFinished': + setState('confirm', files); + break; + case 'startUpload': + /* 添加额外的GET参数 */ + var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '', + url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?' : '&') + 'encode=utf-8&' + params); + uploader.option('server', url); + setState('uploading', files); + break; + case 'stopUpload': + setState('paused', files); + break; + } + }); + + uploader.on('uploadBeforeSend', function (file, data, header) { + //这里可以通过data对象添加POST参数 + header['X_Requested_With'] = 'XMLHttpRequest'; + }); + + uploader.on('uploadProgress', function (file, percentage) { + var $li = $('#' + file.id), + $percent = $li.find('.progress span'); + + $percent.css('width', percentage * 100 + '%'); + percentages[file.id][1] = percentage; + updateTotalProgress(); + }); + + uploader.on('uploadSuccess', function (file, ret) { + var $file = $('#' + file.id); + try { + var responseText = (ret._raw || ret), + json = utils.str2json(responseText); + if (json.state == 'SUCCESS') { + _this.imageList.push(json); + $file.append(''); + } else { + $file.find('.error').text(json.state).show(); + } + } catch (e) { + $file.find('.error').text(lang.errorServerUpload).show(); + } + }); + + uploader.on('uploadError', function (file, code) { + }); + uploader.on('error', function (code, file) { + if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') { + addFile(file); + } + }); + uploader.on('uploadComplete', function (file, ret) { + }); + + $upload.on('click', function () { + if ($(this).hasClass('disabled')) { + return false; + } + + if (state === 'ready') { + uploader.upload(); + } else if (state === 'paused') { + uploader.upload(); + } else if (state === 'uploading') { + uploader.stop(); + } + }); + + $upload.addClass('state-' + state); + updateTotalProgress(); + }, + getQueueCount: function () { + var file, i, status, readyFile = 0, files = this.uploader.getFiles(); + for (i = 0; file = files[i++];) { + status = file.getStatus(); + if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++; + } + return readyFile; + }, + destroy: function () { + this.$wrap.remove(); + }, + getInsertList: function () { + var i, data, list = [], + align = getAlign(), + prefix = editor.getOpt('imageUrlPrefix'); + for (i = 0; i < this.imageList.length; i++) { + data = this.imageList[i]; + list.push({ + src: prefix + data.url, + _src: prefix + data.url, + title: data.title, + alt: data.original, + floatStyle: align + }); + } + return list; + } + }; + + + /* 在线图片 */ + function OnlineImage(target) { + this.container = utils.isString(target) ? document.getElementById(target) : target; + this.init(); + } + + OnlineImage.prototype = { + init: function () { + this.reset(); + this.initEvents(); + }, + /* 初始化容器 */ + initContainer: function () { + this.container.innerHTML = ''; + this.list = document.createElement('ul'); + this.clearFloat = document.createElement('li'); + + domUtils.addClass(this.list, 'list'); + domUtils.addClass(this.clearFloat, 'clearFloat'); + + this.list.appendChild(this.clearFloat); + this.container.appendChild(this.list); + }, + /* 初始化滚动事件,滚动到地步自动拉取数据 */ + initEvents: function () { + var _this = this; + + /* 滚动拉取图片 */ + domUtils.on($G('imageList'), 'scroll', function (e) { + var panel = this; + if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) { + _this.getImageData(); + } + }); + /* 选中图片 */ + domUtils.on(this.container, 'click', function (e) { + var target = e.target || e.srcElement, + li = target.parentNode; + + if (li.tagName.toLowerCase() == 'li') { + if (domUtils.hasClass(li, 'selected')) { + domUtils.removeClasses(li, 'selected'); + } else { + domUtils.addClass(li, 'selected'); + } + } + }); + }, + /* 初始化第一次的数据 */ + initData: function () { + + /* 拉取数据需要使用的值 */ + this.state = 0; + this.listSize = editor.getOpt('imageManagerListSize'); + this.listIndex = 0; + this.listEnd = false; + + /* 第一次拉取数据 */ + this.getImageData(); + }, + /* 重置界面 */ + reset: function () { + this.initContainer(); + this.initData(); + }, + /* 向后台拉取图片列表数据 */ + getImageData: function () { + var _this = this; + + if (!_this.listEnd && !this.isLoadingData) { + this.isLoadingData = true; + var url = editor.getActionUrl(editor.getOpt('imageManagerActionName')), + isJsonp = utils.isCrossDomainUrl(url); + ajax.request(url, { + 'timeout': 100000, + 'dataType': isJsonp ? 'jsonp' : '', + 'data': utils.extend({ + start: this.listIndex, + size: this.listSize + }, editor.queryCommandValue('serverparam')), + 'method': 'get', + 'onsuccess': function (r) { + try { + var json = isJsonp ? r : eval('(' + r.responseText + ')'); + if (json.state == 'SUCCESS') { + _this.pushData(json.list); + _this.listIndex = parseInt(json.start) + parseInt(json.list.length); + if (_this.listIndex >= json.total) { + _this.listEnd = true; + } + _this.isLoadingData = false; + } + } catch (e) { + if (r.responseText.indexOf('ue_separate_ue') != -1) { + var list = r.responseText.split(r.responseText); + _this.pushData(list); + _this.listIndex = parseInt(list.length); + _this.listEnd = true; + _this.isLoadingData = false; + } + } + }, + 'onerror': function () { + _this.isLoadingData = false; + } + }); + } + }, + /* 添加图片到列表界面上 */ + pushData: function (list) { + var i, item, img, icon, _this = this, + urlPrefix = editor.getOpt('imageManagerUrlPrefix'); + for (i = 0; i < list.length; i++) { + if (list[i] && list[i].url) { + item = document.createElement('li'); + img = document.createElement('img'); + icon = document.createElement('span'); + + domUtils.on(img, 'load', (function (image) { + return function () { + _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight); + } + })(img)); + img.width = 113; + img.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=' : '&noCache=') + (+new Date()).toString(36)); + img.setAttribute('_src', urlPrefix + list[i].url); + domUtils.addClass(icon, 'icon'); + + item.appendChild(img); + item.appendChild(icon); + this.list.insertBefore(item, this.clearFloat); + } + } + }, + /* 改变图片大小 */ + scale: function (img, w, h, type) { + var ow = img.width, + oh = img.height; + + if (type == 'justify') { + if (ow >= oh) { + img.width = w; + img.height = h * oh / ow; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w * ow / oh; + img.height = h; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + } else { + if (ow >= oh) { + img.width = w * ow / oh; + img.height = h; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w; + img.height = h * oh / ow; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + } + }, + getInsertList: function () { + var i, lis = this.list.children, list = [], align = getAlign(); + for (i = 0; i < lis.length; i++) { + if (domUtils.hasClass(lis[i], 'selected')) { + var img = lis[i].firstChild, + src = img.getAttribute('_src'); + list.push({ + src: src, + _src: src, + alt: src.substr(src.lastIndexOf('/') + 1), + floatStyle: align + }); + } + + } + return list; + } + }; + + /*搜索图片 */ + function SearchImage() { + this.init(); + } + + SearchImage.prototype = { + init: function () { + this.initEvents(); + }, + initEvents: function () { + var _this = this; + + /* 点击搜索按钮 */ + domUtils.on($G('searchBtn'), 'click', function () { + var key = $G('searchTxt').value; + if (key && key != lang.searchRemind) { + _this.getImageData(); + } + }); + /* 点击清除妞 */ + domUtils.on($G('searchReset'), 'click', function () { + $G('searchTxt').value = lang.searchRemind; + $G('searchListUl').innerHTML = ''; + $G('searchType').selectedIndex = 0; + }); + /* 搜索框聚焦 */ + domUtils.on($G('searchTxt'), 'focus', function () { + var key = $G('searchTxt').value; + if (key && key == lang.searchRemind) { + $G('searchTxt').value = ''; + } + }); + /* 搜索框回车键搜索 */ + domUtils.on($G('searchTxt'), 'keydown', function (e) { + var keyCode = e.keyCode || e.which; + if (keyCode == 13) { + $G('searchBtn').click(); + } + }); + + /* 选中图片 */ + domUtils.on($G('searchList'), 'click', function (e) { + var target = e.target || e.srcElement, + li = target.parentNode.parentNode; + + if (li.tagName.toLowerCase() == 'li') { + if (domUtils.hasClass(li, 'selected')) { + domUtils.removeClasses(li, 'selected'); + } else { + domUtils.addClass(li, 'selected'); + } + } + }); + }, + encodeToGb2312: function (str) { + if (!str) return ''; + var strOut = "", + z = 'D2BBB6A18140C6DF814181428143CDF2D5C9C8FDC9CFCFC2D8A2B2BBD3EB8144D8A4B3F38145D7A8C7D2D8A7CAC08146C7F0B1FBD2B5B4D4B6ABCBBFD8A9814781488149B6AA814AC1BDD1CF814BC9A5D8AD814CB8F6D1BEE3DCD6D0814D814EB7E1814FB4AE8150C1D98151D8BC8152CDE8B5A4CEAAD6F78153C0F6BED9D8AF815481558156C4CB8157BEC38158D8B1C3B4D2E58159D6AECEDAD5A7BAF5B7A6C0D6815AC6B9C5D2C7C7815BB9D4815CB3CBD2D2815D815ED8BFBEC5C6F2D2B2CFB0CFE7815F816081618162CAE981638164D8C081658166816781688169816AC2F2C2D2816BC8E9816C816D816E816F817081718172817381748175C7AC8176817781788179817A817B817CC1CB817DD3E8D5F9817ECAC2B6FED8A1D3DABFF78180D4C6BBA5D8C1CEE5BEAE81818182D8A88183D1C7D0A9818481858186D8BDD9EFCDF6BFBA8187BDBBBAA5D2E0B2FABAE0C4B68188CFEDBEA9CDA4C1C18189818A818BC7D7D9F1818CD9F4818D818E818F8190C8CBD8E9819181928193D2DACAB2C8CAD8ECD8EAD8C6BDF6C6CDB3F08194D8EBBDF1BDE98195C8D4B4D381968197C2D88198B2D6D7D0CACBCBFBD5CCB8B6CFC98199819A819BD9DAD8F0C7AA819CD8EE819DB4FAC1EED2D4819E819FD8ED81A0D2C7D8EFC3C781A181A281A3D1F681A4D6D9D8F281A5D8F5BCFEBCDB81A681A781A8C8CE81A9B7DD81AAB7C281ABC6F381AC81AD81AE81AF81B081B181B2D8F8D2C181B381B4CEE9BCBFB7FCB7A5D0DD81B581B681B781B881B9D6DAD3C5BBEFBBE1D8F181BA81BBC9A1CEB0B4AB81BCD8F381BDC9CBD8F6C2D7D8F781BE81BFCEB1D8F981C081C181C2B2AEB9C081C3D9A381C4B0E981C5C1E681C6C9EC81C7CBC581C8CBC6D9A481C981CA81CB81CC81CDB5E881CE81CFB5AB81D081D181D281D381D481D5CEBBB5CDD7A1D7F4D3D381D6CCE581D7BACE81D8D9A2D9DCD3E0D8FDB7F0D7F7D8FED8FAD9A1C4E381D981DAD3B6D8F4D9DD81DBD8FB81DCC5E581DD81DEC0D081DF81E0D1F0B0DB81E181E2BCD1D9A681E3D9A581E481E581E681E7D9ACD9AE81E8D9ABCAB981E981EA81EBD9A9D6B681EC81ED81EEB3DED9A881EFC0FD81F0CACC81F1D9AA81F2D9A781F381F4D9B081F581F6B6B181F781F881F9B9A981FAD2C081FB81FCCFC081FD81FEC2C28240BDC4D5ECB2E0C7C8BFEBD9AD8241D9AF8242CEEABAEE82438244824582468247C7D682488249824A824B824C824D824E824F8250B1E3825182528253B4D9B6EDD9B48254825582568257BFA182588259825AD9DEC7CEC0FED9B8825B825C825D825E825FCBD7B7FD8260D9B58261D9B7B1A3D3E1D9B98262D0C58263D9B682648265D9B18266D9B2C1A9D9B382678268BCF3D0DEB8A98269BEE3826AD9BD826B826C826D826ED9BA826FB0B3827082718272D9C28273827482758276827782788279827A827B827C827D827E8280D9C4B1B68281D9BF82828283B5B98284BEF3828582868287CCC8BAF2D2D08288D9C38289828ABDE8828BB3AB828C828D828ED9C5BEEB828FD9C6D9BBC4DF8290D9BED9C1D9C0829182928293829482958296829782988299829A829BD5AE829CD6B5829DC7E3829E829F82A082A1D9C882A282A382A4BCD9D9CA82A582A682A7D9BC82A8D9CBC6AB82A982AA82AB82AC82ADD9C982AE82AF82B082B1D7F682B2CDA382B382B482B582B682B782B882B982BABDA182BB82BC82BD82BE82BF82C0D9CC82C182C282C382C482C582C682C782C882C9C5BCCDB582CA82CB82CCD9CD82CD82CED9C7B3A5BFFE82CF82D082D182D2B8B582D382D4C0FC82D582D682D782D8B0F882D982DA82DB82DC82DD82DE82DF82E082E182E282E382E482E582E682E782E882E982EA82EB82EC82EDB4F682EED9CE82EFD9CFB4A2D9D082F082F1B4DF82F282F382F482F582F6B0C182F782F882F982FA82FB82FC82FDD9D1C9B582FE8340834183428343834483458346834783488349834A834B834C834D834E834F83508351CFF1835283538354835583568357D9D283588359835AC1C5835B835C835D835E835F836083618362836383648365D9D6C9AE8366836783688369D9D5D9D4D9D7836A836B836C836DCBDB836EBDA9836F8370837183728373C6A7837483758376837783788379837A837B837C837DD9D3D9D8837E83808381D9D9838283838384838583868387C8E583888389838A838B838C838D838E838F839083918392839383948395C0DC8396839783988399839A839B839C839D839E839F83A083A183A283A383A483A583A683A783A883A983AA83AB83AC83AD83AE83AF83B083B183B2B6F9D8A3D4CA83B3D4AAD0D6B3E4D5D783B4CFC8B9E283B5BFCB83B6C3E283B783B883B9B6D283BA83BBCDC3D9EED9F083BC83BD83BEB5B383BFB6B583C083C183C283C383C4BEA483C583C6C8EB83C783C8C8AB83C983CAB0CBB9ABC1F9D9E283CBC0BCB9B283CCB9D8D0CBB1F8C6E4BEDFB5E4D7C883CDD1F8BCE6CADE83CE83CFBCBDD9E6D8E783D083D1C4DA83D283D3B8D4C8BD83D483D5B2E1D4D983D683D783D883D9C3B083DA83DBC3E1DAA2C8DF83DCD0B483DDBEFCC5A983DE83DF83E0B9DA83E1DAA383E2D4A9DAA483E383E483E583E683E7D9FBB6AC83E883E9B7EBB1F9D9FCB3E5BEF683EABFF6D2B1C0E483EB83EC83EDB6B3D9FED9FD83EE83EFBEBB83F083F183F2C6E083F3D7BCDAA183F4C1B983F5B5F2C1E883F683F7BCF583F8B4D583F983FA83FB83FC83FD83FE844084418442C1DD8443C4FD84448445BCB8B7B284468447B7EF84488449844A844B844C844DD9EC844EC6BE844FBFADBBCB84508451B5CA8452DBC9D0D78453CDB9B0BCB3F6BBF7DBCABAAF8454D4E4B5B6B5F3D8D6C8D084558456B7D6C7D0D8D78457BFAF84588459DBBBD8D8845A845BD0CCBBAE845C845D845EEBBEC1D0C1F5D4F2B8D5B4B4845FB3F584608461C9BE846284638464C5D0846584668467C5D9C0FB8468B1F08469D8D9B9CE846AB5BD846B846CD8DA846D846ED6C6CBA2C8AFC9B2B4CCBFCC846FB9F48470D8DBD8DCB6E7BCC1CCEA847184728473847484758476CFF78477D8DDC7B084788479B9D0BDA3847A847BCCDE847CC6CA847D847E848084818482D8E08483D8DE84848485D8DF848684878488B0FE8489BEE7848ACAA3BCF4848B848C848D848EB8B1848F8490B8EE849184928493849484958496849784988499849AD8E2849BBDCB849CD8E4D8E3849D849E849F84A084A1C5FC84A284A384A484A584A684A784A8D8E584A984AAD8E684AB84AC84AD84AE84AF84B084B1C1A684B2C8B0B0ECB9A6BCD3CEF1DBBDC1D384B384B484B584B6B6AFD6FAC5ACBDD9DBBEDBBF84B784B884B9C0F8BEA2C0CD84BA84BB84BC84BD84BE84BF84C084C184C284C3DBC0CAC684C484C584C6B2AA84C784C884C9D3C284CAC3E384CBD1AB84CC84CD84CE84CFDBC284D0C0D584D184D284D3DBC384D4BFB184D584D684D784D884D984DAC4BC84DB84DC84DD84DEC7DA84DF84E084E184E284E384E484E584E684E784E884E9DBC484EA84EB84EC84ED84EE84EF84F084F1D9E8C9D784F284F384F4B9B4CEF0D4C884F584F684F784F8B0FCB4D284F9D0D984FA84FB84FC84FDD9E984FEDECBD9EB8540854185428543D8B0BBAFB1B18544B3D7D8CE85458546D4D185478548BDB3BFEF8549CFBB854A854BD8D0854C854D854EB7CB854F85508551D8D185528553855485558556855785588559855A855BC6A5C7F8D2BD855C855DD8D2C4E4855ECAAE855FC7A78560D8A68561C9FDCEE7BBDCB0EB856285638564BBAAD0AD8565B1B0D7E4D7BF8566B5A5C2F4C4CF85678568B2A98569B2B7856AB1E5DFB2D5BCBFA8C2ACD8D5C2B1856BD8D4CED4856CDAE0856DCEC0856E856FD8B4C3AED3A1CEA38570BCB4C8B4C2D18571BEEDD0B68572DAE18573857485758576C7E485778578B3A78579B6F2CCFCC0FA857A857BC0F7857CD1B9D1E1D8C7857D857E85808581858285838584B2DE85858586C0E58587BAF185888589D8C8858AD4AD858B858CCFE1D8C9858DD8CACFC3858EB3F8BEC7858F859085918592D8CB8593859485958596859785988599DBCC859A859B859C859DC8A5859E859F85A0CFD885A1C8FEB2CE85A285A385A485A585A6D3D6B2E6BCB0D3D1CBABB7B485A785A885A9B7A285AA85ABCAE585ACC8A1CADCB1E4D0F085ADC5D185AE85AF85B0DBC5B5FE85B185B2BFDAB9C5BEE4C1ED85B3DFB6DFB5D6BBBDD0D5D9B0C8B6A3BFC9CCA8DFB3CAB7D3D285B4D8CFD2B6BAC5CBBECCBE85B5DFB7B5F0DFB485B685B785B8D3F585B9B3D4B8F785BADFBA85BBBACFBCAAB5F585BCCDACC3FBBAF3C0F4CDC2CFF2DFB8CFC585BDC2C0DFB9C2F085BE85BF85C0BEFD85C1C1DFCDCCD2F7B7CDDFC185C2DFC485C385C4B7F1B0C9B6D6B7D485C5BAACCCFDBFD4CBB1C6F485C6D6A8DFC585C7CEE2B3B385C885C9CEFCB4B585CACEC7BAF085CBCEE185CCD1BD85CD85CEDFC085CF85D0B4F485D1B3CA85D2B8E6DFBB85D385D485D585D6C4C585D7DFBCDFBDDFBEC5BBDFBFDFC2D4B1DFC385D8C7BACED885D985DA85DB85DC85DDC4D885DEDFCA85DFDFCF85E0D6DC85E185E285E385E485E585E685E785E8DFC9DFDACEB685E9BAC7DFCEDFC8C5DE85EA85EBC9EBBAF4C3FC85EC85EDBED785EEDFC685EFDFCD85F0C5D885F185F285F385F4D5A6BACD85F5BECCD3BDB8C085F6D6E485F7DFC7B9BEBFA785F885F9C1FCDFCBDFCC85FADFD085FB85FC85FD85FE8640DFDBDFE58641DFD7DFD6D7C9DFE3DFE4E5EBD2A7DFD28642BFA98643D4DB8644BFC8DFD4864586468647CFCC86488649DFDD864AD1CA864BDFDEB0A7C6B7DFD3864CBAE5864DB6DFCDDBB9FED4D5864E864FDFDFCFECB0A5DFE7DFD1D1C6DFD5DFD8DFD9DFDC8650BBA98651DFE0DFE18652DFE2DFE6DFE8D3B486538654865586568657B8E7C5B6DFEAC9DAC1A8C4C486588659BFDECFF8865A865B865CD5DCDFEE865D865E865F866086618662B2B88663BADFDFEC8664DBC18665D1E48666866786688669CBF4B4BD866AB0A6866B866C866D866E866FDFF1CCC6DFF286708671DFED867286738674867586768677DFE986788679867A867BDFEB867CDFEFDFF0BBBD867D867EDFF386808681DFF48682BBA38683CADBCEA8E0A7B3AA8684E0A6868586868687E0A186888689868A868BDFFE868CCDD9DFFC868DDFFA868EBFD0D7C4868FC9CC86908691DFF8B0A186928693869486958696DFFD869786988699869ADFFBE0A2869B869C869D869E869FE0A886A086A186A286A3B7C886A486A5C6A1C9B6C0B2DFF586A686A7C5BE86A8D8C4DFF9C4F686A986AA86AB86AC86AD86AEE0A3E0A4E0A5D0A586AF86B0E0B4CCE486B1E0B186B2BFA6E0AFCEB9E0ABC9C686B386B4C0AEE0AEBAEDBAB0E0A986B586B686B7DFF686B8E0B386B986BAE0B886BB86BC86BDB4ADE0B986BE86BFCFB2BAC886C0E0B086C186C286C386C486C586C686C7D0FA86C886C986CA86CB86CC86CD86CE86CF86D0E0AC86D1D4FB86D2DFF786D3C5E786D4E0AD86D5D3F786D6E0B6E0B786D786D886D986DA86DBE0C4D0E186DC86DD86DEE0BC86DF86E0E0C9E0CA86E186E286E3E0BEE0AAC9A4E0C186E4E0B286E586E686E786E886E9CAC8E0C386EAE0B586EBCECB86ECCBC3E0CDE0C6E0C286EDE0CB86EEE0BAE0BFE0C086EF86F0E0C586F186F2E0C7E0C886F3E0CC86F4E0BB86F586F686F786F886F9CBD4E0D586FAE0D6E0D286FB86FC86FD86FE87408741E0D0BCCE87428743E0D18744B8C2D8C587458746874787488749874A874B874CD0EA874D874EC2EF874F8750E0CFE0BD875187528753E0D4E0D387548755E0D78756875787588759E0DCE0D8875A875B875CD6F6B3B0875DD7EC875ECBBB875F8760E0DA8761CEFB876287638764BAD987658766876787688769876A876B876C876D876E876F8770E0E1E0DDD2AD87718772877387748775E0E287768777E0DBE0D9E0DF87788779E0E0877A877B877C877D877EE0DE8780E0E4878187828783C6F7D8ACD4EBE0E6CAC98784878587868787E0E587888789878A878BB8C1878C878D878E878FE0E7E0E887908791879287938794879587968797E0E9E0E387988799879A879B879C879D879EBABFCCE7879F87A087A1E0EA87A287A387A487A587A687A787A887A987AA87AB87AC87AD87AE87AF87B0CFF987B187B287B387B487B587B687B787B887B987BA87BBE0EB87BC87BD87BE87BF87C087C187C2C8C287C387C487C587C6BDC087C787C887C987CA87CB87CC87CD87CE87CF87D087D187D287D3C4D287D487D587D687D787D887D987DA87DB87DCE0EC87DD87DEE0ED87DF87E0C7F4CBC487E1E0EEBBD8D8B6D2F2E0EFCDC587E2B6DA87E387E487E587E687E787E8E0F187E9D4B087EA87EBC0A7B4D187EC87EDCEA7E0F087EE87EF87F0E0F2B9CC87F187F2B9FACDBCE0F387F387F487F5C6D4E0F487F6D4B287F7C8A6E0F6E0F587F887F987FA87FB87FC87FD87FE8840884188428843884488458846884788488849E0F7884A884BCDC1884C884D884ECAA5884F885088518852D4DADBD7DBD98853DBD8B9E7DBDCDBDDB5D888548855DBDA8856885788588859885ADBDBB3A1DBDF885B885CBBF8885DD6B7885EDBE0885F886088618862BEF988638864B7BB8865DBD0CCAEBFB2BBB5D7F8BFD38866886788688869886ABFE9886B886CBCE1CCB3DBDEB0D3CEEBB7D8D7B9C6C2886D886EC0A4886FCCB98870DBE7DBE1C6BADBE38871DBE88872C5F7887388748875DBEA88768877DBE9BFC088788879887ADBE6DBE5887B887C887D887E8880B4B9C0ACC2A2DBE2DBE48881888288838884D0CDDBED88858886888788888889C0DDDBF2888A888B888C888D888E888F8890B6E28891889288938894DBF3DBD2B9B8D4ABDBEC8895BFD1DBF08896DBD18897B5E68898DBEBBFE58899889A889BDBEE889CDBF1889D889E889FDBF988A088A188A288A388A488A588A688A788A8B9A1B0A388A988AA88AB88AC88AD88AE88AFC2F188B088B1B3C7DBEF88B288B3DBF888B4C6D2DBF488B588B6DBF5DBF7DBF688B788B8DBFE88B9D3F2B2BA88BA88BB88BCDBFD88BD88BE88BF88C088C188C288C388C4DCA488C5DBFB88C688C788C888C9DBFA88CA88CB88CCDBFCC5E0BBF988CD88CEDCA388CF88D0DCA588D1CCC388D288D388D4B6D1DDC088D588D688D7DCA188D8DCA288D988DA88DBC7B588DC88DD88DEB6E988DF88E088E1DCA788E288E388E488E5DCA688E6DCA9B1A488E788E8B5CC88E988EA88EB88EC88EDBFB088EE88EF88F088F188F2D1DF88F388F488F588F6B6C288F788F888F988FA88FB88FC88FD88FE894089418942894389448945DCA88946894789488949894A894B894CCBFAEBF3894D894E894FCBDC89508951CBFE895289538954CCC189558956895789588959C8FB895A895B895C895D895E895FDCAA89608961896289638964CCEEDCAB89658966896789688969896A896B896C896D896E896F897089718972897389748975DBD38976DCAFDCAC8977BEB38978CAFB8979897A897BDCAD897C897D897E89808981898289838984C9CAC4B989858986898789888989C7BDDCAE898A898B898CD4F6D0E6898D898E898F89908991899289938994C4ABB6D589958996899789988999899A899B899C899D899E899F89A089A189A289A389A489A589A6DBD489A789A889A989AAB1DA89AB89AC89ADDBD589AE89AF89B089B189B289B389B489B589B689B789B8DBD689B989BA89BBBABE89BC89BD89BE89BF89C089C189C289C389C489C589C689C789C889C9C8C089CA89CB89CC89CD89CE89CFCABFC8C989D0D7B389D1C9F989D289D3BFC789D489D5BAF889D689D7D2BC89D889D989DA89DB89DC89DD89DE89DFE2BA89E0B4A689E189E2B1B889E389E489E589E689E7B8B489E8CFC489E989EA89EB89ECD9E7CFA6CDE289ED89EED9EDB6E089EFD2B989F089F1B9BB89F289F389F489F5E2B9E2B789F6B4F389F7CCECCCABB7F289F8D8B2D1EBBABB89F9CAA789FA89FBCDB789FC89FDD2C4BFE4BCD0B6E189FEDEC58A408A418A428A43DEC6DBBC8A44D1D98A458A46C6E6C4CEB7EE8A47B7DC8A488A49BFFCD7E08A4AC6F58A4B8A4CB1BCDEC8BDB1CCD7DECA8A4DDEC98A4E8A4F8A508A518A52B5EC8A53C9DD8A548A55B0C28A568A578A588A598A5A8A5B8A5C8A5D8A5E8A5F8A608A618A62C5AEC5AB8A63C4CC8A64BCE9CBFD8A658A668A67BAC38A688A698A6AE5F9C8E7E5FACDFD8A6BD7B1B8BEC2E88A6CC8D18A6D8A6EE5FB8A6F8A708A718A72B6CABCCB8A738A74D1FDE6A18A75C3EE8A768A778A788A79E6A48A7A8A7B8A7C8A7DE5FEE6A5CDD78A7E8A80B7C1E5FCE5FDE6A38A818A82C4DDE6A88A838A84E6A78A858A868A878A888A898A8AC3C38A8BC6DE8A8C8A8DE6AA8A8E8A8F8A908A918A928A938A94C4B78A958A968A97E6A2CABC8A988A998A9A8A9BBDE3B9C3E6A6D0D5CEAF8A9C8A9DE6A9E6B08A9ED2A68A9FBDAAE6AD8AA08AA18AA28AA38AA4E6AF8AA5C0D18AA68AA7D2CC8AA88AA98AAABCA78AAB8AAC8AAD8AAE8AAF8AB08AB18AB28AB38AB48AB58AB6E6B18AB7D2F68AB88AB98ABAD7CB8ABBCDFE8ABCCDDEC2A6E6ABE6ACBDBFE6AEE6B38ABD8ABEE6B28ABF8AC08AC18AC2E6B68AC3E6B88AC48AC58AC68AC7C4EF8AC88AC98ACAC4C88ACB8ACCBEEAC9EF8ACD8ACEE6B78ACFB6F08AD08AD18AD2C3E48AD38AD48AD58AD68AD78AD88AD9D3E9E6B48ADAE6B58ADBC8A28ADC8ADD8ADE8ADF8AE0E6BD8AE18AE28AE3E6B98AE48AE58AE68AE78AE8C6C58AE98AEACDF1E6BB8AEB8AEC8AED8AEE8AEF8AF08AF18AF28AF38AF4E6BC8AF58AF68AF78AF8BBE98AF98AFA8AFB8AFC8AFD8AFE8B40E6BE8B418B428B438B44E6BA8B458B46C0B78B478B488B498B4A8B4B8B4C8B4D8B4E8B4FD3A4E6BFC9F4E6C38B508B51E6C48B528B538B548B55D0F68B568B578B588B598B5A8B5B8B5C8B5D8B5E8B5F8B608B618B628B638B648B658B668B67C3BD8B688B698B6A8B6B8B6C8B6D8B6EC3C4E6C28B6F8B708B718B728B738B748B758B768B778B788B798B7A8B7B8B7CE6C18B7D8B7E8B808B818B828B838B84E6C7CFB18B85EBF48B868B87E6CA8B888B898B8A8B8B8B8CE6C58B8D8B8EBCDEC9A98B8F8B908B918B928B938B94BCB58B958B96CFD38B978B988B998B9A8B9BE6C88B9CE6C98B9DE6CE8B9EE6D08B9F8BA08BA1E6D18BA28BA38BA4E6CBB5D58BA5E6CC8BA68BA7E6CF8BA88BA9C4DB8BAAE6C68BAB8BAC8BAD8BAE8BAFE6CD8BB08BB18BB28BB38BB48BB58BB68BB78BB88BB98BBA8BBB8BBC8BBD8BBE8BBF8BC08BC18BC28BC38BC48BC58BC6E6D28BC78BC88BC98BCA8BCB8BCC8BCD8BCE8BCF8BD08BD18BD2E6D4E6D38BD38BD48BD58BD68BD78BD88BD98BDA8BDB8BDC8BDD8BDE8BDF8BE08BE18BE28BE38BE48BE58BE68BE78BE88BE98BEA8BEB8BECE6D58BEDD9F88BEE8BEFE6D68BF08BF18BF28BF38BF48BF58BF68BF7E6D78BF88BF98BFA8BFB8BFC8BFD8BFE8C408C418C428C438C448C458C468C47D7D3E6DD8C48E6DEBFD7D4D08C49D7D6B4E6CBEFE6DAD8C3D7CED0A28C4AC3CF8C4B8C4CE6DFBCBEB9C2E6DBD1A78C4D8C4EBAA2C2CF8C4FD8AB8C508C518C52CAEBE5EE8C53E6DC8C54B7F58C558C568C578C58C8E68C598C5AC4F58C5B8C5CE5B2C4FE8C5DCBFCE5B3D5AC8C5ED3EECAD8B0B28C5FCBCECDEA8C608C61BAEA8C628C638C64E5B58C65E5B48C66D7DAB9D9D6E6B6A8CDF0D2CBB1A6CAB58C67B3E8C9F3BFCDD0FBCAD2E5B6BBC28C688C698C6ACFDCB9AC8C6B8C6C8C6D8C6ED4D78C6F8C70BAA6D1E7CFFCBCD28C71E5B7C8DD8C728C738C74BFEDB1F6CBDE8C758C76BCC58C77BCC4D2FAC3DCBFDC8C788C798C7A8C7BB8BB8C7C8C7D8C7EC3C28C80BAAED4A28C818C828C838C848C858C868C878C888C89C7DEC4AFB2EC8C8AB9D18C8B8C8CE5BBC1C88C8D8C8ED5AF8C8F8C908C918C928C93E5BC8C94E5BE8C958C968C978C988C998C9A8C9BB4E7B6D4CBC2D1B0B5BC8C9C8C9DCAD98C9EB7E28C9F8CA0C9E48CA1BDAB8CA28CA3CEBED7F08CA48CA58CA68CA7D0A18CA8C9D98CA98CAAB6FBE6D8BCE28CABB3BE8CACC9D08CADE6D9B3A28CAE8CAF8CB08CB1DECC8CB2D3C8DECD8CB3D2A28CB48CB58CB68CB7DECE8CB88CB98CBA8CBBBECD8CBC8CBDDECF8CBE8CBF8CC0CAACD2FCB3DFE5EAC4E1BEA1CEB2C4F2BED6C6A8B2E38CC18CC2BED38CC38CC4C7FCCCEBBDECCEDD8CC58CC6CABAC6C1E5ECD0BC8CC78CC88CC9D5B98CCA8CCB8CCCE5ED8CCD8CCE8CCF8CD0CAF48CD1CDC0C2C58CD2E5EF8CD3C2C4E5F08CD48CD58CD68CD78CD88CD98CDAE5F8CDCD8CDBC9BD8CDC8CDD8CDE8CDF8CE08CE18CE2D2D9E1A88CE38CE48CE58CE6D3EC8CE7CBEAC6F18CE88CE98CEA8CEB8CECE1AC8CED8CEE8CEFE1A7E1A98CF08CF1E1AAE1AF8CF28CF3B2ED8CF4E1ABB8DAE1ADE1AEE1B0B5BAE1B18CF58CF68CF78CF88CF9E1B3E1B88CFA8CFB8CFC8CFD8CFED1D28D40E1B6E1B5C1EB8D418D428D43E1B78D44D4C08D45E1B28D46E1BAB0B68D478D488D498D4AE1B48D4BBFF98D4CE1B98D4D8D4EE1BB8D4F8D508D518D528D538D54E1BE8D558D568D578D588D598D5AE1BC8D5B8D5C8D5D8D5E8D5F8D60D6C58D618D628D638D648D658D668D67CFBF8D688D69E1BDE1BFC2CD8D6AB6EB8D6BD3F88D6C8D6DC7CD8D6E8D6FB7E58D708D718D728D738D748D758D768D778D788D79BEFE8D7A8D7B8D7C8D7D8D7E8D80E1C0E1C18D818D82E1C7B3E78D838D848D858D868D878D88C6E98D898D8A8D8B8D8C8D8DB4DE8D8ED1C28D8F8D908D918D92E1C88D938D94E1C68D958D968D978D988D99E1C58D9AE1C3E1C28D9BB1C08D9C8D9D8D9ED5B8E1C48D9F8DA08DA18DA28DA3E1CB8DA48DA58DA68DA78DA88DA98DAA8DABE1CCE1CA8DAC8DAD8DAE8DAF8DB08DB18DB28DB3EFFA8DB48DB5E1D3E1D2C7B68DB68DB78DB88DB98DBA8DBB8DBC8DBD8DBE8DBF8DC0E1C98DC18DC2E1CE8DC3E1D08DC48DC58DC68DC78DC88DC98DCA8DCB8DCC8DCD8DCEE1D48DCFE1D1E1CD8DD08DD1E1CF8DD28DD38DD48DD5E1D58DD68DD78DD88DD98DDA8DDB8DDC8DDD8DDE8DDF8DE08DE18DE2E1D68DE38DE48DE58DE68DE78DE88DE98DEA8DEB8DEC8DED8DEE8DEF8DF08DF18DF28DF38DF48DF58DF68DF78DF8E1D78DF98DFA8DFBE1D88DFC8DFD8DFE8E408E418E428E438E448E458E468E478E488E498E4A8E4B8E4C8E4D8E4E8E4F8E508E518E528E538E548E55E1DA8E568E578E588E598E5A8E5B8E5C8E5D8E5E8E5F8E608E618E62E1DB8E638E648E658E668E678E688E69CEA18E6A8E6B8E6C8E6D8E6E8E6F8E708E718E728E738E748E758E76E7DD8E77B4A8D6DD8E788E79D1B2B3B28E7A8E7BB9A4D7F3C7C9BEDEB9AE8E7CCED78E7D8E7EB2EEDBCF8E80BCBAD2D1CBC8B0CD8E818E82CFEF8E838E848E858E868E87D9E3BDED8E888E89B1D2CAD0B2BC8E8ACBA7B7AB8E8BCAA68E8C8E8D8E8ECFA38E8F8E90E0F8D5CAE0FB8E918E92E0FAC5C1CCFB8E93C1B1E0F9D6E3B2AFD6C4B5DB8E948E958E968E978E988E998E9A8E9BB4F8D6A18E9C8E9D8E9E8E9F8EA0CFAFB0EF8EA18EA2E0FC8EA38EA48EA58EA68EA7E1A1B3A38EA88EA9E0FDE0FEC3B18EAA8EAB8EAC8EADC3DD8EAEE1A2B7F98EAF8EB08EB18EB28EB38EB4BBCF8EB58EB68EB78EB88EB98EBA8EBBE1A3C4BB8EBC8EBD8EBE8EBF8EC0E1A48EC18EC2E1A58EC38EC4E1A6B4B18EC58EC68EC78EC88EC98ECA8ECB8ECC8ECD8ECE8ECF8ED08ED18ED28ED3B8C9C6BDC4EA8ED4B2A28ED5D0D28ED6E7DBBBC3D3D7D3C48ED7B9E3E2CF8ED88ED98EDAD7AF8EDBC7ECB1D38EDC8EDDB4B2E2D18EDE8EDF8EE0D0F2C2AEE2D08EE1BFE2D3A6B5D7E2D2B5EA8EE2C3EDB8FD8EE3B8AE8EE4C5D3B7CFE2D48EE58EE68EE78EE8E2D3B6C8D7F98EE98EEA8EEB8EEC8EEDCDA58EEE8EEF8EF08EF18EF2E2D88EF3E2D6CAFCBFB5D3B9E2D58EF48EF58EF68EF7E2D78EF88EF98EFA8EFB8EFC8EFD8EFE8F408F418F42C1AEC0C88F438F448F458F468F478F48E2DBE2DAC0AA8F498F4AC1CE8F4B8F4C8F4D8F4EE2DC8F4F8F508F518F528F538F548F558F568F578F588F598F5AE2DD8F5BE2DE8F5C8F5D8F5E8F5F8F608F618F628F638F64DBC88F65D1D3CDA28F668F67BDA88F688F698F6ADEC3D8A5BFAADBCDD2ECC6FAC5AA8F6B8F6C8F6DDEC48F6EB1D7DFAE8F6F8F708F71CABD8F72DFB18F73B9AD8F74D2FD8F75B8A5BAEB8F768F77B3DA8F788F798F7AB5DCD5C58F7B8F7C8F7D8F7EC3D6CFD2BBA18F80E5F3E5F28F818F82E5F48F83CDE48F84C8F58F858F868F878F888F898F8A8F8BB5AFC7BF8F8CE5F68F8D8F8E8F8FECB08F908F918F928F938F948F958F968F978F988F998F9A8F9B8F9C8F9D8F9EE5E68F9FB9E9B5B18FA0C2BCE5E8E5E7E5E98FA18FA28FA38FA4D2CD8FA58FA68FA7E1EAD0CE8FA8CDAE8FA9D1E58FAA8FABB2CAB1EB8FACB1F2C5ED8FAD8FAED5C3D3B08FAFE1DC8FB08FB18FB2E1DD8FB3D2DB8FB4B3B9B1CB8FB58FB68FB7CDF9D5F7E1DE8FB8BEB6B4FD8FB9E1DFBADCE1E0BBB2C2C9E1E18FBA8FBB8FBCD0EC8FBDCDBD8FBE8FBFE1E28FC0B5C3C5C7E1E38FC18FC2E1E48FC38FC48FC58FC6D3F98FC78FC88FC98FCA8FCB8FCCE1E58FCDD1AD8FCE8FCFE1E6CEA28FD08FD18FD28FD38FD48FD5E1E78FD6B5C28FD78FD88FD98FDAE1E8BBD58FDB8FDC8FDD8FDE8FDFD0C4E2E0B1D8D2E48FE08FE1E2E18FE28FE3BCC9C8CC8FE4E2E3ECFEECFDDFAF8FE58FE68FE7E2E2D6BECDFCC3A68FE88FE98FEAE3C38FEB8FECD6D2E2E78FED8FEEE2E88FEF8FF0D3C78FF18FF2E2ECBFEC8FF3E2EDE2E58FF48FF5B3C08FF68FF78FF8C4EE8FF98FFAE2EE8FFB8FFCD0C38FFDBAF6E2E9B7DEBBB3CCACCBCBE2E4E2E6E2EAE2EB8FFE90409041E2F790429043E2F4D4F5E2F390449045C5AD9046D5FAC5C2B2C090479048E2EF9049E2F2C1AFCBBC904A904BB5A1E2F9904C904D904EBCB1E2F1D0D4D4B9E2F5B9D6E2F6904F90509051C7D390529053905490559056E2F0905790589059905A905BD7DCEDA1905C905DE2F8905EEDA5E2FECAD1905F906090619062906390649065C1B59066BBD090679068BFD69069BAE3906A906BCBA1906C906D906EEDA6EDA3906F9070EDA29071907290739074BBD6EDA7D0F490759076EDA4BADEB6F7E3A1B6B2CCF1B9A79077CFA2C7A190789079BFD2907A907BB6F1907CE2FAE2FBE2FDE2FCC4D5E3A2907DD3C1907E90809081E3A7C7C49082908390849085CFA490869087E3A9BAB790889089908A908BE3A8908CBBDA908DE3A3908E908F9090E3A4E3AA9091E3A69092CEF2D3C690939094BBBC90959096D4C39097C4FA90989099EDA8D0FCE3A5909AC3F5909BE3ADB1AF909CE3B2909D909E909FBCC290A090A1E3ACB5BF90A290A390A490A590A690A790A890A9C7E9E3B090AA90AB90ACBEAACDEF90AD90AE90AF90B090B1BBF390B290B390B4CCE890B590B6E3AF90B7E3B190B8CFA7E3AE90B9CEA9BBDD90BA90BB90BC90BD90BEB5EBBEE5B2D2B3CD90BFB1B9E3ABB2D1B5ACB9DFB6E890C090C1CFEBE3B790C2BBCC90C390C4C8C7D0CA90C590C690C790C890C9E3B8B3EE90CA90CB90CC90CDEDA990CED3FAD3E490CF90D090D1EDAAE3B9D2E290D290D390D490D590D6E3B590D790D890D990DAD3DE90DB90DC90DD90DEB8D0E3B390DF90E0E3B6B7DF90E1E3B4C0A290E290E390E4E3BA90E590E690E790E890E990EA90EB90EC90ED90EE90EF90F090F190F290F390F490F590F690F7D4B890F890F990FA90FB90FC90FD90FE9140B4C89141E3BB9142BBC59143C9F791449145C9E5914691479148C4BD9149914A914B914C914D914E914FEDAB9150915191529153C2FD9154915591569157BBDBBFAE91589159915A915B915C915D915ECEBF915F916091619162E3BC9163BFB6916491659166916791689169916A916B916C916D916E916F9170917191729173917491759176B1EF91779178D4F79179917A917B917C917DE3BE917E9180918191829183918491859186EDAD918791889189918A918B918C918D918E918FE3BFBAA9EDAC91909191E3BD91929193919491959196919791989199919A919BE3C0919C919D919E919F91A091A1BAB691A291A391A4B6AE91A591A691A791A891A9D0B891AAB0C3EDAE91AB91AC91AD91AE91AFEDAFC0C191B0E3C191B191B291B391B491B591B691B791B891B991BA91BB91BC91BD91BE91BF91C091C1C5B391C291C391C491C591C691C791C891C991CA91CB91CC91CD91CE91CFE3C291D091D191D291D391D491D591D691D791D8DCB291D991DA91DB91DC91DD91DEEDB091DFB8EA91E0CEECEAA7D0E7CAF9C8D6CFB7B3C9CED2BDE491E191E2E3DEBBF2EAA8D5BD91E3C6DDEAA991E491E591E6EAAA91E7EAACEAAB91E8EAAEEAAD91E991EA91EB91ECBDD891EDEAAF91EEC2BE91EF91F091F191F2B4C1B4F791F391F4BBA791F591F691F791F891F9ECE6ECE5B7BFCBF9B1E291FAECE791FB91FC91FDC9C8ECE8ECE991FECAD6DED0B2C5D4FA92409241C6CBB0C7B4F2C8D3924292439244CDD092459246BFB8924792489249924A924B924C924DBFDB924E924FC7A4D6B49250C0A9DED1C9A8D1EFC5A4B0E7B3B6C8C592519252B0E292539254B7F692559256C5FA92579258B6F39259D5D2B3D0BCBC925A925B925CB3AD925D925E925F9260BEF1B0D1926192629263926492659266D2D6CAE3D7A59267CDB6B6B6BFB9D5DB9268B8A7C5D79269926A926BDED2BFD9C2D5C7C0926CBBA4B1A8926D926EC5EA926F9270C5FBCCA79271927292739274B1A7927592769277B5D692789279927AC4A8927BDED3D1BAB3E9927CC3F2927D927EB7F79280D6F4B5A3B2F0C4B4C4E9C0ADDED49281B0E8C5C4C1E09282B9D59283BEDCCDD8B0CE9284CDCFDED6BED0D7BEDED5D5D0B0DD92859286C4E292879288C2A3BCF09289D3B5C0B9C5A1B2A6D4F1928A928BC0A8CAC3DED7D5FC928CB9B0928DC8ADCBA9928EDED9BFBD928F929092919292C6B4D7A7CAB0C4C39293B3D6B9D29294929592969297D6B8EAFCB0B492989299929A929BBFE6929C929DCCF4929E929F92A092A1CDDA92A292A392A4D6BFC2CE92A5CECECCA2D0AEC4D3B5B2DED8D5F5BCB7BBD392A692A7B0A492A8C5B2B4EC92A992AA92ABD5F192AC92ADEAFD92AE92AF92B092B192B292B3DEDACDA692B492B5CDEC92B692B792B892B9CEE6DEDC92BACDB1C0A692BB92BCD7BD92BDDEDBB0C6BAB4C9D3C4F3BEE892BE92BF92C092C1B2B692C292C392C492C592C692C792C892C9C0CCCBF092CABCF1BBBBB5B792CB92CC92CDC5F592CEDEE692CF92D092D1DEE3BEDD92D292D3DEDF92D492D592D692D7B4B7BDDD92D892D9DEE0C4ED92DA92DB92DC92DDCFC692DEB5E092DF92E092E192E2B6DECADAB5F4DEE592E3D5C692E4DEE1CCCDC6FE92E5C5C592E692E792E8D2B492E9BEF292EA92EB92EC92ED92EE92EF92F0C2D392F1CCBDB3B892F2BDD392F3BFD8CDC6D1DAB4EB92F4DEE4DEDDDEE792F5EAFE92F692F7C2B0DEE292F892F9D6C0B5A792FAB2F492FBDEE892FCDEF292FD92FE934093419342DEED9343DEF193449345C8E0934693479348D7E1DEEFC3E8CCE19349B2E5934A934B934CD2BE934D934E934F9350935193529353DEEE9354DEEBCED59355B4A79356935793589359935ABFABBEBE935B935CBDD2935D935E935F9360DEE99361D4AE9362DEDE9363DEEA9364936593669367C0BF9368DEECB2F3B8E9C2A79369936ABDC1936B936C936D936E936FDEF5DEF893709371B2ABB4A493729373B4EAC9A6937493759376937793789379DEF6CBD1937AB8E3937BDEF7DEFA937C937D937E9380DEF9938193829383CCC29384B0E1B4EE93859386938793889389938AE5BA938B938C938D938E938FD0AF93909391B2EB9392EBA19393DEF493949395C9E3DEF3B0DAD2A1B1F79396CCAF939793989399939A939B939C939DDEF0939ECBA4939F93A093A1D5AA93A293A393A493A593A6DEFB93A793A893A993AA93AB93AC93AD93AEB4DD93AFC4A693B093B193B2DEFD93B393B493B593B693B793B893B993BA93BB93BCC3FEC4A1DFA193BD93BE93BF93C093C193C293C3C1CC93C4DEFCBEEF93C5C6B293C693C793C893C993CA93CB93CC93CD93CEB3C5C8F693CF93D0CBBADEFE93D193D2DFA493D393D493D593D6D7B293D793D893D993DA93DBB3B793DC93DD93DE93DFC1C393E093E1C7CBB2A5B4E993E2D7AB93E393E493E593E6C4EC93E7DFA2DFA393E8DFA593E9BAB393EA93EB93ECDFA693EDC0DE93EE93EFC9C393F093F193F293F393F493F593F6B2D9C7E693F7DFA793F8C7DC93F993FA93FB93FCDFA8EBA293FD93FE944094419442CBD3944394449445DFAA9446DFA99447B2C194489449944A944B944C944D944E944F9450945194529453945494559456945794589459945A945B945C945D945E945F9460C5CA94619462946394649465946694679468DFAB9469946A946B946C946D946E946F9470D4DC94719472947394749475C8C19476947794789479947A947B947C947D947E948094819482DFAC94839484948594869487BEF094889489DFADD6A7948A948B948C948DEAB7EBB6CAD5948ED8FCB8C4948FB9A594909491B7C5D5FE94929493949494959496B9CA94979498D0A7F4CD9499949AB5D0949B949CC3F4949DBEC8949E949F94A0EBB7B0BD94A194A2BDCC94A3C1B294A4B1D6B3A894A594A694A7B8D2C9A294A894A9B6D894AA94AB94AC94ADEBB8BEB494AE94AF94B0CAFD94B1C7C394B2D5FB94B394B4B7F394B594B694B794B894B994BA94BB94BC94BD94BE94BF94C094C194C294C3CEC494C494C594C6D5ABB1F394C794C894C9ECB3B0DF94CAECB594CB94CC94CDB6B794CEC1CF94CFF5FAD0B194D094D1D5E594D2CED394D394D4BDEFB3E294D5B8AB94D6D5B694D7EDBD94D8B6CF94D9CBB9D0C294DA94DB94DC94DD94DE94DF94E094E1B7BD94E294E3ECB6CAA994E494E594E6C5D494E7ECB9ECB8C2C3ECB794E894E994EA94EBD0FDECBA94ECECBBD7E594ED94EEECBC94EF94F094F1ECBDC6EC94F294F394F494F594F694F794F894F9CEDE94FABCC894FB94FCC8D5B5A9BEC9D6BCD4E794FD94FED1AED0F1EAB8EAB9EABABAB59540954195429543CAB1BFF595449545CDFA9546954795489549954AEAC0954BB0BAEABE954C954DC0A5954E954F9550EABB9551B2FD9552C3F7BBE8955395549555D2D7CEF4EABF955695579558EABC9559955A955BEAC3955CD0C7D3B3955D955E955F9560B4BA9561C3C1D7F29562956395649565D5D19566CAC79567EAC595689569EAC4EAC7EAC6956A956B956C956D956ED6E7956FCFD495709571EACB9572BBCE9573957495759576957795789579BDFAC9CE957A957BEACC957C957DC9B9CFFEEACAD4CEEACDEACF957E9580CDED9581958295839584EAC99585EACE95869587CEEE9588BBDE9589B3BF958A958B958C958D958EC6D5BEB0CEFA958F95909591C7E79592BEA7EAD095939594D6C7959595969597C1C095989599959AD4DD959BEAD1959C959DCFBE959E959F95A095A1EAD295A295A395A495A5CAEE95A695A795A895A9C5AFB0B595AA95AB95AC95AD95AEEAD495AF95B095B195B295B395B495B595B695B7EAD3F4DF95B895B995BA95BB95BCC4BA95BD95BE95BF95C095C1B1A995C295C395C495C5E5DF95C695C795C895C9EAD595CA95CB95CC95CD95CE95CF95D095D195D295D395D495D595D695D795D895D995DA95DB95DC95DD95DE95DF95E095E195E295E3CAEF95E4EAD6EAD7C6D895E595E695E795E895E995EA95EB95ECEAD895ED95EEEAD995EF95F095F195F295F395F4D4BB95F5C7FAD2B7B8FC95F695F7EAC295F8B2DC95F995FAC2FC95FBD4F8CCE6D7EE95FC95FD95FE9640964196429643D4C2D3D0EBC3C5F39644B7FE96459646EBD4964796489649CBB7EBDE964AC0CA964B964C964DCDFB964EB3AF964FC6DA965096519652965396549655EBFC9656C4BE9657CEB4C4A9B1BED4FD9658CAF59659D6EC965A965BC6D3B6E4965C965D965E965FBBFA96609661D0E096629663C9B19664D4D3C8A896659666B8CB9667E8BEC9BC96689669E8BB966AC0EED0D3B2C4B4E5966BE8BC966C966DD5C8966E966F967096719672B6C59673E8BDCAF8B8DCCCF5967496759676C0B496779678D1EEE8BFE8C29679967ABABC967BB1ADBDDC967CEABDE8C3967DE8C6967EE8CB9680968196829683E8CC9684CBC9B0E59685BCAB96869687B9B996889689E8C1968ACDF7968BE8CA968C968D968E968FCEF69690969196929693D5ED9694C1D6E8C49695C3B69696B9FBD6A6E8C8969796989699CAE0D4E6969AE8C0969BE8C5E8C7969CC7B9B7E3969DE8C9969EBFDDE8D2969F96A0E8D796A1E8D5BCDCBCCFE8DB96A296A396A496A596A696A796A896A9E8DE96AAE8DAB1FA96AB96AC96AD96AE96AF96B096B196B296B396B4B0D8C4B3B8CCC6E2C8BEC8E196B596B696B7E8CFE8D4E8D696B8B9F1E8D8D7F596B9C4FB96BAE8DC96BB96BCB2E996BD96BE96BFE8D196C096C1BCED96C296C3BFC2E8CDD6F996C4C1F8B2F196C596C696C796C896C996CA96CB96CCE8DF96CDCAC1E8D996CE96CF96D096D1D5A496D2B1EAD5BBE8CEE8D0B6B0E8D396D3E8DDC0B896D4CAF796D5CBA896D696D7C6DCC0F596D896D996DA96DB96DCE8E996DD96DE96DFD0A396E096E196E296E396E496E596E6E8F2D6EA96E796E896E996EA96EB96EC96EDE8E0E8E196EE96EF96F0D1F9BACBB8F996F196F2B8F1D4D4E8EF96F3E8EEE8ECB9F0CCD2E8E6CEA6BFF296F4B0B8E8F1E8F096F5D7C096F6E8E496F7CDA9C9A396F8BBB8BDDBE8EA96F996FA96FB96FC96FD96FE9740974197429743E8E2E8E3E8E5B5B5E8E7C7C5E8EBE8EDBDB0D7AE9744E8F897459746974797489749974A974B974CE8F5974DCDB0E8F6974E974F9750975197529753975497559756C1BA9757E8E89758C3B7B0F09759975A975B975C975D975E975F9760E8F4976197629763E8F7976497659766B9A3976797689769976A976B976C976D976E976F9770C9D2977197729773C3CECEE0C0E69774977597769777CBF39778CCDDD0B59779977ACAE1977BE8F3977C977D977E9780978197829783978497859786BCEC9787E8F997889789978A978B978C978DC3DE978EC6E5978FB9F79790979197929793B0F497949795D7D897969797BCAC9798C5EF9799979A979B979C979DCCC4979E979FE9A697A097A197A297A397A497A597A697A797A897A9C9AD97AAE9A2C0E297AB97AC97ADBFC397AE97AF97B0E8FEB9D797B1E8FB97B297B397B497B5E9A497B697B797B8D2CE97B997BA97BB97BC97BDE9A397BED6B2D7B597BFE9A797C0BDB797C197C297C397C497C597C697C797C897C997CA97CB97CCE8FCE8FD97CD97CE97CFE9A197D097D197D297D397D497D597D697D7CDD697D897D9D2AC97DA97DB97DCE9B297DD97DE97DF97E0E9A997E197E297E3B4AA97E4B4BB97E597E6E9AB97E797E897E997EA97EB97EC97ED97EE97EF97F097F197F297F397F497F597F697F7D0A897F897F9E9A597FA97FBB3FE97FC97FDE9ACC0E397FEE9AA98409841E9B998429843E9B89844984598469847E9AE98489849E8FA984A984BE9A8984C984D984E984F9850BFACE9B1E9BA98519852C2A5985398549855E9AF9856B8C59857E9AD9858D3DCE9B4E9B5E9B79859985A985BE9C7985C985D985E985F98609861C0C6E9C598629863E9B098649865E9BBB0F19866986798689869986A986B986C986D986E986FE9BCD5A598709871E9BE9872E9BF987398749875E9C198769877C1F198789879C8B6987A987B987CE9BD987D987E988098819882E9C29883988498859886988798889889988AE9C3988BE9B3988CE9B6988DBBB1988E988F9890E9C0989198929893989498959896BCF7989798989899E9C4E9C6989A989B989C989D989E989F98A098A198A298A398A498A5E9CA98A698A798A898A9E9CE98AA98AB98AC98AD98AE98AF98B098B198B298B3B2DB98B4E9C898B598B698B798B898B998BA98BB98BC98BD98BEB7AE98BF98C098C198C298C398C498C598C698C798C898C998CAE9CBE9CC98CB98CC98CD98CE98CF98D0D5C198D1C4A398D298D398D498D598D698D7E9D898D8BAE198D998DA98DB98DCE9C998DDD3A398DE98DF98E0E9D498E198E298E398E498E598E698E7E9D7E9D098E898E998EA98EB98ECE9CF98ED98EEC7C198EF98F098F198F298F398F498F598F6E9D298F798F898F998FA98FB98FC98FDE9D9B3C898FEE9D399409941994299439944CFF0994599469947E9CD99489949994A994B994C994D994E994F995099519952B3F79953995499559956995799589959E9D6995A995BE9DA995C995D995ECCB4995F99609961CFAD99629963996499659966996799689969996AE9D5996BE9DCE9DB996C996D996E996F9970E9DE99719972997399749975997699779978E9D19979997A997B997C997D997E99809981E9DD9982E9DFC3CA9983998499859986998799889989998A998B998C998D998E998F9990999199929993999499959996999799989999999A999B999C999D999E999F99A099A199A299A399A499A599A699A799A899A999AA99AB99AC99AD99AE99AF99B099B199B299B399B499B599B699B799B899B999BA99BB99BC99BD99BE99BF99C099C199C299C399C499C599C699C799C899C999CA99CB99CC99CD99CE99CF99D099D199D299D399D499D599D699D799D899D999DA99DB99DC99DD99DE99DF99E099E199E299E399E499E599E699E799E899E999EA99EB99EC99ED99EE99EF99F099F199F299F399F499F5C7B7B4CEBBB6D0C0ECA399F699F7C5B799F899F999FA99FB99FC99FD99FE9A409A419A42D3FB9A439A449A459A46ECA49A47ECA5C6DB9A489A499A4ABFEE9A4B9A4C9A4D9A4EECA69A4F9A50ECA7D0AA9A51C7B89A529A53B8E89A549A559A569A579A589A599A5A9A5B9A5C9A5D9A5E9A5FECA89A609A619A629A639A649A659A669A67D6B9D5FDB4CBB2BDCEE4C6E79A689A69CDE19A6A9A6B9A6C9A6D9A6E9A6F9A709A719A729A739A749A759A769A77B4F59A78CBC0BCDF9A799A7A9A7B9A7CE9E2E9E3D1EAE9E59A7DB4F9E9E49A7ED1B3CAE2B2D09A80E9E89A819A829A839A84E9E6E9E79A859A86D6B39A879A889A89E9E9E9EA9A8A9A8B9A8C9A8D9A8EE9EB9A8F9A909A919A929A939A949A959A96E9EC9A979A989A999A9A9A9B9A9C9A9D9A9EECAFC5B9B6CE9A9FD2F39AA09AA19AA29AA39AA49AA59AA6B5EE9AA7BBD9ECB19AA89AA9D2E39AAA9AAB9AAC9AAD9AAECEE39AAFC4B89AB0C3BF9AB19AB2B6BED8B9B1C8B1CFB1D1C5FE9AB3B1D09AB4C3AB9AB59AB69AB79AB89AB9D5B19ABA9ABB9ABC9ABD9ABE9ABF9AC09AC1EBA4BAC19AC29AC39AC4CCBA9AC59AC69AC7EBA59AC8EBA79AC99ACA9ACBEBA89ACC9ACD9ACEEBA69ACF9AD09AD19AD29AD39AD49AD5EBA9EBABEBAA9AD69AD79AD89AD99ADAEBAC9ADBCACFD8B5C3F19ADCC3A5C6F8EBADC4CA9ADDEBAEEBAFEBB0B7D59ADE9ADF9AE0B7FA9AE1EBB1C7E29AE2EBB39AE3BAA4D1F5B0B1EBB2EBB49AE49AE59AE6B5AAC2C8C7E89AE7EBB59AE8CBAEE3DF9AE99AEAD3C09AEB9AEC9AED9AEED9DB9AEF9AF0CDA1D6ADC7F39AF19AF29AF3D9E0BBE39AF4BABAE3E29AF59AF69AF79AF89AF9CFAB9AFA9AFB9AFCE3E0C9C79AFDBAB99AFE9B409B41D1B4E3E1C8EAB9AFBDADB3D8CEDB9B429B43CCC09B449B459B46E3E8E3E9CDF49B479B489B499B4A9B4BCCAD9B4CBCB39B4DE3EA9B4EE3EB9B4F9B50D0DA9B519B529B53C6FBB7DA9B549B55C7DFD2CACED69B56E3E4E3EC9B57C9F2B3C19B589B59E3E79B5A9B5BC6E3E3E59B5C9B5DEDB3E3E69B5E9B5F9B609B61C9B39B62C5E69B639B649B65B9B59B66C3BB9B67E3E3C5BDC1A4C2D9B2D79B68E3EDBBA6C4AD9B69E3F0BEDA9B6A9B6BE3FBE3F5BAD39B6C9B6D9B6E9B6FB7D0D3CD9B70D6CED5D3B9C1D5B4D1D89B719B729B739B74D0B9C7F69B759B769B77C8AAB2B49B78C3DA9B799B7A9B7BE3EE9B7C9B7DE3FCE3EFB7A8E3F7E3F49B7E9B809B81B7BA9B829B83C5A29B84E3F6C5DDB2A8C6FC9B85C4E09B869B87D7A29B88C0E1E3F99B899B8AE3FAE3FDCCA9E3F39B8BD3BE9B8CB1C3EDB4E3F1E3F29B8DE3F8D0BAC6C3D4F3E3FE9B8E9B8FBDE09B909B91E4A79B929B93E4A69B949B959B96D1F3E4A39B97E4A99B989B999B9AC8F79B9B9B9C9B9D9B9ECFB49B9FE4A8E4AEC2E59BA09BA1B6B49BA29BA39BA49BA59BA69BA7BDF29BA8E4A29BA99BAABAE9E4AA9BAB9BACE4AC9BAD9BAEB6FDD6DEE4B29BAFE4AD9BB09BB19BB2E4A19BB3BBEECDDDC7A2C5C99BB49BB5C1F79BB6E4A49BB7C7B3BDACBDBDE4A59BB8D7C7B2E29BB9E4ABBCC3E4AF9BBABBEBE4B0C5A8E4B19BBB9BBC9BBD9BBED5E3BFA39BBFE4BA9BC0E4B79BC1E4BB9BC29BC3E4BD9BC49BC5C6D69BC69BC7BAC6C0CB9BC89BC99BCAB8A1E4B49BCB9BCC9BCD9BCED4A19BCF9BD0BAA3BDFE9BD19BD29BD3E4BC9BD49BD59BD69BD79BD8CDBF9BD99BDAC4F99BDB9BDCCFFBC9E69BDD9BDED3BF9BDFCFD19BE09BE1E4B39BE2E4B8E4B9CCE99BE39BE49BE59BE69BE7CCCE9BE8C0D4E4B5C1B0E4B6CED09BE9BBC1B5D39BEAC8F3BDA7D5C7C9ACB8A2E4CA9BEB9BECE4CCD1C49BED9BEED2BA9BEF9BF0BAAD9BF19BF2BAD49BF39BF49BF59BF69BF79BF8E4C3B5ED9BF99BFA9BFBD7CDE4C0CFFDE4BF9BFC9BFD9BFEC1DCCCCA9C409C419C429C43CAE79C449C459C469C47C4D79C48CCD4E4C89C499C4A9C4BE4C7E4C19C4CE4C4B5AD9C4D9C4ED3D99C4FE4C69C509C519C529C53D2F9B4E39C54BBB49C559C56C9EE9C57B4BE9C589C599C5ABBEC9C5BD1CD9C5CCCEDEDB59C5D9C5E9C5F9C609C619C629C639C64C7E59C659C669C679C68D4A89C69E4CBD7D5E4C29C6ABDA5E4C59C6B9C6CD3E69C6DE4C9C9F89C6E9C6FE4BE9C709C71D3E59C729C73C7FEB6C99C74D4FCB2B3E4D79C759C769C77CEC29C78E4CD9C79CEBC9C7AB8DB9C7B9C7CE4D69C7DBFCA9C7E9C809C81D3CE9C82C3EC9C839C849C859C869C879C889C899C8AC5C8E4D89C8B9C8C9C8D9C8E9C8F9C909C919C92CDC4E4CF9C939C949C959C96E4D4E4D59C97BAFE9C98CFE69C999C9AD5BF9C9B9C9C9C9DE4D29C9E9C9F9CA09CA19CA29CA39CA49CA59CA69CA79CA8E4D09CA99CAAE4CE9CAB9CAC9CAD9CAE9CAF9CB09CB19CB29CB39CB49CB59CB69CB79CB89CB9CDE5CAAA9CBA9CBB9CBCC0A39CBDBDA6E4D39CBE9CBFB8C89CC09CC19CC29CC39CC4E4E7D4B49CC59CC69CC79CC89CC99CCA9CCBE4DB9CCC9CCD9CCEC1EF9CCF9CD0E4E99CD19CD2D2E79CD39CD4E4DF9CD5E4E09CD69CD7CFAA9CD89CD99CDA9CDBCBDD9CDCE4DAE4D19CDDE4E59CDEC8DCE4E39CDF9CE0C4E7E4E29CE1E4E19CE29CE39CE4B3FCE4E89CE59CE69CE79CE8B5E19CE99CEA9CEBD7CC9CEC9CED9CEEE4E69CEFBBAC9CF0D7D2CCCFEBF89CF1E4E49CF29CF3B9F69CF49CF59CF6D6CDE4D9E4DCC2FAE4DE9CF7C2CBC0C4C2D09CF8B1F5CCB29CF99CFA9CFB9CFC9CFD9CFE9D409D419D429D43B5CE9D449D459D469D47E4EF9D489D499D4A9D4B9D4C9D4D9D4E9D4FC6AF9D509D519D52C6E19D539D54E4F59D559D569D579D589D59C2A99D5A9D5B9D5CC0ECD1DDE4EE9D5D9D5E9D5F9D609D619D629D639D649D659D66C4AE9D679D689D69E4ED9D6A9D6B9D6C9D6DE4F6E4F4C2FE9D6EE4DD9D6FE4F09D70CAFE9D71D5C49D729D73E4F19D749D759D769D779D789D799D7AD1FA9D7B9D7C9D7D9D7E9D809D819D82E4EBE4EC9D839D849D85E4F29D86CEAB9D879D889D899D8A9D8B9D8C9D8D9D8E9D8F9D90C5CB9D919D929D93C7B19D94C2BA9D959D969D97E4EA9D989D999D9AC1CA9D9B9D9C9D9D9D9E9D9F9DA0CCB6B3B19DA19DA29DA3E4FB9DA4E4F39DA59DA69DA7E4FA9DA8E4FD9DA9E4FC9DAA9DAB9DAC9DAD9DAE9DAF9DB0B3CE9DB19DB29DB3B3BAE4F79DB49DB5E4F9E4F8C5EC9DB69DB79DB89DB99DBA9DBB9DBC9DBD9DBE9DBF9DC09DC19DC2C0BD9DC39DC49DC59DC6D4E89DC79DC89DC99DCA9DCBE5A29DCC9DCD9DCE9DCF9DD09DD19DD29DD39DD49DD59DD6B0C49DD79DD8E5A49DD99DDAE5A39DDB9DDC9DDD9DDE9DDF9DE0BCA49DE1E5A59DE29DE39DE49DE59DE69DE7E5A19DE89DE99DEA9DEB9DEC9DED9DEEE4FEB1F49DEF9DF09DF19DF29DF39DF49DF59DF69DF79DF89DF9E5A89DFAE5A9E5A69DFB9DFC9DFD9DFE9E409E419E429E439E449E459E469E47E5A7E5AA9E489E499E4A9E4B9E4C9E4D9E4E9E4F9E509E519E529E539E549E559E569E579E589E599E5A9E5B9E5C9E5D9E5E9E5F9E609E619E629E639E649E659E669E679E68C6D99E699E6A9E6B9E6C9E6D9E6E9E6F9E70E5ABE5AD9E719E729E739E749E759E769E77E5AC9E789E799E7A9E7B9E7C9E7D9E7E9E809E819E829E839E849E859E869E879E889E89E5AF9E8A9E8B9E8CE5AE9E8D9E8E9E8F9E909E919E929E939E949E959E969E979E989E999E9A9E9B9E9C9E9D9E9EB9E09E9F9EA0E5B09EA19EA29EA39EA49EA59EA69EA79EA89EA99EAA9EAB9EAC9EAD9EAEE5B19EAF9EB09EB19EB29EB39EB49EB59EB69EB79EB89EB99EBABBF0ECE1C3F09EBBB5C6BBD29EBC9EBD9EBE9EBFC1E9D4EE9EC0BEC49EC19EC29EC3D7C69EC4D4D6B2D3ECBE9EC59EC69EC79EC8EAC19EC99ECA9ECBC2AFB4B69ECC9ECD9ECED1D79ECF9ED09ED1B3B49ED2C8B2BFBBECC09ED39ED4D6CB9ED59ED6ECBFECC19ED79ED89ED99EDA9EDB9EDC9EDD9EDE9EDF9EE09EE19EE29EE3ECC5BEE6CCBFC5DABEBC9EE4ECC69EE5B1FE9EE69EE79EE8ECC4D5A8B5E39EE9ECC2C1B6B3E39EEA9EEBECC3CBB8C0C3CCFE9EEC9EED9EEE9EEFC1D29EF0ECC89EF19EF29EF39EF49EF59EF69EF79EF89EF99EFA9EFB9EFC9EFDBAE6C0D39EFED6F29F409F419F42D1CC9F439F449F459F46BFBE9F47B7B3C9D5ECC7BBE29F48CCCCBDFDC8C89F49CFA99F4A9F4B9F4C9F4D9F4E9F4F9F50CDE99F51C5EB9F529F539F54B7E99F559F569F579F589F599F5A9F5B9F5C9F5D9F5E9F5FD1C9BAB89F609F619F629F639F64ECC99F659F66ECCA9F67BBC0ECCB9F68ECE2B1BAB7D99F699F6A9F6B9F6C9F6D9F6E9F6F9F709F719F729F73BDB99F749F759F769F779F789F799F7A9F7BECCCD1E6ECCD9F7C9F7D9F7E9F80C8BB9F819F829F839F849F859F869F879F889F899F8A9F8B9F8C9F8D9F8EECD19F8F9F909F919F92ECD39F93BBCD9F94BCE59F959F969F979F989F999F9A9F9B9F9C9F9D9F9E9F9F9FA09FA1ECCF9FA2C9B79FA39FA49FA59FA69FA7C3BA9FA8ECE3D5D5ECD09FA99FAA9FAB9FAC9FADD6F39FAE9FAF9FB0ECD2ECCE9FB19FB29FB39FB4ECD49FB5ECD59FB69FB7C9BF9FB89FB99FBA9FBB9FBC9FBDCFA89FBE9FBF9FC09FC19FC2D0DC9FC39FC49FC59FC6D1AC9FC79FC89FC99FCAC8DB9FCB9FCC9FCDECD6CEF59FCE9FCF9FD09FD19FD2CAECECDA9FD39FD49FD59FD69FD79FD89FD9ECD99FDA9FDB9FDCB0BE9FDD9FDE9FDF9FE09FE19FE2ECD79FE3ECD89FE49FE59FE6ECE49FE79FE89FE99FEA9FEB9FEC9FED9FEE9FEFC8BC9FF09FF19FF29FF39FF49FF59FF69FF79FF89FF9C1C79FFA9FFB9FFC9FFD9FFEECDCD1E0A040A041A042A043A044A045A046A047A048A049ECDBA04AA04BA04CA04DD4EFA04EECDDA04FA050A051A052A053A054DBC6A055A056A057A058A059A05AA05BA05CA05DA05EECDEA05FA060A061A062A063A064A065A066A067A068A069A06AB1ACA06BA06CA06DA06EA06FA070A071A072A073A074A075A076A077A078A079A07AA07BA07CA07DA07EA080A081ECDFA082A083A084A085A086A087A088A089A08AA08BECE0A08CD7A6A08DC5C0A08EA08FA090EBBCB0AEA091A092A093BEF4B8B8D2AFB0D6B5F9A094D8B3A095CBACA096E3DDA097A098A099A09AA09BA09CA09DC6ACB0E6A09EA09FA0A0C5C6EBB9A0A1A0A2A0A3A0A4EBBAA0A5A0A6A0A7EBBBA0A8A0A9D1C0A0AAC5A3A0ABEAF2A0ACC4B2A0ADC4B5C0CEA0AEA0AFA0B0EAF3C4C1A0B1CEEFA0B2A0B3A0B4A0B5EAF0EAF4A0B6A0B7C9FCA0B8A0B9C7A3A0BAA0BBA0BCCCD8CEFEA0BDA0BEA0BFEAF5EAF6CFACC0E7A0C0A0C1EAF7A0C2A0C3A0C4A0C5A0C6B6BFEAF8A0C7EAF9A0C8EAFAA0C9A0CAEAFBA0CBA0CCA0CDA0CEA0CFA0D0A0D1A0D2A0D3A0D4A0D5A0D6EAF1A0D7A0D8A0D9A0DAA0DBA0DCA0DDA0DEA0DFA0E0A0E1A0E2C8AEE1EBA0E3B7B8E1ECA0E4A0E5A0E6E1EDA0E7D7B4E1EEE1EFD3CCA0E8A0E9A0EAA0EBA0ECA0EDA0EEE1F1BFF1E1F0B5D2A0EFA0F0A0F1B1B7A0F2A0F3A0F4A0F5E1F3E1F2A0F6BAFCA0F7E1F4A0F8A0F9A0FAA0FBB9B7A0FCBED1A0FDA0FEAA40AA41C4FCAA42BADDBDC6AA43AA44AA45AA46AA47AA48E1F5E1F7AA49AA4AB6C0CFC1CAA8E1F6D5F8D3FCE1F8E1FCE1F9AA4BAA4CE1FAC0EAAA4DE1FEE2A1C0C7AA4EAA4FAA50AA51E1FBAA52E1FDAA53AA54AA55AA56AA57AA58E2A5AA59AA5AAA5BC1D4AA5CAA5DAA5EAA5FE2A3AA60E2A8B2FEE2A2AA61AA62AA63C3CDB2C2E2A7E2A6AA64AA65E2A4E2A9AA66AA67E2ABAA68AA69AA6AD0C9D6EDC3A8E2ACAA6BCFD7AA6CAA6DE2AEAA6EAA6FBAEFAA70AA71E9E0E2ADE2AAAA72AA73AA74AA75BBABD4B3AA76AA77AA78AA79AA7AAA7BAA7CAA7DAA7EAA80AA81AA82AA83E2B0AA84AA85E2AFAA86E9E1AA87AA88AA89AA8AE2B1AA8BAA8CAA8DAA8EAA8FAA90AA91AA92E2B2AA93AA94AA95AA96AA97AA98AA99AA9AAA9BAA9CAA9DE2B3CCA1AA9EE2B4AA9FAAA0AB40AB41AB42AB43AB44AB45AB46AB47AB48AB49AB4AAB4BE2B5AB4CAB4DAB4EAB4FAB50D0FEAB51AB52C2CAAB53D3F1AB54CDF5AB55AB56E7E0AB57AB58E7E1AB59AB5AAB5BAB5CBEC1AB5DAB5EAB5FAB60C2EAAB61AB62AB63E7E4AB64AB65E7E3AB66AB67AB68AB69AB6AAB6BCDE6AB6CC3B5AB6DAB6EE7E2BBB7CFD6AB6FC1E1E7E9AB70AB71AB72E7E8AB73AB74E7F4B2A3AB75AB76AB77AB78E7EAAB79E7E6AB7AAB7BAB7CAB7DAB7EE7ECE7EBC9BAAB80AB81D5E4AB82E7E5B7A9E7E7AB83AB84AB85AB86AB87AB88AB89E7EEAB8AAB8BAB8CAB8DE7F3AB8ED6E9AB8FAB90AB91AB92E7EDAB93E7F2AB94E7F1AB95AB96AB97B0E0AB98AB99AB9AAB9BE7F5AB9CAB9DAB9EAB9FABA0AC40AC41AC42AC43AC44AC45AC46AC47AC48AC49AC4AC7F2AC4BC0C5C0EDAC4CAC4DC1F0E7F0AC4EAC4FAC50AC51E7F6CBF6AC52AC53AC54AC55AC56AC57AC58AC59AC5AE8A2E8A1AC5BAC5CAC5DAC5EAC5FAC60D7C1AC61AC62E7FAE7F9AC63E7FBAC64E7F7AC65E7FEAC66E7FDAC67E7FCAC68AC69C1D5C7D9C5FDC5C3AC6AAC6BAC6CAC6DAC6EC7EDAC6FAC70AC71AC72E8A3AC73AC74AC75AC76AC77AC78AC79AC7AAC7BAC7CAC7DAC7EAC80AC81AC82AC83AC84AC85AC86E8A6AC87E8A5AC88E8A7BAF7E7F8E8A4AC89C8F0C9AAAC8AAC8BAC8CAC8DAC8EAC8FAC90AC91AC92AC93AC94AC95AC96E8A9AC97AC98B9E5AC99AC9AAC9BAC9CAC9DD1FEE8A8AC9EAC9FACA0AD40AD41AD42E8AAAD43E8ADE8AEAD44C1A7AD45AD46AD47E8AFAD48AD49AD4AE8B0AD4BAD4CE8ACAD4DE8B4AD4EAD4FAD50AD51AD52AD53AD54AD55AD56AD57AD58E8ABAD59E8B1AD5AAD5BAD5CAD5DAD5EAD5FAD60AD61E8B5E8B2E8B3AD62AD63AD64AD65AD66AD67AD68AD69AD6AAD6BAD6CAD6DAD6EAD6FAD70AD71E8B7AD72AD73AD74AD75AD76AD77AD78AD79AD7AAD7BAD7CAD7DAD7EAD80AD81AD82AD83AD84AD85AD86AD87AD88AD89E8B6AD8AAD8BAD8CAD8DAD8EAD8FAD90AD91AD92B9CFAD93F0ACAD94F0ADAD95C6B0B0EAC8BFAD96CDDFAD97AD98AD99AD9AAD9BAD9CAD9DCECDEAB1AD9EAD9FADA0AE40EAB2AE41C6BFB4C9AE42AE43AE44AE45AE46AE47AE48EAB3AE49AE4AAE4BAE4CD5E7AE4DAE4EAE4FAE50AE51AE52AE53AE54DDF9AE55EAB4AE56EAB5AE57EAB6AE58AE59AE5AAE5BB8CADFB0C9F5AE5CCCF0AE5DAE5EC9FAAE5FAE60AE61AE62AE63C9FBAE64AE65D3C3CBA6AE66B8A6F0AEB1C2AE67E5B8CCEFD3C9BCD7C9EAAE68B5E7AE69C4D0B5E9AE6AEEAEBBADAE6BAE6CE7DEAE6DEEAFAE6EAE6FAE70AE71B3A9AE72AE73EEB2AE74AE75EEB1BDE7AE76EEB0CEB7AE77AE78AE79AE7AC5CFAE7BAE7CAE7DAE7EC1F4DBCEEEB3D0F3AE80AE81AE82AE83AE84AE85AE86AE87C2D4C6E8AE88AE89AE8AB7ACAE8BAE8CAE8DAE8EAE8FAE90AE91EEB4AE92B3EBAE93AE94AE95BBFBEEB5AE96AE97AE98AE99AE9AE7DCAE9BAE9CAE9DEEB6AE9EAE9FBDAEAEA0AF40AF41AF42F1E2AF43AF44AF45CAE8AF46D2C9F0DAAF47F0DBAF48F0DCC1C6AF49B8EDBECEAF4AAF4BF0DEAF4CC5B1F0DDD1F1AF4DF0E0B0CCBDEAAF4EAF4FAF50AF51AF52D2DFF0DFAF53B4AFB7E8F0E6F0E5C6A3F0E1F0E2B4C3AF54AF55F0E3D5EEAF56AF57CCDBBED2BCB2AF58AF59AF5AF0E8F0E7F0E4B2A1AF5BD6A2D3B8BEB7C8ACAF5CAF5DF0EAAF5EAF5FAF60AF61D1F7AF62D6CCBADBF0E9AF63B6BBAF64AF65CDB4AF66AF67C6A6AF68AF69AF6AC1A1F0EBF0EEAF6BF0EDF0F0F0ECAF6CBBBEF0EFAF6DAF6EAF6FAF70CCB5F0F2AF71AF72B3D5AF73AF74AF75AF76B1D4AF77AF78F0F3AF79AF7AF0F4F0F6B4E1AF7BF0F1AF7CF0F7AF7DAF7EAF80AF81F0FAAF82F0F8AF83AF84AF85F0F5AF86AF87AF88AF89F0FDAF8AF0F9F0FCF0FEAF8BF1A1AF8CAF8DAF8ECEC1F1A4AF8FF1A3AF90C1F6F0FBCADDAF91AF92B4F1B1F1CCB1AF93F1A6AF94AF95F1A7AF96AF97F1ACD5CEF1A9AF98AF99C8B3AF9AAF9BAF9CF1A2AF9DF1ABF1A8F1A5AF9EAF9FF1AAAFA0B040B041B042B043B044B045B046B0A9F1ADB047B048B049B04AB04BB04CF1AFB04DF1B1B04EB04FB050B051B052F1B0B053F1AEB054B055B056B057D1A2B058B059B05AB05BB05CB05DB05EF1B2B05FB060B061F1B3B062B063B064B065B066B067B068B069B9EFB06AB06BB5C7B06CB0D7B0D9B06DB06EB06FD4EDB070B5C4B071BDD4BBCAF0A7B072B073B8DEB074B075F0A8B076B077B0A8B078F0A9B079B07ACDEEB07BB07CF0AAB07DB07EB080B081B082B083B084B085B086B087F0ABB088B089B08AB08BB08CB08DB08EB08FB090C6A4B091B092D6E5F1E4B093F1E5B094B095B096B097B098B099B09AB09BB09CB09DC3F3B09EB09FD3DBB0A0B140D6D1C5E8B141D3AFB142D2E6B143B144EEC1B0BBD5B5D1CEBCE0BAD0B145BFF8B146B8C7B5C1C5CCB147B148CAA2B149B14AB14BC3CBB14CB14DB14EB14FB150EEC2B151B152B153B154B155B156B157B158C4BFB6A2B159EDECC3A4B15AD6B1B15BB15CB15DCFE0EDEFB15EB15FC5CEB160B6DCB161B162CAA1B163B164EDEDB165B166EDF0EDF1C3BCB167BFB4B168EDEEB169B16AB16BB16CB16DB16EB16FB170B171B172B173EDF4EDF2B174B175B176B177D5E6C3DFB178EDF3B179B17AB17BEDF6B17CD5A3D1A3B17DB17EB180EDF5B181C3D0B182B183B184B185B186EDF7BFF4BEECEDF8B187CCF7B188D1DBB189B18AB18BD7C5D5F6B18CEDFCB18DB18EB18FEDFBB190B191B192B193B194B195B196B197EDF9EDFAB198B199B19AB19BB19CB19DB19EB19FEDFDBEA6B1A0B240B241B242B243CBAFEEA1B6BDB244EEA2C4C0B245EDFEB246B247BDDEB2C7B248B249B24AB24BB24CB24DB24EB24FB250B251B252B253B6C3B254B255B256EEA5D8BAEEA3EEA6B257B258B259C3E9B3F2B25AB25BB25CB25DB25EB25FEEA7EEA4CFB9B260B261EEA8C2F7B262B263B264B265B266B267B268B269B26AB26BB26CB26DEEA9EEAAB26EDEABB26FB270C6B3B271C7C6B272D6F5B5C9B273CBB2B274B275B276EEABB277B278CDABB279EEACB27AB27BB27CB27DB27ED5B0B280EEADB281F6C4B282B283B284B285B286B287B288B289B28AB28BB28CB28DB28EDBC7B28FB290B291B292B293B294B295B296B297B4A3B298B299B29AC3ACF1E6B29BB29CB29DB29EB29FCAB8D2D3B2A0D6AAB340EFF2B341BED8B342BDC3EFF3B6CCB0ABB343B344B345B346CAAFB347B348EDB6B349EDB7B34AB34BB34CB34DCEF9B7AFBFF3EDB8C2EBC9B0B34EB34FB350B351B352B353EDB9B354B355C6F6BFB3B356B357B358EDBCC5F8B359D1D0B35AD7A9EDBAEDBBB35BD1E2B35CEDBFEDC0B35DEDC4B35EB35FB360EDC8B361EDC6EDCED5E8B362EDC9B363B364EDC7EDBEB365B366C5E9B367B368B369C6C6B36AB36BC9E9D4D2EDC1EDC2EDC3EDC5B36CC0F9B36DB4A1B36EB36FB370B371B9E8B372EDD0B373B374B375B376EDD1B377EDCAB378EDCFB379CEF8B37AB37BCBB6EDCCEDCDB37CB37DB37EB380B381CFF5B382B383B384B385B386B387B388B389B38AB38BB38CB38DEDD2C1F2D3B2EDCBC8B7B38EB38FB390B391B392B393B394B395BCEFB396B397B398B399C5F0B39AB39BB39CB39DB39EB39FB3A0B440B441B442EDD6B443B5EFB444B445C2B5B0ADCBE9B446B447B1AEB448EDD4B449B44AB44BCDEBB5E2B44CEDD5EDD3EDD7B44DB44EB5FAB44FEDD8B450EDD9B451EDDCB452B1CCB453B454B455B456B457B458B459B45AC5F6BCEEEDDACCBCB2EAB45BB45CB45DB45EEDDBB45FB460B461B462C4EBB463B464B4C5B465B466B467B0F5B468B469B46AEDDFC0DAB4E8B46BB46CB46DB46EC5CDB46FB470B471EDDDBFC4B472B473B474EDDEB475B476B477B478B479B47AB47BB47CB47DB47EB480B481B482B483C4A5B484B485B486EDE0B487B488B489B48AB48BEDE1B48CEDE3B48DB48EC1D7B48FB490BBC7B491B492B493B494B495B496BDB8B497B498B499EDE2B49AB49BB49CB49DB49EB49FB4A0B540B541B542B543B544B545EDE4B546B547B548B549B54AB54BB54CB54DB54EB54FEDE6B550B551B552B553B554EDE5B555B556B557B558B559B55AB55BB55CB55DB55EB55FB560B561B562B563EDE7B564B565B566B567B568CABEECEAC0F1B569C9E7B56AECEBC6EEB56BB56CB56DB56EECECB56FC6EDECEDB570B571B572B573B574B575B576B577B578ECF0B579B57AD7E6ECF3B57BB57CECF1ECEEECEFD7A3C9F1CBEEECF4B57DECF2B57EB580CFE9B581ECF6C6B1B582B583B584B585BCC0B586ECF5B587B588B589B58AB58BB58CB58DB5BBBBF6B58EECF7B58FB590B591B592B593D9F7BDFBB594B595C2BBECF8B596B597B598B599ECF9B59AB59BB59CB59DB8A3B59EB59FB5A0B640B641B642B643B644B645B646ECFAB647B648B649B64AB64BB64CB64DB64EB64FB650B651B652ECFBB653B654B655B656B657B658B659B65AB65BB65CB65DECFCB65EB65FB660B661B662D3EDD8AEC0EBB663C7DDBACCB664D0E3CBBDB665CDBAB666B667B8D1B668B669B1FCB66AC7EFB66BD6D6B66CB66DB66EBFC6C3EBB66FB670EFF5B671B672C3D8B673B674B675B676B677B678D7E2B679B67AB67BEFF7B3D3B67CC7D8D1EDB67DD6C8B67EEFF8B680EFF6B681BBFDB3C6B682B683B684B685B686B687B688BDD5B689B68AD2C6B68BBBE0B68CB68DCFA1B68EEFFCEFFBB68FB690EFF9B691B692B693B694B3CCB695C9D4CBB0B696B697B698B699B69AEFFEB69BB69CB0DEB69DB69ED6C9B69FB6A0B740EFFDB741B3EDB742B743F6D5B744B745B746B747B748B749B74AB74BB74CB74DB74EB74FB750B751B752CEC8B753B754B755F0A2B756F0A1B757B5BEBCDABBFCB758B8E5B759B75AB75BB75CB75DB75EC4C2B75FB760B761B762B763B764B765B766B767B768F0A3B769B76AB76BB76CB76DCBEBB76EB76FB770B771B772B773B774B775B776B777B778B779B77AB77BB77CB77DB77EB780B781B782B783B784B785B786F0A6B787B788B789D1A8B78ABEBFC7EEF1B6F1B7BFD5B78BB78CB78DB78EB4A9F1B8CDBBB78FC7D4D5ADB790F1B9B791F1BAB792B793B794B795C7CFB796B797B798D2A4D6CFB799B79AF1BBBDD1B4B0BEBDB79BB79CB79DB4DCCED1B79EBFDFF1BDB79FB7A0B840B841BFFAF1BCB842F1BFB843B844B845F1BEF1C0B846B847B848B849B84AF1C1B84BB84CB84DB84EB84FB850B851B852B853B854B855C1FEB856B857B858B859B85AB85BB85CB85DB85EB85FB860C1A2B861B862B863B864B865B866B867B868B869B86ACAFAB86BB86CD5BEB86DB86EB86FB870BEBABEB9D5C2B871B872BFA2B873CDAFF1B5B874B875B876B877B878B879BDDFB87AB6CBB87BB87CB87DB87EB880B881B882B883B884D6F1F3C3B885B886F3C4B887B8CDB888B889B88AF3C6F3C7B88BB0CAB88CF3C5B88DF3C9CBF1B88EB88FB890F3CBB891D0A6B892B893B1CAF3C8B894B895B896F3CFB897B5D1B898B899F3D7B89AF3D2B89BB89CB89DF3D4F3D3B7FBB89EB1BFB89FF3CEF3CAB5DAB8A0F3D0B940B941F3D1B942F3D5B943B944B945B946F3CDB947BCE3B948C1FDB949F3D6B94AB94BB94CB94DB94EB94FF3DAB950F3CCB951B5C8B952BDEEF3DCB953B954B7A4BFF0D6FECDB2B955B4F0B956B2DFB957F3D8B958F3D9C9B8B959F3DDB95AB95BF3DEB95CF3E1B95DB95EB95FB960B961B962B963B964B965B966B967F3DFB968B969F3E3F3E2B96AB96BF3DBB96CBFEAB96DB3EFB96EF3E0B96FB970C7A9B971BCF2B972B973B974B975F3EBB976B977B978B979B97AB97BB97CB9BFB97DB97EF3E4B980B981B982B2ADBBFEB983CBE3B984B985B986B987F3EDF3E9B988B989B98AB9DCF3EEB98BB98CB98DF3E5F3E6F3EAC2E1F3ECF3EFF3E8BCFDB98EB98FB990CFE4B991B992F3F0B993B994B995F3E7B996B997B998B999B99AB99BB99CB99DF3F2B99EB99FB9A0BA40D7ADC6AABA41BA42BA43BA44F3F3BA45BA46BA47BA48F3F1BA49C2A8BA4ABA4BBA4CBA4DBA4EB8DDF3F5BA4FBA50F3F4BA51BA52BA53B4DBBA54BA55BA56F3F6F3F7BA57BA58BA59F3F8BA5ABA5BBA5CC0BABA5DBA5EC0E9BA5FBA60BA61BA62BA63C5F1BA64BA65BA66BA67F3FBBA68F3FABA69BA6ABA6BBA6CBA6DBA6EBA6FBA70B4D8BA71BA72BA73F3FEF3F9BA74BA75F3FCBA76BA77BA78BA79BA7ABA7BF3FDBA7CBA7DBA7EBA80BA81BA82BA83BA84F4A1BA85BA86BA87BA88BA89BA8AF4A3BBC9BA8BBA8CF4A2BA8DBA8EBA8FBA90BA91BA92BA93BA94BA95BA96BA97BA98BA99F4A4BA9ABA9BBA9CBA9DBA9EBA9FB2BEF4A6F4A5BAA0BB40BB41BB42BB43BB44BB45BB46BB47BB48BB49BCAEBB4ABB4BBB4CBB4DBB4EBB4FBB50BB51BB52BB53BB54BB55BB56BB57BB58BB59BB5ABB5BBB5CBB5DBB5EBB5FBB60BB61BB62BB63BB64BB65BB66BB67BB68BB69BB6ABB6BBB6CBB6DBB6EC3D7D9E1BB6FBB70BB71BB72BB73BB74C0E0F4CCD7D1BB75BB76BB77BB78BB79BB7ABB7BBB7CBB7DBB7EBB80B7DBBB81BB82BB83BB84BB85BB86BB87F4CEC1A3BB88BB89C6C9BB8AB4D6D5B3BB8BBB8CBB8DF4D0F4CFF4D1CBDABB8EBB8FF4D2BB90D4C1D6E0BB91BB92BB93BB94B7E0BB95BB96BB97C1B8BB98BB99C1BBF4D3BEACBB9ABB9BBB9CBB9DBB9EB4E2BB9FBBA0F4D4F4D5BEABBC40BC41F4D6BC42BC43BC44F4DBBC45F4D7F4DABC46BAFDBC47F4D8F4D9BC48BC49BC4ABC4BBC4CBC4DBC4EB8E2CCC7F4DCBC4FB2DABC50BC51C3D3BC52BC53D4E3BFB7BC54BC55BC56BC57BC58BC59BC5AF4DDBC5BBC5CBC5DBC5EBC5FBC60C5B4BC61BC62BC63BC64BC65BC66BC67BC68F4E9BC69BC6ACFB5BC6BBC6CBC6DBC6EBC6FBC70BC71BC72BC73BC74BC75BC76BC77BC78CEC9BC79BC7ABC7BBC7CBC7DBC7EBC80BC81BC82BC83BC84BC85BC86BC87BC88BC89BC8ABC8BBC8CBC8DBC8ECBD8BC8FCBF7BC90BC91BC92BC93BDF4BC94BC95BC96D7CFBC97BC98BC99C0DBBC9ABC9BBC9CBC9DBC9EBC9FBCA0BD40BD41BD42BD43BD44BD45BD46BD47BD48BD49BD4ABD4BBD4CBD4DBD4EBD4FBD50BD51BD52BD53BD54BD55BD56BD57BD58BD59BD5ABD5BBD5CBD5DBD5EBD5FBD60BD61BD62BD63BD64BD65BD66BD67BD68BD69BD6ABD6BBD6CBD6DBD6EBD6FBD70BD71BD72BD73BD74BD75BD76D0F5BD77BD78BD79BD7ABD7BBD7CBD7DBD7EF4EABD80BD81BD82BD83BD84BD85BD86BD87BD88BD89BD8ABD8BBD8CBD8DBD8EBD8FBD90BD91BD92BD93BD94BD95BD96BD97BD98BD99BD9ABD9BBD9CBD9DBD9EBD9FBDA0BE40BE41BE42BE43BE44BE45BE46BE47BE48BE49BE4ABE4BBE4CF4EBBE4DBE4EBE4FBE50BE51BE52BE53F4ECBE54BE55BE56BE57BE58BE59BE5ABE5BBE5CBE5DBE5EBE5FBE60BE61BE62BE63BE64BE65BE66BE67BE68BE69BE6ABE6BBE6CBE6DBE6EBE6FBE70BE71BE72BE73BE74BE75BE76BE77BE78BE79BE7ABE7BBE7CBE7DBE7EBE80BE81BE82BE83BE84BE85BE86BE87BE88BE89BE8ABE8BBE8CBE8DBE8EBE8FBE90BE91BE92BE93BE94BE95BE96BE97BE98BE99BE9ABE9BBE9CBE9DBE9EBE9FBEA0BF40BF41BF42BF43BF44BF45BF46BF47BF48BF49BF4ABF4BBF4CBF4DBF4EBF4FBF50BF51BF52BF53BF54BF55BF56BF57BF58BF59BF5ABF5BBF5CBF5DBF5EBF5FBF60BF61BF62BF63BF64BF65BF66BF67BF68BF69BF6ABF6BBF6CBF6DBF6EBF6FBF70BF71BF72BF73BF74BF75BF76BF77BF78BF79BF7ABF7BBF7CBF7DBF7EBF80F7E3BF81BF82BF83BF84BF85B7B1BF86BF87BF88BF89BF8AF4EDBF8BBF8CBF8DBF8EBF8FBF90BF91BF92BF93BF94BF95BF96BF97BF98BF99BF9ABF9BBF9CBF9DBF9EBF9FBFA0C040C041C042C043C044C045C046C047C048C049C04AC04BC04CC04DC04EC04FC050C051C052C053C054C055C056C057C058C059C05AC05BC05CC05DC05EC05FC060C061C062C063D7EBC064C065C066C067C068C069C06AC06BC06CC06DC06EC06FC070C071C072C073C074C075C076C077C078C079C07AC07BF4EEC07CC07DC07EE6F9BEC0E6FABAECE6FBCFCBE6FCD4BCBCB6E6FDE6FEBCCDC8D2CEB3E7A1C080B4BFE7A2C9B4B8D9C4C9C081D7DDC2DAB7D7D6BDCEC6B7C4C082C083C5A6E7A3CFDFE7A4E7A5E7A6C1B7D7E9C9F0CFB8D6AFD6D5E7A7B0EDE7A8E7A9C9DCD2EFBEADE7AAB0F3C8DEBDE1E7ABC8C6C084E7ACBBE6B8F8D1A4E7ADC2E7BEF8BDCACDB3E7AEE7AFBEEED0E5C085CBE7CCD0BCCCE7B0BCA8D0F7E7B1C086D0F8E7B2E7B3B4C2E7B4E7B5C9FECEACC3E0E7B7B1C1B3F1C087E7B8E7B9D7DBD5C0E7BAC2CCD7BAE7BBE7BCE7BDBCEAC3E5C0C2E7BEE7BFBCA9C088E7C0E7C1E7B6B6D0E7C2C089E7C3E7C4BBBAB5DEC2C6B1E0E7C5D4B5E7C6B8BFE7C8E7C7B7ECC08AE7C9B2F8E7CAE7CBE7CCE7CDE7CEE7CFE7D0D3A7CBF5E7D1E7D2E7D3E7D4C9C9E7D5E7D6E7D7E7D8E7D9BDC9E7DAF3BEC08BB8D7C08CC8B1C08DC08EC08FC090C091C092C093F3BFC094F3C0F3C1C095C096C097C098C099C09AC09BC09CC09DC09EB9DECDF8C09FC0A0D8E8BAB1C140C2DEEEB7C141B7A3C142C143C144C145EEB9C146EEB8B0D5C147C148C149C14AC14BEEBBD5D6D7EFC14CC14DC14ED6C3C14FC150EEBDCAF0C151EEBCC152C153C154C155EEBEC156C157C158C159EEC0C15AC15BEEBFC15CC15DC15EC15FC160C161C162C163D1F2C164C7BCC165C3C0C166C167C168C169C16AB8E1C16BC16CC16DC16EC16FC1E7C170C171F4C6D0DFF4C7C172CFDBC173C174C8BAC175C176F4C8C177C178C179C17AC17BC17CC17DF4C9F4CAC17EF4CBC180C181C182C183C184D9FAB8FEC185C186E5F1D3F0C187F4E0C188CECCC189C18AC18BB3E1C18CC18DC18EC18FF1B4C190D2EEC191F4E1C192C193C194C195C196CFE8F4E2C197C198C7CCC199C19AC19BC19CC19DC19EB5D4B4E4F4E4C19FC1A0C240F4E3F4E5C241C242F4E6C243C244C245C246F4E7C247BAB2B0BFC248F4E8C249C24AC24BC24CC24DC24EC24FB7ADD2EDC250C251C252D2ABC0CFC253BFBCEBA3D5DFEAC8C254C255C256C257F1F3B6F8CBA3C258C259C4CDC25AF1E7C25BF1E8B8FBF1E9BAC4D4C5B0D2C25CC25DF1EAC25EC25FC260F1EBC261F1ECC262C263F1EDF1EEF1EFF1F1F1F0C5D5C264C265C266C267C268C269F1F2C26AB6FAC26BF1F4D2AEDEC7CBCAC26CC26DB3DCC26EB5A2C26FB9A2C270C271C4F4F1F5C272C273F1F6C274C275C276C1C4C1FBD6B0F1F7C277C278C279C27AF1F8C27BC1AAC27CC27DC27EC6B8C280BEDBC281C282C283C284C285C286C287C288C289C28AC28BC28CC28DC28EF1F9B4CFC28FC290C291C292C293C294F1FAC295C296C297C298C299C29AC29BC29CC29DC29EC29FC2A0C340EDB2EDB1C341C342CBE0D2DEC343CBC1D5D8C344C8E2C345C0DFBCA1C346C347C348C349C34AC34BEBC1C34CC34DD0A4C34ED6E2C34FB6C7B8D8EBC0B8CEC350EBBFB3A6B9C9D6ABC351B7F4B7CAC352C353C354BCE7B7BEEBC6C355EBC7B0B9BFCFC356EBC5D3FDC357EBC8C358C359EBC9C35AC35BB7CEC35CEBC2EBC4C9F6D6D7D5CDD0B2EBCFCEB8EBD0C35DB5A8C35EC35FC360C361C362B1B3EBD2CCA5C363C364C365C366C367C368C369C5D6EBD3C36AEBD1C5DFEBCECAA4EBD5B0FBC36BC36CBAFAC36DC36ED8B7F1E3C36FEBCAEBCBEBCCEBCDEBD6E6C0EBD9C370BFE8D2C8EBD7EBDCB8ECEBD8C371BDBAC372D0D8C373B0B7C374EBDDC4DCC375C376C377C378D6ACC379C37AC37BB4E0C37CC37DC2F6BCB9C37EC380EBDAEBDBD4E0C6EAC4D4EBDFC5A7D9F5C381B2B1C382EBE4C383BDC5C384C385C386EBE2C387C388C389C38AC38BC38CC38DC38EC38FC390C391C392C393EBE3C394C395B8ACC396CDD1EBE5C397C398C399EBE1C39AC1B3C39BC39CC39DC39EC39FC6A2C3A0C440C441C442C443C444C445CCF3C446EBE6C447C0B0D2B8EBE7C448C449C44AB8AFB8ADC44BEBE8C7BBCDF3C44CC44DC44EEBEAEBEBC44FC450C451C452C453EBEDC454C455C456C457D0C8C458EBF2C459EBEEC45AC45BC45CEBF1C8F9C45DD1FCEBECC45EC45FEBE9C460C461C462C463B8B9CFD9C4E5EBEFEBF0CCDACDC8B0F2C464EBF6C465C466C467C468C469EBF5C46AB2B2C46BC46CC46DC46EB8E0C46FEBF7C470C471C472C473C474C475B1ECC476C477CCC5C4A4CFA5C478C479C47AC47BC47CEBF9C47DC47EECA2C480C5F2C481EBFAC482C483C484C485C486C487C488C489C9C5C48AC48BC48CC48DC48EC48FE2DFEBFEC490C491C492C493CDCEECA1B1DBD3B7C494C495D2DCC496C497C498EBFDC499EBFBC49AC49BC49CC49DC49EC49FC4A0C540C541C542C543C544C545C546C547C548C549C54AC54BC54CC54DC54EB3BCC54FC550C551EAB0C552C553D7D4C554F4ABB3F4C555C556C557C558C559D6C1D6C2C55AC55BC55CC55DC55EC55FD5E9BECAC560F4A7C561D2A8F4A8F4A9C562F4AABECBD3DFC563C564C565C566C567C9E0C9E1C568C569F3C2C56ACAE6C56BCCF2C56CC56DC56EC56FC570C571E2B6CBB4C572CEE8D6DBC573F4ADF4AEF4AFC574C575C576C577F4B2C578BABDF4B3B0E3F4B0C579F4B1BDA2B2D5C57AF4B6F4B7B6E6B2B0CFCFF4B4B4ACC57BF4B5C57CC57DF4B8C57EC580C581C582C583F4B9C584C585CDA7C586F4BAC587F4BBC588C589C58AF4BCC58BC58CC58DC58EC58FC590C591C592CBD2C593F4BDC594C595C596C597F4BEC598C599C59AC59BC59CC59DC59EC59FF4BFC5A0C640C641C642C643F4DEC1BCBCE8C644C9ABD1DEE5F5C645C646C647C648DCB3D2D5C649C64ADCB4B0ACDCB5C64BC64CBDDAC64DDCB9C64EC64FC650D8C2C651DCB7D3F3C652C9D6DCBADCB6C653DCBBC3A2C654C655C656C657DCBCDCC5DCBDC658C659CEDFD6A5C65ADCCFC65BDCCDC65CC65DDCD2BDE6C2ABC65EDCB8DCCBDCCEDCBEB7D2B0C5DCC7D0BEDCC1BBA8C65FB7BCDCCCC660C661DCC6DCBFC7DBC662C663C664D1BFDCC0C665C666DCCAC667C668DCD0C669C66ACEADDCC2C66BDCC3DCC8DCC9B2D4DCD1CBD5C66CD4B7DCDBDCDFCCA6DCE6C66DC3E7DCDCC66EC66FBFC1DCD9C670B0FAB9B6DCE5DCD3C671DCC4DCD6C8F4BFE0C672C673C674C675C9BBC676C677C678B1BDC679D3A2C67AC67BDCDAC67CC67DDCD5C67EC6BBC680DCDEC681C682C683C684C685D7C2C3AFB7B6C7D1C3A9DCE2DCD8DCEBDCD4C686C687DCDDC688BEA5DCD7C689DCE0C68AC68BDCE3DCE4C68CDCF8C68DC68EDCE1DDA2DCE7C68FC690C691C692C693C694C695C696C697C698BCEBB4C4C699C69AC3A3B2E7DCFAC69BDCF2C69CDCEFC69DDCFCDCEED2F0B2E8C69EC8D7C8E3DCFBC69FDCEDC6A0C740C741DCF7C742C743DCF5C744C745BEA3DCF4C746B2DDC747C748C749C74AC74BDCF3BCF6DCE8BBC4C74CC0F3C74DC74EC74FC750C751BCD4DCE9DCEAC752DCF1DCF6DCF9B5B4C753C8D9BBE7DCFEDCFDD3ABDDA1DDA3DDA5D2F1DDA4DDA6DDA7D2A9C754C755C756C757C758C759C75ABAC9DDA9C75BC75CDDB6DDB1DDB4C75DC75EC75FC760C761C762C763DDB0C6CEC764C765C0F2C766C767C768C769C9AFC76AC76BC76CDCECDDAEC76DC76EC76FC770DDB7C771C772DCF0DDAFC773DDB8C774DDACC775C776C777C778C779C77AC77BDDB9DDB3DDADC4AAC77CC77DC77EC780DDA8C0B3C1ABDDAADDABC781DDB2BBF1DDB5D3A8DDBAC782DDBBC3A7C783C784DDD2DDBCC785C786C787DDD1C788B9BDC789C78ABED5C78BBEFAC78CC78DBACAC78EC78FC790C791DDCAC792DDC5C793DDBFC794C795C796B2CBDDC3C797DDCBB2A4DDD5C798C799C79ADDBEC79BC79CC79DC6D0DDD0C79EC79FC7A0C840C841DDD4C1E2B7C6C842C843C844C845C846DDCEDDCFC847C848C849DDC4C84AC84BC84CDDBDC84DDDCDCCD1C84EDDC9C84FC850C851C852DDC2C3C8C6BCCEAEDDCCC853DDC8C854C855C856C857C858C859DDC1C85AC85BC85CDDC6C2DCC85DC85EC85FC860C861C862D3A9D3AADDD3CFF4C8F8C863C864C865C866C867C868C869C86ADDE6C86BC86CC86DC86EC86FC870DDC7C871C872C873DDE0C2E4C874C875C876C877C878C879C87AC87BDDE1C87CC87DC87EC880C881C882C883C884C885C886DDD7C887C888C889C88AC88BD6F8C88CDDD9DDD8B8F0DDD6C88DC88EC88FC890C6CFC891B6ADC892C893C894C895C896DDE2C897BAF9D4E1DDE7C898C899C89AB4D0C89BDDDAC89CBFFBDDE3C89DDDDFC89EDDDDC89FC8A0C940C941C942C943C944B5D9C945C946C947C948DDDBDDDCDDDEC949BDAFDDE4C94ADDE5C94BC94CC94DC94EC94FC950C951C952DDF5C953C3C9C954C955CBE2C956C957C958C959DDF2C95AC95BC95CC95DC95EC95FC960C961C962C963C964C965C966D8E1C967C968C6D1C969DDF4C96AC96BC96CD5F4DDF3DDF0C96DC96EDDECC96FDDEFC970DDE8C971C972D0EEC973C974C975C976C8D8DDEEC977C978DDE9C979C97ADDEACBF2C97BDDEDC97CC97DB1CDC97EC980C981C982C983C984C0B6C985BCBBDDF1C986C987DDF7C988DDF6DDEBC989C98AC98BC98CC98DC5EEC98EC98FC990DDFBC991C992C993C994C995C996C997C998C999C99AC99BDEA4C99CC99DDEA3C99EC99FC9A0CA40CA41CA42CA43CA44CA45CA46CA47CA48DDF8CA49CA4ACA4BCA4CC3EFCA4DC2FBCA4ECA4FCA50D5E1CA51CA52CEB5CA53CA54CA55CA56DDFDCA57B2CCCA58CA59CA5ACA5BCA5CCA5DCA5ECA5FCA60C4E8CADFCA61CA62CA63CA64CA65CA66CA67CA68CA69CA6AC7BEDDFADDFCDDFEDEA2B0AAB1CECA6BCA6CCA6DCA6ECA6FDEACCA70CA71CA72CA73DEA6BDB6C8EFCA74CA75CA76CA77CA78CA79CA7ACA7BCA7CCA7DCA7EDEA1CA80CA81DEA5CA82CA83CA84CA85DEA9CA86CA87CA88CA89CA8ADEA8CA8BCA8CCA8DDEA7CA8ECA8FCA90CA91CA92CA93CA94CA95CA96DEADCA97D4CCCA98CA99CA9ACA9BDEB3DEAADEAECA9CCA9DC0D9CA9ECA9FCAA0CB40CB41B1A1DEB6CB42DEB1CB43CB44CB45CB46CB47CB48CB49DEB2CB4ACB4BCB4CCB4DCB4ECB4FCB50CB51CB52CB53CB54D1A6DEB5CB55CB56CB57CB58CB59CB5ACB5BDEAFCB5CCB5DCB5EDEB0CB5FD0BDCB60CB61CB62DEB4CAEDDEB9CB63CB64CB65CB66CB67CB68DEB8CB69DEB7CB6ACB6BCB6CCB6DCB6ECB6FCB70DEBBCB71CB72CB73CB74CB75CB76CB77BDE5CB78CB79CB7ACB7BCB7CB2D8C3EACB7DCB7EDEBACB80C5BACB81CB82CB83CB84CB85CB86DEBCCB87CB88CB89CB8ACB8BCB8CCB8DCCD9CB8ECB8FCB90CB91B7AACB92CB93CB94CB95CB96CB97CB98CB99CB9ACB9BCB9CCB9DCB9ECB9FCBA0CC40CC41D4E5CC42CC43CC44DEBDCC45CC46CC47CC48CC49DEBFCC4ACC4BCC4CCC4DCC4ECC4FCC50CC51CC52CC53CC54C4A2CC55CC56CC57CC58DEC1CC59CC5ACC5BCC5CCC5DCC5ECC5FCC60CC61CC62CC63CC64CC65CC66CC67CC68DEBECC69DEC0CC6ACC6BCC6CCC6DCC6ECC6FCC70CC71CC72CC73CC74CC75CC76CC77D5BACC78CC79CC7ADEC2CC7BCC7CCC7DCC7ECC80CC81CC82CC83CC84CC85CC86CC87CC88CC89CC8ACC8BF2AEBBA2C2B2C5B0C2C7CC8CCC8DF2AFCC8ECC8FCC90CC91CC92D0E9CC93CC94CC95D3DDCC96CC97CC98EBBDCC99CC9ACC9BCC9CCC9DCC9ECC9FCCA0B3E6F2B0CD40F2B1CD41CD42CAADCD43CD44CD45CD46CD47CD48CD49BAE7F2B3F2B5F2B4CBE4CFBAF2B2CAB4D2CFC2ECCD4ACD4BCD4CCD4DCD4ECD4FCD50CEC3F2B8B0F6F2B7CD51CD52CD53CD54CD55F2BECD56B2CFCD57CD58CD59CD5ACD5BCD5CD1C1F2BACD5DCD5ECD5FCD60CD61F2BCD4E9CD62CD63F2BBF2B6F2BFF2BDCD64F2B9CD65CD66F2C7F2C4F2C6CD67CD68F2CAF2C2F2C0CD69CD6ACD6BF2C5CD6CCD6DCD6ECD6FCD70D6FBCD71CD72CD73F2C1CD74C7F9C9DFCD75F2C8B9C6B5B0CD76CD77F2C3F2C9F2D0F2D6CD78CD79BBD7CD7ACD7BCD7CF2D5CDDCCD7DD6EBCD7ECD80F2D2F2D4CD81CD82CD83CD84B8F2CD85CD86CD87CD88F2CBCD89CD8ACD8BF2CEC2F9CD8CD5DDF2CCF2CDF2CFF2D3CD8DCD8ECD8FF2D9D3BCCD90CD91CD92CD93B6EACD94CAF1CD95B7E4F2D7CD96CD97CD98F2D8F2DAF2DDF2DBCD99CD9AF2DCCD9BCD9CCD9DCD9ED1D1F2D1CD9FCDC9CDA0CECFD6A9CE40F2E3CE41C3DBCE42F2E0CE43CE44C0AFF2ECF2DECE45F2E1CE46CE47CE48F2E8CE49CE4ACE4BCE4CF2E2CE4DCE4EF2E7CE4FCE50F2E6CE51CE52F2E9CE53CE54CE55F2DFCE56CE57F2E4F2EACE58CE59CE5ACE5BCE5CCE5DCE5ED3ACF2E5B2F5CE5FCE60F2F2CE61D0ABCE62CE63CE64CE65F2F5CE66CE67CE68BBC8CE69F2F9CE6ACE6BCE6CCE6DCE6ECE6FF2F0CE70CE71F2F6F2F8F2FACE72CE73CE74CE75CE76CE77CE78CE79F2F3CE7AF2F1CE7BCE7CCE7DBAFBCE7EB5FBCE80CE81CE82CE83F2EFF2F7F2EDF2EECE84CE85CE86F2EBF3A6CE87F3A3CE88CE89F3A2CE8ACE8BF2F4CE8CC8DACE8DCE8ECE8FCE90CE91F2FBCE92CE93CE94F3A5CE95CE96CE97CE98CE99CE9ACE9BC3F8CE9CCE9DCE9ECE9FCEA0CF40CF41CF42F2FDCF43CF44F3A7F3A9F3A4CF45F2FCCF46CF47CF48F3ABCF49F3AACF4ACF4BCF4CCF4DC2DDCF4ECF4FF3AECF50CF51F3B0CF52CF53CF54CF55CF56F3A1CF57CF58CF59F3B1F3ACCF5ACF5BCF5CCF5DCF5EF3AFF2FEF3ADCF5FCF60CF61CF62CF63CF64CF65F3B2CF66CF67CF68CF69F3B4CF6ACF6BCF6CCF6DF3A8CF6ECF6FCF70CF71F3B3CF72CF73CF74F3B5CF75CF76CF77CF78CF79CF7ACF7BCF7CCF7DCF7ED0B7CF80CF81CF82CF83F3B8CF84CF85CF86CF87D9F9CF88CF89CF8ACF8BCF8CCF8DF3B9CF8ECF8FCF90CF91CF92CF93CF94CF95F3B7CF96C8E4F3B6CF97CF98CF99CF9AF3BACF9BCF9CCF9DCF9ECF9FF3BBB4C0CFA0D040D041D042D043D044D045D046D047D048D049D04AD04BD04CD04DEEC3D04ED04FD050D051D052D053F3BCD054D055F3BDD056D057D058D1AAD059D05AD05BF4ACD0C6D05CD05DD05ED05FD060D061D0D0D1DCD062D063D064D065D066D067CFCED068D069BDD6D06AD1C3D06BD06CD06DD06ED06FD070D071BAE2E1E9D2C2F1C2B2B9D072D073B1EDF1C3D074C9C0B3C4D075D9F2D076CBA5D077F1C4D078D079D07AD07BD6D4D07CD07DD07ED080D081F1C5F4C0F1C6D082D4ACF1C7D083B0C0F4C1D084D085F4C2D086D087B4FCD088C5DBD089D08AD08BD08CCCBBD08DD08ED08FD0E4D090D091D092D093D094CDE0D095D096D097D098D099F1C8D09AD9F3D09BD09CD09DD09ED09FD0A0B1BBD140CFAED141D142D143B8A4D144D145D146D147D148F1CAD149D14AD14BD14CF1CBD14DD14ED14FD150B2C3C1D1D151D152D7B0F1C9D153D154F1CCD155D156D157D158F1CED159D15AD15BD9F6D15CD2E1D4A3D15DD15EF4C3C8B9D15FD160D161D162D163F4C4D164D165F1CDF1CFBFE3F1D0D166D167F1D4D168D169D16AD16BD16CD16DD16EF1D6F1D1D16FC9D1C5E1D170D171D172C2E3B9FCD173D174F1D3D175F1D5D176D177D178B9D3D179D17AD17BD17CD17DD17ED180F1DBD181D182D183D184D185BAD6D186B0FDF1D9D187D188D189D18AD18BF1D8F1D2F1DAD18CD18DD18ED18FD190F1D7D191D192D193C8ECD194D195D196D197CDCAF1DDD198D199D19AD19BE5BDD19CD19DD19EF1DCD19FF1DED1A0D240D241D242D243D244D245D246D247D248F1DFD249D24ACFE5D24BD24CD24DD24ED24FD250D251D252D253D254D255D256D257D258D259D25AD25BD25CD25DD25ED25FD260D261D262D263F4C5BDF3D264D265D266D267D268D269F1E0D26AD26BD26CD26DD26ED26FD270D271D272D273D274D275D276D277D278D279D27AD27BD27CD27DF1E1D27ED280D281CEF7D282D2AAD283F1FBD284D285B8B2D286D287D288D289D28AD28BD28CD28DD28ED28FD290D291D292D293D294D295D296D297D298D299D29AD29BD29CD29DD29ED29FD2A0D340D341D342D343D344D345D346D347D348D349D34AD34BD34CD34DD34ED34FD350D351D352D353D354D355D356D357D358D359D35AD35BD35CD35DD35EBCFBB9DBD35FB9E6C3D9CAD3EAE8C0C0BEF5EAE9EAEAEAEBD360EAECEAEDEAEEEAEFBDC7D361D362D363F5FBD364D365D366F5FDD367F5FED368F5FCD369D36AD36BD36CBDE2D36DF6A1B4A5D36ED36FD370D371F6A2D372D373D374F6A3D375D376D377ECB2D378D379D37AD37BD37CD37DD37ED380D381D382D383D384D1D4D385D386D387D388D389D38AD9EAD38BD38CD38DD38ED38FD390D391D392D393D394D395D396D397D398D399D39AD39BD39CD39DD39ED39FD3A0D440D441D442D443D444D445D446D447D448D449D44AD44BD44CD44DD44ED44FD450D451D452D453D454D455D456D457D458D459D45AD45BD45CD45DD45ED45FF6A4D460D461D462D463D464D465D466D467D468EEBAD469D46AD46BD46CD46DD46ED46FD470D471D472D473D474D475D476D477D478D479D47AD47BD47CD47DD47ED480D481D482D483D484D485D486D487D488D489D48AD48BD48CD48DD48ED48FD490D491D492D493D494D495D496D497D498D499D5B2D49AD49BD49CD49DD49ED49FD4A0D540D541D542D543D544D545D546D547D3FECCDCD548D549D54AD54BD54CD54DD54ED54FCAC4D550D551D552D553D554D555D556D557D558D559D55AD55BD55CD55DD55ED55FD560D561D562D563D564D565D566D567D568D569D56AD56BD56CD56DD56ED56FD570D571D572D573D574D575D576D577D578D579D57AD57BD57CD57DD57ED580D581D582D583D584D585D586D587D588D589D58AD58BD58CD58DD58ED58FD590D591D592D593D594D595D596D597D598D599D59AD59BD59CD59DD59ED59FD5A0D640D641D642D643D644D645D646D647D648D649D64AD64BD64CD64DD64ED64FD650D651D652D653D654D655D656D657D658D659D65AD65BD65CD65DD65ED65FD660D661D662E5C0D663D664D665D666D667D668D669D66AD66BD66CD66DD66ED66FD670D671D672D673D674D675D676D677D678D679D67AD67BD67CD67DD67ED680D681F6A5D682D683D684D685D686D687D688D689D68AD68BD68CD68DD68ED68FD690D691D692D693D694D695D696D697D698D699D69AD69BD69CD69DD69ED69FD6A0D740D741D742D743D744D745D746D747D748D749D74AD74BD74CD74DD74ED74FD750D751D752D753D754D755D756D757D758D759D75AD75BD75CD75DD75ED75FBEAFD760D761D762D763D764C6A9D765D766D767D768D769D76AD76BD76CD76DD76ED76FD770D771D772D773D774D775D776D777D778D779D77AD77BD77CD77DD77ED780D781D782D783D784D785D786D787D788D789D78AD78BD78CD78DD78ED78FD790D791D792D793D794D795D796D797D798DAA5BCC6B6A9B8BCC8CFBCA5DAA6DAA7CCD6C8C3DAA8C6FDD799D1B5D2E9D1B6BCC7D79ABDB2BBE4DAA9DAAAD1C8DAABD0EDB6EFC2DBD79BCBCFB7EDC9E8B7C3BEF7D6A4DAACDAADC6C0D7E7CAB6D79CD5A9CBDFD5EFDAAED6DFB4CADAB0DAAFD79DD2EBDAB1DAB2DAB3CAD4DAB4CAABDAB5DAB6B3CFD6EFDAB7BBB0B5AEDAB8DAB9B9EED1AFD2E8DABAB8C3CFEAB2EFDABBDABCD79EBDEBCEDCD3EFDABDCEF3DABED3D5BBE5DABFCBB5CBD0DAC0C7EBD6EEDAC1C5B5B6C1DAC2B7CCBFCEDAC3DAC4CBADDAC5B5F7DAC6C1C2D7BBDAC7CCB8D79FD2EAC4B1DAC8B5FDBBD1DAC9D0B3DACADACBCEBDDACCDACDDACEB2F7DAD1DACFD1E8DAD0C3D5DAD2D7A0DAD3DAD4DAD5D0BBD2A5B0F9DAD6C7ABDAD7BDF7C3A1DAD8DAD9C3FDCCB7DADADADBC0BEC6D7DADCDADDC7B4DADEDADFB9C8D840D841D842D843D844D845D846D847D848BBEDD849D84AD84BD84CB6B9F4F8D84DF4F9D84ED84FCDE3D850D851D852D853D854D855D856D857F5B9D858D859D85AD85BEBE0D85CD85DD85ED85FD860D861CFF3BBBFD862D863D864D865D866D867D868BAC0D4A5D869D86AD86BD86CD86DD86ED86FE1D9D870D871D872D873F5F4B1AAB2F2D874D875D876D877D878D879D87AF5F5D87BD87CF5F7D87DD87ED880BAD1F5F6D881C3B2D882D883D884D885D886D887D888F5F9D889D88AD88BF5F8D88CD88DD88ED88FD890D891D892D893D894D895D896D897D898D899D89AD89BD89CD89DD89ED89FD8A0D940D941D942D943D944D945D946D947D948D949D94AD94BD94CD94DD94ED94FD950D951D952D953D954D955D956D957D958D959D95AD95BD95CD95DD95ED95FD960D961D962D963D964D965D966D967D968D969D96AD96BD96CD96DD96ED96FD970D971D972D973D974D975D976D977D978D979D97AD97BD97CD97DD97ED980D981D982D983D984D985D986D987D988D989D98AD98BD98CD98DD98ED98FD990D991D992D993D994D995D996D997D998D999D99AD99BD99CD99DD99ED99FD9A0DA40DA41DA42DA43DA44DA45DA46DA47DA48DA49DA4ADA4BDA4CDA4DDA4EB1B4D5EAB8BADA4FB9B1B2C6D4F0CFCDB0DCD5CBBBF5D6CAB7B7CCB0C6B6B1E1B9BAD6FCB9E1B7A1BCFAEADAEADBCCF9B9F3EADCB4FBC3B3B7D1BAD8EADDD4F4EADEBCD6BBDFEADFC1DEC2B8D4DFD7CAEAE0EAE1EAE4EAE2EAE3C9DEB8B3B6C4EAE5CAEAC9CDB4CDDA50DA51E2D9C5E2EAE6C0B5DA52D7B8EAE7D7ACC8FCD8D3D8CDD4DEDA53D4F9C9C4D3AEB8D3B3E0DA54C9E2F4F6DA55DA56DA57BAD5DA58F4F7DA59DA5AD7DFDA5BDA5CF4F1B8B0D5D4B8CFC6F0DA5DDA5EDA5FDA60DA61DA62DA63DA64DA65B3C3DA66DA67F4F2B3ACDA68DA69DA6ADA6BD4BDC7F7DA6CDA6DDA6EDA6FDA70F4F4DA71DA72F4F3DA73DA74DA75DA76DA77DA78DA79DA7ADA7BDA7CCCCBDA7DDA7EDA80C8A4DA81DA82DA83DA84DA85DA86DA87DA88DA89DA8ADA8BDA8CDA8DF4F5DA8ED7E3C5BFF5C0DA8FDA90F5BBDA91F5C3DA92F5C2DA93D6BAF5C1DA94DA95DA96D4BEF5C4DA97F5CCDA98DA99DA9ADA9BB0CFB5F8DA9CF5C9F5CADA9DC5DCDA9EDA9FDAA0DB40F5C5F5C6DB41DB42F5C7F5CBDB43BEE0F5C8B8FADB44DB45DB46F5D0F5D3DB47DB48DB49BFE7DB4AB9F2F5BCF5CDDB4BDB4CC2B7DB4DDB4EDB4FCCF8DB50BCF9DB51F5CEF5CFF5D1B6E5F5D2DB52F5D5DB53DB54DB55DB56DB57DB58DB59F5BDDB5ADB5BDB5CF5D4D3BBDB5DB3ECDB5EDB5FCCA4DB60DB61DB62DB63F5D6DB64DB65DB66DB67DB68DB69DB6ADB6BF5D7BEE1F5D8DB6CDB6DCCDFF5DBDB6EDB6FDB70DB71DB72B2C8D7D9DB73F5D9DB74F5DAF5DCDB75F5E2DB76DB77DB78F5E0DB79DB7ADB7BF5DFF5DDDB7CDB7DF5E1DB7EDB80F5DEF5E4F5E5DB81CCE3DB82DB83E5BFB5B8F5E3F5E8CCA3DB84DB85DB86DB87DB88F5E6F5E7DB89DB8ADB8BDB8CDB8DDB8EF5BEDB8FDB90DB91DB92DB93DB94DB95DB96DB97DB98DB99DB9AB1C4DB9BDB9CF5BFDB9DDB9EB5C5B2E4DB9FF5ECF5E9DBA0B6D7DC40F5EDDC41F5EADC42DC43DC44DC45DC46F5EBDC47DC48B4DADC49D4EADC4ADC4BDC4CF5EEDC4DB3F9DC4EDC4FDC50DC51DC52DC53DC54F5EFF5F1DC55DC56DC57F5F0DC58DC59DC5ADC5BDC5CDC5DDC5EF5F2DC5FF5F3DC60DC61DC62DC63DC64DC65DC66DC67DC68DC69DC6ADC6BC9EDB9AADC6CDC6DC7FBDC6EDC6FB6E3DC70DC71DC72DC73DC74DC75DC76CCC9DC77DC78DC79DC7ADC7BDC7CDC7DDC7EDC80DC81DC82DC83DC84DC85DC86DC87DC88DC89DC8AEAA6DC8BDC8CDC8DDC8EDC8FDC90DC91DC92DC93DC94DC95DC96DC97DC98DC99DC9ADC9BDC9CDC9DDC9EDC9FDCA0DD40DD41DD42DD43DD44DD45DD46DD47DD48DD49DD4ADD4BDD4CDD4DDD4EDD4FDD50DD51DD52DD53DD54DD55DD56DD57DD58DD59DD5ADD5BDD5CDD5DDD5EDD5FDD60DD61DD62DD63DD64DD65DD66DD67DD68DD69DD6ADD6BDD6CDD6DDD6EDD6FDD70DD71DD72DD73DD74DD75DD76DD77DD78DD79DD7ADD7BDD7CDD7DDD7EDD80DD81DD82DD83DD84DD85DD86DD87DD88DD89DD8ADD8BDD8CDD8DDD8EDD8FDD90DD91DD92DD93DD94DD95DD96DD97DD98DD99DD9ADD9BDD9CDD9DDD9EDD9FDDA0DE40DE41DE42DE43DE44DE45DE46DE47DE48DE49DE4ADE4BDE4CDE4DDE4EDE4FDE50DE51DE52DE53DE54DE55DE56DE57DE58DE59DE5ADE5BDE5CDE5DDE5EDE5FDE60B3B5D4FEB9ECD0F9DE61E9EDD7AAE9EEC2D6C8EDBAE4E9EFE9F0E9F1D6E1E9F2E9F3E9F5E9F4E9F6E9F7C7E1E9F8D4D8E9F9BDCEDE62E9FAE9FBBDCFE9FCB8A8C1BEE9FDB1B2BBD4B9F5E9FEDE63EAA1EAA2EAA3B7F8BCADDE64CAE4E0CED4AFCFBDD5B7EAA4D5DEEAA5D0C1B9BCDE65B4C7B1D9DE66DE67DE68C0B1DE69DE6ADE6BDE6CB1E6B1E7DE6DB1E8DE6EDE6FDE70DE71B3BDC8E8DE72DE73DE74DE75E5C1DE76DE77B1DFDE78DE79DE7AC1C9B4EFDE7BDE7CC7A8D3D8DE7DC6F9D1B8DE7EB9FDC2F5DE80DE81DE82DE83DE84D3ADDE85D4CBBDFCDE86E5C2B7B5E5C3DE87DE88BBB9D5E2DE89BDF8D4B6CEA5C1ACB3D9DE8ADE8BCCF6DE8CE5C6E5C4E5C8DE8DE5CAE5C7B5CFC6C8DE8EB5FCE5C5DE8FCAF6DE90DE91E5C9DE92DE93DE94C3D4B1C5BCA3DE95DE96DE97D7B7DE98DE99CDCBCBCDCACACCD3E5CCE5CBC4E6DE9ADE9BD1A1D1B7E5CDDE9CE5D0DE9DCDB8D6F0E5CFB5DDDE9ECDBEDE9FE5D1B6BADEA0DF40CDA8B9E4DF41CAC5B3D1CBD9D4ECE5D2B7EADF42DF43DF44E5CEDF45DF46DF47DF48DF49DF4AE5D5B4FEE5D6DF4BDF4CDF4DDF4EDF4FE5D3E5D4DF50D2DDDF51DF52C2DFB1C6DF53D3E2DF54DF55B6DDCBECDF56E5D7DF57DF58D3F6DF59DF5ADF5BDF5CDF5DB1E9DF5EB6F4E5DAE5D8E5D9B5C0DF5FDF60DF61D2C5E5DCDF62DF63E5DEDF64DF65DF66DF67DF68DF69E5DDC7B2DF6AD2A3DF6BDF6CE5DBDF6DDF6EDF6FDF70D4E2D5DADF71DF72DF73DF74DF75E5E0D7F1DF76DF77DF78DF79DF7ADF7BDF7CE5E1DF7DB1DCD1FBDF7EE5E2E5E4DF80DF81DF82DF83E5E3DF84DF85E5E5DF86DF87DF88DF89DF8AD2D8DF8BB5CBDF8CE7DFDF8DDAF5DF8EDAF8DF8FDAF6DF90DAF7DF91DF92DF93DAFAD0CFC4C7DF94DF95B0EEDF96DF97DF98D0B0DF99DAF9DF9AD3CABAAADBA2C7F1DF9BDAFCDAFBC9DBDAFDDF9CDBA1D7DEDAFEC1DADF9DDF9EDBA5DF9FDFA0D3F4E040E041DBA7DBA4E042DBA8E043E044BDBCE045E046E047C0C9DBA3DBA6D6A3E048DBA9E049E04AE04BDBADE04CE04DE04EDBAEDBACBAC2E04FE050E051BFA4DBABE052E053E054DBAAD4C7B2BFE055E056DBAFE057B9F9E058DBB0E059E05AE05BE05CB3BBE05DE05EE05FB5A6E060E061E062E063B6BCDBB1E064E065E066B6F5E067DBB2E068E069E06AE06BE06CE06DE06EE06FE070E071E072E073E074E075E076E077E078E079E07AE07BB1C9E07CE07DE07EE080DBB4E081E082E083DBB3DBB5E084E085E086E087E088E089E08AE08BE08CE08DE08EDBB7E08FDBB6E090E091E092E093E094E095E096DBB8E097E098E099E09AE09BE09CE09DE09EE09FDBB9E0A0E140DBBAE141E142D3CFF4FAC7F5D7C3C5E4F4FCF4FDF4FBE143BEC6E144E145E146E147D0EFE148E149B7D3E14AE14BD4CDCCAAE14CE14DF5A2F5A1BAA8F4FECBD6E14EE14FE150F5A4C0D2E151B3EAE152CDAAF5A5F5A3BDB4F5A8E153F5A9BDCDC3B8BFE1CBE1F5AAE154E155E156F5A6F5A7C4F0E157E158E159E15AE15BF5ACE15CB4BCE15DD7EDE15EB4D7F5ABF5AEE15FE160F5ADF5AFD0D1E161E162E163E164E165E166E167C3D1C8A9E168E169E16AE16BE16CE16DF5B0F5B1E16EE16FE170E171E172E173F5B2E174E175F5B3F5B4F5B5E176E177E178E179F5B7F5B6E17AE17BE17CE17DF5B8E17EE180E181E182E183E184E185E186E187E188E189E18AB2C9E18BD3D4CACDE18CC0EFD6D8D2B0C1BFE18DBDF0E18EE18FE190E191E192E193E194E195E196E197B8AAE198E199E19AE19BE19CE19DE19EE19FE1A0E240E241E242E243E244E245E246E247E248E249E24AE24BE24CE24DE24EE24FE250E251E252E253E254E255E256E257E258E259E25AE25BE25CE25DE25EE25FE260E261E262E263E264E265E266E267E268E269E26AE26BE26CE26DE26EE26FE270E271E272E273E274E275E276E277E278E279E27AE27BE27CE27DE27EE280E281E282E283E284E285E286E287E288E289E28AE28BE28CE28DE28EE28FE290E291E292E293E294E295E296E297E298E299E29AE29BE29CE29DE29EE29FE2A0E340E341E342E343E344E345E346E347E348E349E34AE34BE34CE34DE34EE34FE350E351E352E353E354E355E356E357E358E359E35AE35BE35CE35DE35EE35FE360E361E362E363E364E365E366E367E368E369E36AE36BE36CE36DBCF8E36EE36FE370E371E372E373E374E375E376E377E378E379E37AE37BE37CE37DE37EE380E381E382E383E384E385E386E387F6C6E388E389E38AE38BE38CE38DE38EE38FE390E391E392E393E394E395E396E397E398E399E39AE39BE39CE39DE39EE39FE3A0E440E441E442E443E444E445F6C7E446E447E448E449E44AE44BE44CE44DE44EE44FE450E451E452E453E454E455E456E457E458E459E45AE45BE45CE45DE45EF6C8E45FE460E461E462E463E464E465E466E467E468E469E46AE46BE46CE46DE46EE46FE470E471E472E473E474E475E476E477E478E479E47AE47BE47CE47DE47EE480E481E482E483E484E485E486E487E488E489E48AE48BE48CE48DE48EE48FE490E491E492E493E494E495E496E497E498E499E49AE49BE49CE49DE49EE49FE4A0E540E541E542E543E544E545E546E547E548E549E54AE54BE54CE54DE54EE54FE550E551E552E553E554E555E556E557E558E559E55AE55BE55CE55DE55EE55FE560E561E562E563E564E565E566E567E568E569E56AE56BE56CE56DE56EE56FE570E571E572E573F6C9E574E575E576E577E578E579E57AE57BE57CE57DE57EE580E581E582E583E584E585E586E587E588E589E58AE58BE58CE58DE58EE58FE590E591E592E593E594E595E596E597E598E599E59AE59BE59CE59DE59EE59FF6CAE5A0E640E641E642E643E644E645E646E647E648E649E64AE64BE64CE64DE64EE64FE650E651E652E653E654E655E656E657E658E659E65AE65BE65CE65DE65EE65FE660E661E662F6CCE663E664E665E666E667E668E669E66AE66BE66CE66DE66EE66FE670E671E672E673E674E675E676E677E678E679E67AE67BE67CE67DE67EE680E681E682E683E684E685E686E687E688E689E68AE68BE68CE68DE68EE68FE690E691E692E693E694E695E696E697E698E699E69AE69BE69CE69DF6CBE69EE69FE6A0E740E741E742E743E744E745E746E747F7E9E748E749E74AE74BE74CE74DE74EE74FE750E751E752E753E754E755E756E757E758E759E75AE75BE75CE75DE75EE75FE760E761E762E763E764E765E766E767E768E769E76AE76BE76CE76DE76EE76FE770E771E772E773E774E775E776E777E778E779E77AE77BE77CE77DE77EE780E781E782E783E784E785E786E787E788E789E78AE78BE78CE78DE78EE78FE790E791E792E793E794E795E796E797E798E799E79AE79BE79CE79DE79EE79FE7A0E840E841E842E843E844E845E846E847E848E849E84AE84BE84CE84DE84EF6CDE84FE850E851E852E853E854E855E856E857E858E859E85AE85BE85CE85DE85EE85FE860E861E862E863E864E865E866E867E868E869E86AE86BE86CE86DE86EE86FE870E871E872E873E874E875E876E877E878E879E87AF6CEE87BE87CE87DE87EE880E881E882E883E884E885E886E887E888E889E88AE88BE88CE88DE88EE88FE890E891E892E893E894EEC4EEC5EEC6D5EBB6A4EEC8EEC7EEC9EECAC7A5EECBEECCE895B7B0B5F6EECDEECFE896EECEE897B8C6EED0EED1EED2B6DBB3AED6D3C4C6B1B5B8D6EED3EED4D4BFC7D5BEFBCED9B9B3EED6EED5EED8EED7C5A5EED9EEDAC7AEEEDBC7AFEEDCB2A7EEDDEEDEEEDFEEE0EEE1D7EAEEE2EEE3BCD8EEE4D3CBCCFAB2ACC1E5EEE5C7A6C3ADE898EEE6EEE7EEE8EEE9EEEAEEEBEEECE899EEEDEEEEEEEFE89AE89BEEF0EEF1EEF2EEF4EEF3E89CEEF5CDADC2C1EEF6EEF7EEF8D5A1EEF9CFB3EEFAEEFBE89DEEFCEEFDEFA1EEFEEFA2B8F5C3FAEFA3EFA4BDC2D2BFB2F9EFA5EFA6EFA7D2F8EFA8D6FDEFA9C6CCE89EEFAAEFABC1B4EFACCFFACBF8EFAEEFADB3FAB9F8EFAFEFB0D0E2EFB1EFB2B7E6D0BFEFB3EFB4EFB5C8F1CCE0EFB6EFB7EFB8EFB9EFBAD5E0EFBBB4EDC3AAEFBCE89FEFBDEFBEEFBFE8A0CEFDEFC0C2E0B4B8D7B6BDF5E940CFC7EFC3EFC1EFC2EFC4B6A7BCFCBEE2C3CCEFC5EFC6E941EFC7EFCFEFC8EFC9EFCAC7C2EFF1B6CDEFCBE942EFCCEFCDB6C6C3BEEFCEE943EFD0EFD1EFD2D5F2E944EFD3C4F7E945EFD4C4F8EFD5EFD6B8E4B0F7EFD7EFD8EFD9E946EFDAEFDBEFDCEFDDE947EFDEBEB5EFE1EFDFEFE0E948EFE2EFE3C1CDEFE4EFE5EFE6EFE7EFE8EFE9EFEAEFEBEFECC0D8E949EFEDC1ADEFEEEFEFEFF0E94AE94BCFE2E94CE94DE94EE94FE950E951E952E953B3A4E954E955E956E957E958E959E95AE95BE95CE95DE95EE95FE960E961E962E963E964E965E966E967E968E969E96AE96BE96CE96DE96EE96FE970E971E972E973E974E975E976E977E978E979E97AE97BE97CE97DE97EE980E981E982E983E984E985E986E987E988E989E98AE98BE98CE98DE98EE98FE990E991E992E993E994E995E996E997E998E999E99AE99BE99CE99DE99EE99FE9A0EA40EA41EA42EA43EA44EA45EA46EA47EA48EA49EA4AEA4BEA4CEA4DEA4EEA4FEA50EA51EA52EA53EA54EA55EA56EA57EA58EA59EA5AEA5BC3C5E3C5C9C1E3C6EA5CB1D5CECAB4B3C8F2E3C7CFD0E3C8BCE4E3C9E3CAC3C6D5A2C4D6B9EBCEC5E3CBC3F6E3CCEA5DB7A7B8F3BAD2E3CDE3CED4C4E3CFEA5EE3D0D1CBE3D1E3D2E3D3E3D4D1D6E3D5B2FBC0BBE3D6EA5FC0ABE3D7E3D8E3D9EA60E3DAE3DBEA61B8B7DAE2EA62B6D3EA63DAE4DAE3EA64EA65EA66EA67EA68EA69EA6ADAE6EA6BEA6CEA6DC8EEEA6EEA6FDAE5B7C0D1F4D2F5D5F3BDD7EA70EA71EA72EA73D7E8DAE8DAE7EA74B0A2CDD3EA75DAE9EA76B8BDBCCAC2BDC2A4B3C2DAEAEA77C2AAC4B0BDB5EA78EA79CFDEEA7AEA7BEA7CDAEBC9C2EA7DEA7EEA80EA81EA82B1DDEA83EA84EA85DAECEA86B6B8D4BAEA87B3FDEA88EA89DAEDD4C9CFD5C5E3EA8ADAEEEA8BEA8CEA8DEA8EEA8FDAEFEA90DAF0C1EACCD5CFDDEA91EA92EA93EA94EA95EA96EA97EA98EA99EA9AEA9BEA9CEA9DD3E7C2A1EA9EDAF1EA9FEAA0CBE5EB40DAF2EB41CBE6D2FEEB42EB43EB44B8F4EB45EB46DAF3B0AFCFB6EB47EB48D5CFEB49EB4AEB4BEB4CEB4DEB4EEB4FEB50EB51EB52CBEDEB53EB54EB55EB56EB57EB58EB59EB5ADAF4EB5BEB5CE3C4EB5DEB5EC1A5EB5FEB60F6BFEB61EB62F6C0F6C1C4D1EB63C8B8D1E3EB64EB65D0DBD1C5BCAFB9CDEB66EFF4EB67EB68B4C6D3BAF6C2B3FBEB69EB6AF6C3EB6BEB6CB5F1EB6DEB6EEB6FEB70EB71EB72EB73EB74EB75EB76F6C5EB77EB78EB79EB7AEB7BEB7CEB7DD3EAF6A7D1A9EB7EEB80EB81EB82F6A9EB83EB84EB85F6A8EB86EB87C1E3C0D7EB88B1A2EB89EB8AEB8BEB8CCEEDEB8DD0E8F6ABEB8EEB8FCFF6EB90F6AAD5F0F6ACC3B9EB91EB92EB93BBF4F6AEF6ADEB94EB95EB96C4DEEB97EB98C1D8EB99EB9AEB9BEB9CEB9DCBAAEB9ECFBCEB9FEBA0EC40EC41EC42EC43EC44EC45EC46EC47EC48F6AFEC49EC4AF6B0EC4BEC4CF6B1EC4DC2B6EC4EEC4FEC50EC51EC52B0D4C5F9EC53EC54EC55EC56F6B2EC57EC58EC59EC5AEC5BEC5CEC5DEC5EEC5FEC60EC61EC62EC63EC64EC65EC66EC67EC68EC69C7E0F6A6EC6AEC6BBEB8EC6CEC6DBEB2EC6EB5E5EC6FEC70B7C7EC71BFBFC3D2C3E6EC72EC73D8CCEC74EC75EC76B8EFEC77EC78EC79EC7AEC7BEC7CEC7DEC7EEC80BDF9D1A5EC81B0D0EC82EC83EC84EC85EC86F7B0EC87EC88EC89EC8AEC8BEC8CEC8DEC8EF7B1EC8FEC90EC91EC92EC93D0ACEC94B0B0EC95EC96EC97F7B2F7B3EC98F7B4EC99EC9AEC9BC7CAEC9CEC9DEC9EEC9FECA0ED40ED41BECFED42ED43F7B7ED44ED45ED46ED47ED48ED49ED4AF7B6ED4BB1DEED4CF7B5ED4DED4EF7B8ED4FF7B9ED50ED51ED52ED53ED54ED55ED56ED57ED58ED59ED5AED5BED5CED5DED5EED5FED60ED61ED62ED63ED64ED65ED66ED67ED68ED69ED6AED6BED6CED6DED6EED6FED70ED71ED72ED73ED74ED75ED76ED77ED78ED79ED7AED7BED7CED7DED7EED80ED81CEA4C8CDED82BAABE8B8E8B9E8BABEC2ED83ED84ED85ED86ED87D2F4ED88D4CFC9D8ED89ED8AED8BED8CED8DED8EED8FED90ED91ED92ED93ED94ED95ED96ED97ED98ED99ED9AED9BED9CED9DED9EED9FEDA0EE40EE41EE42EE43EE44EE45EE46EE47EE48EE49EE4AEE4BEE4CEE4DEE4EEE4FEE50EE51EE52EE53EE54EE55EE56EE57EE58EE59EE5AEE5BEE5CEE5DEE5EEE5FEE60EE61EE62EE63EE64EE65EE66EE67EE68EE69EE6AEE6BEE6CEE6DEE6EEE6FEE70EE71EE72EE73EE74EE75EE76EE77EE78EE79EE7AEE7BEE7CEE7DEE7EEE80EE81EE82EE83EE84EE85EE86EE87EE88EE89EE8AEE8BEE8CEE8DEE8EEE8FEE90EE91EE92EE93EE94EE95EE96EE97EE98EE99EE9AEE9BEE9CEE9DEE9EEE9FEEA0EF40EF41EF42EF43EF44EF45D2B3B6A5C7EAF1FCCFEECBB3D0EBE7EFCDE7B9CBB6D9F1FDB0E4CBCCF1FED4A4C2ADC1ECC6C4BEB1F2A1BCD5EF46F2A2F2A3EF47F2A4D2C3C6B5EF48CDC7F2A5EF49D3B1BFC5CCE2EF4AF2A6F2A7D1D5B6EEF2A8F2A9B5DFF2AAF2ABEF4BB2FCF2ACF2ADC8A7EF4CEF4DEF4EEF4FEF50EF51EF52EF53EF54EF55EF56EF57EF58EF59EF5AEF5BEF5CEF5DEF5EEF5FEF60EF61EF62EF63EF64EF65EF66EF67EF68EF69EF6AEF6BEF6CEF6DEF6EEF6FEF70EF71B7E7EF72EF73ECA9ECAAECABEF74ECACEF75EF76C6AEECADECAEEF77EF78EF79B7C9CAB3EF7AEF7BEF7CEF7DEF7EEF80EF81E2B8F7CFEF82EF83EF84EF85EF86EF87EF88EF89EF8AEF8BEF8CEF8DEF8EEF8FEF90EF91EF92EF93EF94EF95EF96EF97EF98EF99EF9AEF9BEF9CEF9DEF9EEF9FEFA0F040F041F042F043F044F7D0F045F046B2CDF047F048F049F04AF04BF04CF04DF04EF04FF050F051F052F053F054F055F056F057F058F059F05AF05BF05CF05DF05EF05FF060F061F062F063F7D1F064F065F066F067F068F069F06AF06BF06CF06DF06EF06FF070F071F072F073F074F075F076F077F078F079F07AF07BF07CF07DF07EF080F081F082F083F084F085F086F087F088F089F7D3F7D2F08AF08BF08CF08DF08EF08FF090F091F092F093F094F095F096E2BBF097BCA2F098E2BCE2BDE2BEE2BFE2C0E2C1B7B9D2FBBDA4CACEB1A5CBC7F099E2C2B6FCC8C4E2C3F09AF09BBDC8F09CB1FDE2C4F09DB6F6E2C5C4D9F09EF09FE2C6CFDAB9DDE2C7C0A1F0A0E2C8B2F6F140E2C9F141C1F3E2CAE2CBC2F8E2CCE2CDE2CECAD7D8B8D9E5CFE3F142F143F144F145F146F147F148F149F14AF14BF14CF0A5F14DF14EDCB0F14FF150F151F152F153F154F155F156F157F158F159F15AF15BF15CF15DF15EF15FF160F161F162F163F164F165F166F167F168F169F16AF16BF16CF16DF16EF16FF170F171F172F173F174F175F176F177F178F179F17AF17BF17CF17DF17EF180F181F182F183F184F185F186F187F188F189F18AF18BF18CF18DF18EF18FF190F191F192F193F194F195F196F197F198F199F19AF19BF19CF19DF19EF19FF1A0F240F241F242F243F244F245F246F247F248F249F24AF24BF24CF24DF24EF24FF250F251F252F253F254F255F256F257F258F259F25AF25BF25CF25DF25EF25FF260F261F262F263F264F265F266F267F268F269F26AF26BF26CF26DF26EF26FF270F271F272F273F274F275F276F277F278F279F27AF27BF27CF27DF27EF280F281F282F283F284F285F286F287F288F289F28AF28BF28CF28DF28EF28FF290F291F292F293F294F295F296F297F298F299F29AF29BF29CF29DF29EF29FF2A0F340F341F342F343F344F345F346F347F348F349F34AF34BF34CF34DF34EF34FF350F351C2EDD4A6CDD4D1B1B3DBC7FDF352B2B5C2BFE6E0CABBE6E1E6E2BED4E6E3D7A4CDD5E6E5BCDDE6E4E6E6E6E7C2EEF353BDBEE6E8C2E6BAA7E6E9F354E6EAB3D2D1E9F355F356BFA5E6EBC6EFE6ECE6EDF357F358E6EEC6ADE6EFF359C9A7E6F0E6F1E6F2E5B9E6F3E6F4C2E2E6F5E6F6D6E8E6F7F35AE6F8B9C7F35BF35CF35DF35EF35FF360F361F7BBF7BAF362F363F364F365F7BEF7BCBAA1F366F7BFF367F7C0F368F369F36AF7C2F7C1F7C4F36BF36CF7C3F36DF36EF36FF370F371F7C5F7C6F372F373F374F375F7C7F376CBE8F377F378F379F37AB8DFF37BF37CF37DF37EF380F381F7D4F382F7D5F383F384F385F386F7D6F387F388F389F38AF7D8F38BF7DAF38CF7D7F38DF38EF38FF390F391F392F393F394F395F7DBF396F7D9F397F398F399F39AF39BF39CF39DD7D7F39EF39FF3A0F440F7DCF441F442F443F444F445F446F7DDF447F448F449F7DEF44AF44BF44CF44DF44EF44FF450F451F452F453F454F7DFF455F456F457F7E0F458F459F45AF45BF45CF45DF45EF45FF460F461F462DBCBF463F464D8AAF465F466F467F468F469F46AF46BF46CE5F7B9EDF46DF46EF46FF470BFFDBBEAF7C9C6C7F7C8F471F7CAF7CCF7CBF472F473F474F7CDF475CEBAF476F7CEF477F478C4A7F479F47AF47BF47CF47DF47EF480F481F482F483F484F485F486F487F488F489F48AF48BF48CF48DF48EF48FF490F491F492F493F494F495F496F497F498F499F49AF49BF49CF49DF49EF49FF4A0F540F541F542F543F544F545F546F547F548F549F54AF54BF54CF54DF54EF54FF550F551F552F553F554F555F556F557F558F559F55AF55BF55CF55DF55EF55FF560F561F562F563F564F565F566F567F568F569F56AF56BF56CF56DF56EF56FF570F571F572F573F574F575F576F577F578F579F57AF57BF57CF57DF57EF580F581F582F583F584F585F586F587F588F589F58AF58BF58CF58DF58EF58FF590F591F592F593F594F595F596F597F598F599F59AF59BF59CF59DF59EF59FF5A0F640F641F642F643F644F645F646F647F648F649F64AF64BF64CF64DF64EF64FF650F651F652F653F654F655F656F657F658F659F65AF65BF65CF65DF65EF65FF660F661F662F663F664F665F666F667F668F669F66AF66BF66CF66DF66EF66FF670F671F672F673F674F675F676F677F678F679F67AF67BF67CF67DF67EF680F681F682F683F684F685F686F687F688F689F68AF68BF68CF68DF68EF68FF690F691F692F693F694F695F696F697F698F699F69AF69BF69CF69DF69EF69FF6A0F740F741F742F743F744F745F746F747F748F749F74AF74BF74CF74DF74EF74FF750F751F752F753F754F755F756F757F758F759F75AF75BF75CF75DF75EF75FF760F761F762F763F764F765F766F767F768F769F76AF76BF76CF76DF76EF76FF770F771F772F773F774F775F776F777F778F779F77AF77BF77CF77DF77EF780D3E3F781F782F6CFF783C2B3F6D0F784F785F6D1F6D2F6D3F6D4F786F787F6D6F788B1ABF6D7F789F6D8F6D9F6DAF78AF6DBF6DCF78BF78CF78DF78EF6DDF6DECFCAF78FF6DFF6E0F6E1F6E2F6E3F6E4C0F0F6E5F6E6F6E7F6E8F6E9F790F6EAF791F6EBF6ECF792F6EDF6EEF6EFF6F0F6F1F6F2F6F3F6F4BEA8F793F6F5F6F6F6F7F6F8F794F795F796F797F798C8FAF6F9F6FAF6FBF6FCF799F79AF6FDF6FEF7A1F7A2F7A3F7A4F7A5F79BF79CF7A6F7A7F7A8B1EEF7A9F7AAF7ABF79DF79EF7ACF7ADC1DBF7AEF79FF7A0F7AFF840F841F842F843F844F845F846F847F848F849F84AF84BF84CF84DF84EF84FF850F851F852F853F854F855F856F857F858F859F85AF85BF85CF85DF85EF85FF860F861F862F863F864F865F866F867F868F869F86AF86BF86CF86DF86EF86FF870F871F872F873F874F875F876F877F878F879F87AF87BF87CF87DF87EF880F881F882F883F884F885F886F887F888F889F88AF88BF88CF88DF88EF88FF890F891F892F893F894F895F896F897F898F899F89AF89BF89CF89DF89EF89FF8A0F940F941F942F943F944F945F946F947F948F949F94AF94BF94CF94DF94EF94FF950F951F952F953F954F955F956F957F958F959F95AF95BF95CF95DF95EF95FF960F961F962F963F964F965F966F967F968F969F96AF96BF96CF96DF96EF96FF970F971F972F973F974F975F976F977F978F979F97AF97BF97CF97DF97EF980F981F982F983F984F985F986F987F988F989F98AF98BF98CF98DF98EF98FF990F991F992F993F994F995F996F997F998F999F99AF99BF99CF99DF99EF99FF9A0FA40FA41FA42FA43FA44FA45FA46FA47FA48FA49FA4AFA4BFA4CFA4DFA4EFA4FFA50FA51FA52FA53FA54FA55FA56FA57FA58FA59FA5AFA5BFA5CFA5DFA5EFA5FFA60FA61FA62FA63FA64FA65FA66FA67FA68FA69FA6AFA6BFA6CFA6DFA6EFA6FFA70FA71FA72FA73FA74FA75FA76FA77FA78FA79FA7AFA7BFA7CFA7DFA7EFA80FA81FA82FA83FA84FA85FA86FA87FA88FA89FA8AFA8BFA8CFA8DFA8EFA8FFA90FA91FA92FA93FA94FA95FA96FA97FA98FA99FA9AFA9BFA9CFA9DFA9EFA9FFAA0FB40FB41FB42FB43FB44FB45FB46FB47FB48FB49FB4AFB4BFB4CFB4DFB4EFB4FFB50FB51FB52FB53FB54FB55FB56FB57FB58FB59FB5AFB5BC4F1F0AFBCA6F0B0C3F9FB5CC5B8D1BBFB5DF0B1F0B2F0B3F0B4F0B5D1BCFB5ED1ECFB5FF0B7F0B6D4A7FB60CDD2F0B8F0BAF0B9F0BBF0BCFB61FB62B8EBF0BDBAE8FB63F0BEF0BFBEE9F0C0B6ECF0C1F0C2F0C3F0C4C8B5F0C5F0C6FB64F0C7C5F4FB65F0C8FB66FB67FB68F0C9FB69F0CAF7BDFB6AF0CBF0CCF0CDFB6BF0CEFB6CFB6DFB6EFB6FF0CFBAD7FB70F0D0F0D1F0D2F0D3F0D4F0D5F0D6F0D8FB71FB72D3A5F0D7FB73F0D9FB74FB75FB76FB77FB78FB79FB7AFB7BFB7CFB7DF5BAC2B9FB7EFB80F7E4FB81FB82FB83FB84F7E5F7E6FB85FB86F7E7FB87FB88FB89FB8AFB8BFB8CF7E8C2B4FB8DFB8EFB8FFB90FB91FB92FB93FB94FB95F7EAFB96F7EBFB97FB98FB99FB9AFB9BFB9CC2F3FB9DFB9EFB9FFBA0FC40FC41FC42FC43FC44FC45FC46FC47FC48F4F0FC49FC4AFC4BF4EFFC4CFC4DC2E9FC4EF7E1F7E2FC4FFC50FC51FC52FC53BBC6FC54FC55FC56FC57D9E4FC58FC59FC5ACAF2C0E8F0A4FC5BBADAFC5CFC5DC7ADFC5EFC5FFC60C4ACFC61FC62F7ECF7EDF7EEFC63F7F0F7EFFC64F7F1FC65FC66F7F4FC67F7F3FC68F7F2F7F5FC69FC6AFC6BFC6CF7F6FC6DFC6EFC6FFC70FC71FC72FC73FC74FC75EDE9FC76EDEAEDEBFC77F6BCFC78FC79FC7AFC7BFC7CFC7DFC7EFC80FC81FC82FC83FC84F6BDFC85F6BEB6A6FC86D8BEFC87FC88B9C4FC89FC8AFC8BD8BBFC8CDCB1FC8DFC8EFC8FFC90FC91FC92CAF3FC93F7F7FC94FC95FC96FC97FC98FC99FC9AFC9BFC9CF7F8FC9DFC9EF7F9FC9FFCA0FD40FD41FD42FD43FD44F7FBFD45F7FAFD46B1C7FD47F7FCF7FDFD48FD49FD4AFD4BFD4CF7FEFD4DFD4EFD4FFD50FD51FD52FD53FD54FD55FD56FD57C6EBECB4FD58FD59FD5AFD5BFD5CFD5DFD5EFD5FFD60FD61FD62FD63FD64FD65FD66FD67FD68FD69FD6AFD6BFD6CFD6DFD6EFD6FFD70FD71FD72FD73FD74FD75FD76FD77FD78FD79FD7AFD7BFD7CFD7DFD7EFD80FD81FD82FD83FD84FD85B3DDF6B3FD86FD87F6B4C1E4F6B5F6B6F6B7F6B8F6B9F6BAC8A3F6BBFD88FD89FD8AFD8BFD8CFD8DFD8EFD8FFD90FD91FD92FD93C1FAB9A8EDE8FD94FD95FD96B9EAD9DFFD97FD98FD99FD9AFD9'; + + for (var i = 0; i < str.length; i++) { + var c = str.charAt(i), + code = str.charCodeAt(i); + if (c == " ") strOut += "+"; + else if (code >= 19968 && code <= 40869) { + var index = code - 19968; + strOut += "%" + z.substr(index * 4, 2) + "%" + z.substr(index * 4 + 2, 2); + } else { + strOut += "%" + str.charCodeAt(i).toString(16); + } + } + return strOut; + }, + /* 改变图片大小 */ + scale: function (img, w, h) { + var ow = img.width, + oh = img.height; + + if (ow >= oh) { + img.width = w * ow / oh; + img.height = h; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w; + img.height = h * oh / ow; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + }, + getImageData: function () { + var _this = this, + key = $G('searchTxt').value, + type = $G('searchType').value, + keepOriginName = editor.options.keepOriginName ? "1" : "0", + url = "http://image.baidu.com/i?ct=201326592&cl=2&lm=-1&st=-1&tn=baiduimagejson&istype=2&rn=32&fm=index&pv=&word=" + _this.encodeToGb2312(key) + type + "&keeporiginname=" + keepOriginName + "&" + +new Date; + + $G('searchListUl').innerHTML = lang.searchLoading; + ajax.request(url, { + 'dataType': 'jsonp', + 'charset': 'GB18030', + 'onsuccess': function (json) { + var list = []; + if (json && json.data) { + for (var i = 0; i < json.data.length; i++) { + if (json.data[i].objURL) { + list.push({ + title: json.data[i].fromPageTitleEnc, + src: json.data[i].objURL, + url: json.data[i].fromURL + }); + } + } + } + _this.setList(list); + }, + 'onerror': function () { + $G('searchListUl').innerHTML = lang.searchRetry; + } + }); + }, + /* 添加图片到列表界面上 */ + setList: function (list) { + var i, item, p, img, link, _this = this, + listUl = $G('searchListUl'); + + listUl.innerHTML = ''; + if (list.length) { + for (i = 0; i < list.length; i++) { + item = document.createElement('li'); + p = document.createElement('p'); + img = document.createElement('img'); + link = document.createElement('a'); + + img.onload = function () { + _this.scale(this, 113, 113); + }; + img.width = 113; + img.setAttribute('src', list[i].src); + + link.href = list[i].url; + link.target = '_blank'; + link.title = list[i].title; + link.innerHTML = list[i].title; + + p.appendChild(img); + item.appendChild(p); + item.appendChild(link); + listUl.appendChild(item); + } + } else { + listUl.innerHTML = lang.searchRetry; + } + }, + getInsertList: function () { + var child, + src, + align = getAlign(), + list = [], + items = $G('searchListUl').children; + for (var i = 0; i < items.length; i++) { + child = items[i].firstChild && items[i].firstChild.firstChild; + if (child.tagName && child.tagName.toLowerCase() == 'img' && domUtils.hasClass(items[i], 'selected')) { + src = child.src; + list.push({ + src: src, + _src: src, + alt: src.substr(src.lastIndexOf('/') + 1), + floatStyle: align + }); + } + } + return list; + } + }; + +})(); diff --git a/admin/dialogs/image/images/alignicon.jpg b/admin/dialogs/image/images/alignicon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..754755b1b6e2b37d6090f68b80e91867fdcf1042 GIT binary patch literal 16101 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 literal 0 HcmV?d00001 diff --git a/admin/dialogs/image/images/bg.png b/admin/dialogs/image/images/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..580be0a01dff4c70c72f78a3f40186660ee8eee0 GIT binary patch literal 2810 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 literal 0 HcmV?d00001 diff --git a/admin/dialogs/image/images/icons.png b/admin/dialogs/image/images/icons.png new file mode 100644 index 0000000000000000000000000000000000000000..12e4700163ac87fa38ae3d92a2c39d0fb4690fed GIT binary patch literal 2678 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 literal 0 HcmV?d00001 diff --git a/admin/dialogs/image/images/progress.png b/admin/dialogs/image/images/progress.png new file mode 100644 index 0000000000000000000000000000000000000000..717c4865c90a959c6a0e9ad1af9c777d900a2e9c GIT binary patch literal 1269 zcmeAS@N?(olHy`uVBq!ia0vp^f8U}fi7AzZCsS=07??9MLn2Bde0{8v^Kf6`()~Xj@TAnpKdC8`Lf!&sHg;q@=(~U%$M( zT(8_%FTW^V-_X+15@d#vkuFe$ZgFK^Nn(X=Ua>OF1ees}t-3#_`hBq$Z(46Le)Ln;eW^@CE2 z^Gl18f$@>14ATq@JNy=b6armi>cVAJd5X6R;MWawh(V&G(G=xXffXz1o@ zX=ZL{;B08&Z0-!x>zP+vl9-pA3bQv8XfIT+GhV$`&PAz-CHX}m`T04p6cCV+Uy@&( zkzb(T9Bihb;hUJ8nFkWk1Vs?Uzb>gonPsUdZbkXI3g8g7%EaOV0~10%hv-cqC)D(T zj?o7t52WM*69T3|5EGvGfgE`DNzDW1nId53*cQ_-&cMK^?CIhdQgN$ga=rIq1A(^5 zYKwg&`wo`WvF`u>{iFU|`!+wz>b#B?t8F4hxRm$~lz-tTH#6E8xZnKlv%`YRwvA{oKseqmK8(Gfx|> z#)dT+Zy!CGH{+89Q&m{rC!PyyIjq?Y9m+ziHPqr6qxfF`+2Qt=-KQ=fE8_j%1#Y2} z>NffN)P;AQIhrE)QQzeqbFS^A8(M1XGuQqTO<=fcH+M~2lzlL$Ao6teb6Mw<&;$U? C61Fb@ literal 0 HcmV?d00001 diff --git a/admin/dialogs/image/images/success.gif b/admin/dialogs/image/images/success.gif new file mode 100644 index 0000000000000000000000000000000000000000..8d4f3112b9d1df2147ed3b67d9736163dedd11e1 GIT binary patch literal 445 zcmZ?wbhEHb)L_tHxXJ(m|NsC0{`>#WKmY&!`~ULm|4%>v3rzVXIOUh{)L$ageu+>2 zB{Acd%*pZwE#>TlQSztb-KopJH+%!_|l-~7Ag*59?a z{_c7B@6_{ur(gU#_wwKE_y6vG`1j=VzZYNsfBgCX$DjXizW@L859r4KV8@~pia%Kx z85k@WbU+dyKQXY~a+p)#p(E9QVoA}-BeJtDJbfs+R&065YSGzOop#2q7tzUUTK@E- z1Qpqe*fm*b*T-Fam_8!ZPiJg?eRTb9ku+5;xVnw>Wr$>Ce}(b zvq{bgY~#~oR8Cparp&0%zbdUw!o*Z6ds70hP&$teqekA&7*16-748@%Mnl0vSqU6+ zOpICr!NSHY@7SLk+rBLP3&#jWP!Xxbb jiN%_{Rv%uKKTTNF#>acL^G5)OtDBg<-IWs>91PX~W`xy? literal 0 HcmV?d00001 diff --git a/admin/dialogs/image/images/success.png b/admin/dialogs/image/images/success.png new file mode 100644 index 0000000000000000000000000000000000000000..94f968dc8fd3c7ca8f6cb599d006ef3f23b62c7d GIT binary patch literal 1621 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m{l@EB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMwS&*t9 zlvO-#?>2=9ZF3nBND}m`vLFhHXsTY(OatnYqyQCInmZhe+73JqDfIV%MiQ6rPIL(9V zO~LIJBb<8mfsWA!MJ-ZP!-Rn82gHOYTp$OY^i%VI>AeV;u(vXbonl~MI_~M>7*cWT z%njcRVMh`65C6~Q2yI{K`NBQQh9heAinXE1(JfB=Ul%M;Ke#x6g%L8^f5l4Te zj&BcK1znDIyZS2~eC7F3K+}tVTa$=u*HTU0W4>0#`+Qf%|GkyBERBs#$Y}P@k7@U2 zd#*XsYr~WGeCA1uSK>2HTD)g9mP}Xrpg$+`K&8dx2JS~bjCx(hj5}1;-8qn2_>|?> zp{d+2q{I0hbQS!U-jOut`kSEi+IhQJGmBl4O%se*W?OGKZ0Mp?XmGnRgezL^8vCJ4 z#-ek9(R&%4!h+;oXA~Mtbyie=u#0PDiI#!iX`%2?^@kRL8ma*r6?+*}W4e|_8~J&& z+-+*Ub3{dDcAIF|!MTDz0#78qKYeaeVU$wDOOs3cR=e5FZ*O2e-6xc{Uu=$;!s>*M z>nZ|V>zUp8-oE6^wXjV+_UOvuE&SORr`;3hnBKu~e3rzlY@NRjD|5Ui2t>^@Ve7jy z)2vT>u1vesjJgG`f;l_n`FmbR~b^~{VzXB}7CdU_pt>lO9l=E;X#4<2bZu32r~J^e^%TSISQ_Qm$= z7d{rOo2%^RUGseJkpn9(MWszUQdl(i&RN5PBgZ0d#S7ZipShU3W`>Nsy6C#pCD*KW zyxHW%b?m|pr;dF;L$saa#oaeO`u=>jkXTjl9*cLEvOD!Jdr4ooKJW9gY7?D{e?uM^ z`_}E4`0yR0boA=9>3>WXzUH{&pDfpZ;_2xb=j*pKsk#WyD%J#5t{1#azeB z4SJq8H2*dJVX$xugZHVh{7U`u4@oM|quz5j-hRJi{qwh1k5uNqu`W>3HJG&Y^R}6R z$Gq-HPue$sd${oT*XKO8zN>Oe_%K^bZNm3^-vf7@5X# + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + +
    + px +
    px +
    + +
    +
    + + + \ No newline at end of file diff --git a/admin/dialogs/internal.js b/admin/dialogs/internal.js new file mode 100644 index 0000000..e1eec2c --- /dev/null +++ b/admin/dialogs/internal.js @@ -0,0 +1,81 @@ +(function () { + var parent = window.parent; + //dialog对象 + dialog = parent.$EDITORUI[window.frameElement.id.replace(/_iframe$/, '')]; + //当前打开dialog的编辑器实例 + editor = dialog.editor; + + UE = parent.UE; + + domUtils = UE.dom.domUtils; + + utils = UE.utils; + + browser = UE.browser; + + ajax = UE.ajax; + + $G = function (id) { + return document.getElementById(id) + }; + //focus元素 + $focus = function (node) { + setTimeout(function () { + if (browser.ie) { + var r = node.createTextRange(); + r.collapse(false); + r.select(); + } else { + node.focus() + } + }, 0) + }; + utils.loadFile(document, { + href: editor.options.themePath + editor.options.theme + "/dialogbase.css?cache=" + Math.random(), + tag: "link", + type: "text/css", + rel: "stylesheet" + }); + lang = editor.getLang(dialog.className.split("-")[2]); + if (lang) { + domUtils.on(window, 'load', function () { + + var langImgPath = editor.options.langPath + editor.options.lang + "/images/"; + //针对静态资源 + for (var i in lang["static"]) { + var dom = $G(i); + if (!dom) continue; + var tagName = dom.tagName, + content = lang["static"][i]; + if (content.src) { + //clone + content = utils.extend({}, content, false); + content.src = langImgPath + content.src; + } + if (content.style) { + content = utils.extend({}, content, false); + content.style = content.style.replace(/url\s*\(/g, "url(" + langImgPath) + } + switch (tagName.toLowerCase()) { + case "var": + dom.parentNode.replaceChild(document.createTextNode(content), dom); + break; + case "select": + var ops = dom.options; + for (var j = 0, oj; oj = ops[j];) { + oj.innerHTML = content.options[j++]; + } + for (var p in content) { + p != "options" && dom.setAttribute(p, content[p]); + } + break; + default : + domUtils.setAttributes(dom, content); + } + } + }); + } + + +})(); + diff --git a/admin/dialogs/link/link.html b/admin/dialogs/link/link.html new file mode 100644 index 0000000..948d660 --- /dev/null +++ b/admin/dialogs/link/link.html @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + diff --git a/admin/dialogs/map/map.html b/admin/dialogs/map/map.html new file mode 100644 index 0000000..bd65fa6 --- /dev/null +++ b/admin/dialogs/map/map.html @@ -0,0 +1,170 @@ + + + + + + + + + + +
    + + + + + + + + + +
    ::
    +
    + +
    + + + + + diff --git a/admin/dialogs/map/show.html b/admin/dialogs/map/show.html new file mode 100644 index 0000000..4b692af --- /dev/null +++ b/admin/dialogs/map/show.html @@ -0,0 +1,116 @@ + + + + + + + 百度地图API自定义地图 + + + + + + + +
    + + + \ No newline at end of file diff --git a/admin/dialogs/music/music.css b/admin/dialogs/music/music.css new file mode 100644 index 0000000..b77e056 --- /dev/null +++ b/admin/dialogs/music/music.css @@ -0,0 +1,146 @@ +.wrapper { + margin: 5px 10px; +} + +.searchBar { + height: 30px; + padding: 7px 0 3px; + text-align: center; +} + +.searchBtn { + font-size: 13px; + height: 24px; +} + +.resultBar { + width: 460px; + margin: 5px auto; + border: 1px solid #CCC; + border-radius: 5px; + box-shadow: 2px 2px 5px #D3D6DA; + overflow: hidden; +} + +.listPanel { + overflow: hidden; +} + +.panelon { + display: block; +} + +.paneloff { + display: none +} + +.page { + width: 220px; + margin: 20px auto; + overflow: hidden; +} + +.pageon { + float: right; + width: 24px; + line-height: 24px; + height: 24px; + margin-right: 5px; + background: none; + border: none; + color: #000; + font-weight: bold; + text-align: center +} + +.pageoff { + float: right; + width: 24px; + line-height: 24px; + height: 24px; + cursor: pointer; + background-color: #fff; + border: 1px solid #E7ECF0; + color: #2D64B3; + margin-right: 5px; + text-decoration: none; + text-align: center; +} + +.m-box { + width: 460px; +} + +.m-m { + float: left; + line-height: 20px; + height: 20px; +} + +.m-h { + height: 24px; + line-height: 24px; + padding-left: 46px; + background-color: #FAFAFA; + border-bottom: 1px solid #DAD8D8; + font-weight: bold; + font-size: 12px; + color: #333; +} + +.m-l { + float: left; + width: 40px; +} + +.m-t { + float: left; + width: 140px; +} + +.m-s { + float: left; + width: 110px; +} + +.m-z { + float: left; + width: 100px; +} + +.m-try-t { + float: left; + width: 60px;; +} + +.m-try { + float: left; + width: 20px; + height: 20px; + background: url('http://static.tieba.baidu.com/tb/editor/images/try_music.gif') no-repeat; +} + +.m-trying { + float: left; + width: 20px; + height: 20px; + background: url('http://static.tieba.baidu.com/tb/editor/images/stop_music.gif') no-repeat; +} + +.loading { + width: 95px; + height: 7px; + font-size: 7px; + margin: 60px auto; + background: url(http://static.tieba.baidu.com/tb/editor/images/loading.gif) no-repeat +} + +.empty { + width: 300px; + height: 40px; + padding: 2px; + margin: 50px auto; + line-height: 40px; + color: #006699; + text-align: center; +} \ No newline at end of file diff --git a/admin/dialogs/music/music.html b/admin/dialogs/music/music.html new file mode 100644 index 0000000..e7ef04f --- /dev/null +++ b/admin/dialogs/music/music.html @@ -0,0 +1,32 @@ + + + + + 插入音乐 + + + + +
    + +
    + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/admin/dialogs/music/music.js b/admin/dialogs/music/music.js new file mode 100644 index 0000000..d43121b --- /dev/null +++ b/admin/dialogs/music/music.js @@ -0,0 +1,193 @@ +function Music() { + this.init(); +} + +(function () { + var pages = [], + panels = [], + selectedItem = null; + Music.prototype = { + total: 70, + pageSize: 10, + dataUrl: "http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.search.common", + playerUrl: "http://box.baidu.com/widget/flash/bdspacesong.swf", + + init: function () { + var me = this; + domUtils.on($G("J_searchName"), "keyup", function (event) { + var e = window.event || event; + if (e.keyCode == 13) { + me.dosearch(); + } + }); + domUtils.on($G("J_searchBtn"), "click", function () { + me.dosearch(); + }); + }, + callback: function (data) { + var me = this; + me.data = data.song_list; + setTimeout(function () { + $G('J_resultBar').innerHTML = me._renderTemplate(data.song_list); + }, 300); + }, + dosearch: function () { + var me = this; + selectedItem = null; + var key = $G('J_searchName').value; + if (utils.trim(key) == "") return false; + key = encodeURIComponent(key); + me._sent(key); + }, + doselect: function (i) { + var me = this; + if (typeof i == 'object') { + selectedItem = i; + } else if (typeof i == 'number') { + selectedItem = me.data[i]; + } + }, + onpageclick: function (id) { + var me = this; + for (var i = 0; i < pages.length; i++) { + $G(pages[i]).className = 'pageoff'; + $G(panels[i]).className = 'paneloff'; + } + $G('page' + id).className = 'pageon'; + $G('panel' + id).className = 'panelon'; + }, + listenTest: function (elem) { + var me = this, + view = $G('J_preview'), + is_play_action = (elem.className == 'm-try'), + old_trying = me._getTryingElem(); + + if (old_trying) { + old_trying.className = 'm-try'; + view.innerHTML = ''; + } + if (is_play_action) { + elem.className = 'm-trying'; + view.innerHTML = me._buildMusicHtml(me._getUrl(true)); + } + }, + _sent: function (param) { + var me = this; + $G('J_resultBar').innerHTML = '
    '; + + utils.loadFile(document, { + src: me.dataUrl + '&query=' + param + '&page_size=' + me.total + '&callback=music.callback&.r=' + Math.random(), + tag: "script", + type: "text/javascript", + defer: "defer" + }); + }, + _removeHtml: function (str) { + var reg = /<\s*\/?\s*[^>]*\s*>/gi; + return str.replace(reg, ""); + }, + _getUrl: function (isTryListen) { + var me = this; + var param = 'from=tiebasongwidget&url=&name=' + encodeURIComponent(me._removeHtml(selectedItem.title)) + '&artist=' + + encodeURIComponent(me._removeHtml(selectedItem.author)) + '&extra=' + + encodeURIComponent(me._removeHtml(selectedItem.album_title)) + + '&autoPlay=' + isTryListen + '' + '&loop=true'; + return me.playerUrl + "?" + param; + }, + _getTryingElem: function () { + var s = $G('J_listPanel').getElementsByTagName('span'); + + for (var i = 0; i < s.length; i++) { + if (s[i].className == 'm-trying') + return s[i]; + } + return null; + }, + _buildMusicHtml: function (playerUrl) { + var html = ' 12) + return s.substring(0, 5) + '...'; + if (!s) s = " "; + return s; + }, + _rebuildData: function (data) { + var me = this, + newData = [], + d = me.pageSize, + itembox; + for (var i = 0; i < data.length; i++) { + if ((i + d) % d == 0) { + itembox = []; + newData.push(itembox) + } + itembox.push(data[i]); + } + return newData; + }, + _renderTemplate: function (data) { + var me = this; + if (data.length == 0) return '
    ' + lang.emptyTxt + '
    '; + data = me._rebuildData(data); + var s = [], p = [], t = []; + s.push('
    '); + p.push('
    '); + for (var i = 0, tmpList; tmpList = data[i++];) { + panels.push('panel' + i); + pages.push('page' + i); + if (i == 1) { + s.push('
    '); + if (data.length != 1) { + t.push('
    ' + (i) + '
    '); + } + } else { + s.push('
    '); + t.push('
    ' + (i) + '
    '); + } + s.push('
    '); + s.push('
    ' + lang.chapter + '' + lang.singer + + '' + lang.special + '' + lang.listenTest + '
    '); + for (var j = 0, tmpObj; tmpObj = tmpList[j++];) { + s.push(''); + } + s.push('
    '); + s.push('
    '); + } + t.reverse(); + p.push(t.join('')); + s.push('
    '); + p.push('
    '); + return s.join('') + p.join(''); + }, + exec: function () { + var me = this; + if (selectedItem == null) return; + $G('J_preview').innerHTML = ""; + editor.execCommand('music', { + url: me._getUrl(false), + width: 400, + height: 95 + }); + } + }; +})(); + + + diff --git a/admin/dialogs/preview/preview.html b/admin/dialogs/preview/preview.html new file mode 100644 index 0000000..a9dd690 --- /dev/null +++ b/admin/dialogs/preview/preview.html @@ -0,0 +1,45 @@ + + + + + + + + + + +
    + +
    + + + \ No newline at end of file diff --git a/admin/dialogs/scrawl/images/addimg.png b/admin/dialogs/scrawl/images/addimg.png new file mode 100644 index 0000000000000000000000000000000000000000..03a87135bab65fa2633156789ed0f4a906d6c48b GIT binary patch literal 628 zcmV-)0*n2LP)LlfO?CQ4q&JZ};uuDR(Ob))OTXC`@eBz!@zF z+HgV%Hu^952Y4l=g(2n$i9ae63lhXcqYyM9#DWA|@b(rsk9+f;1wl+yj4;&{^Z8EZ zJ2T2T$4NrJSzdPEvg}xJM?R0MBtb zF(d!&V7bvXOyyt%V+_VxCMVl|G4K0L2`GSu4nDMoTw7VvC?4}634OnCk@;@JLnc3FEH3Q_>)m5edixGKIt7FkHcF4 O0000LlRapYQ51%sn|z5A!;eU>8r+{HJr7$}yPjp=Xw4K1Ua#f7iuXvM4a5!@5mnb6Jy5;4f zq^GClVK^)=CMV^$zAd#p)X9w(bjvTJaV6W6Y< zHElN4Fd9h58CQpMwnbCF0&&|nt--a91jfSjz&XY;RG1F=2?rH8AKl0($O&qx#;_=`eAIGPkrEiZ*t@m5rL2F^2%$?h~iba07-RvG6!+$Z#-hF)* z*wUa-u1NavBOIv|-+OxK963tx@)g|sy&J-7BIJt|`BL~qAQEA|QlZmXAv_UdV92*A z3}9Ln#}*y)LEQe`d0jImLzJL!8vd uXg6z^rfGozG)+U(G#m~GPN$P@*OZ@vE+GjWfY&Ji0000Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUzf=NU{R5(w?lReA9Q5c8MckvC3CRr4rWH3k}lHF)Du^B`%h=dG6 zguL4*gWaS^NGOSZ`kg^f{XGLc^_;r8yYF+Z`@GZ<;@`(&vA|?9`3kyXJRalQL01fi zLp&Z2WV6|iphH*mdOh6lcNB}ox0FgHl*{E8%(<2hUD0m0al73R4u_FWr%|m|U({+f zG#U+byIr{(BXid2&=t*Q6W8k%I-L%By=@ zm&*kzl?rOL8d|Lu!C(;4XcW0z4*h-~yWI|l!$HRBbc(@XARW4*QmNo{I>BPGNUT;X zoK7cPE*HFBFG8UZX0sXA>ow-{IbyLG;_u=hIe}(G|5Z=0000LlRs}0K@i1%ySKhz{O1fJ$i!Hn&_fERK@ibd zbP=ieOf+<);v-NHQBXy)C?X|I5W=L1LJA~<17{zJ<9KG5!k{1wk%*@njpn`4doyD~ z2uu@pDm37>c6P$IEISwYQmKSH==W(ZE}o0v_2wonsNzFl`^D^kf$u!}LQutt_h<;j zar~DygE3(2IEO&+5CUiji1#=ZK||o}yDIhi33JuKDcl%rWQp=QqMSoVf(}M_9S>Cz zoT{SUv$l2tmn+e19`WG*;h4Z$Tz-aRexA6TaMJJ5+ucP5L)3dz6(_2Uyk~!Jk0eQW z^|DCs>qV~3L9K47-Y79!zJ;+$TrLymKV!r*@*Yt=mC$IUKuQ!vbUH=4-H3MEa`k$j zhnMqIZzgp1JzK3F1=nNY_D=~Sf_Tr$%FJ)(9slx>D9Y%(@ACbV<1iJj6ctqv?-3E) zNCY1O8yiQHJFtexf@?2R{@BJ?i!}ygEd8hVIIh)jS(Xvyay))=@XwvUSz2QG?!rX< zd8>shILEWq)iaM~SSaveeSM-{Y&0;#;gB>(^b literal 0 HcmV?d00001 diff --git a/admin/dialogs/scrawl/images/empty.png b/admin/dialogs/scrawl/images/empty.png new file mode 100644 index 0000000000000000000000000000000000000000..0375196257ac3c859373b3ebebbabe6f16105587 GIT binary patch literal 519 zcmV+i0{H!jP)Ll09-0Q4oZ`x4R&OpbGFo(29U6rOK6a3v&a7 z_DM+WM6pqhRKi!#4G@N6DKtGpus^URVFFJ&)8BN@dnqD#NM-jmudlA&{11>?2dmYJ zq9_;)28>1{cDr5ttSY|V-7%R=l6xQ-X2x_n?EuB!wC#2qd7hIOIeC_oWf>_YHk(bz zMaX$Q9;cHIE-o(@kBWl9lL2S1&UiW;@}sKQ@Am+B1TJ9`@6XQ{M-IY$At_veyCZkh z2#A0HNw}-$pgZDtT-F2Ob2F>OW^-Ac+hlWdQI_N05jzL&!X;$ZZFh;o!GLIH95bB; zNW$DPvl`UcHyv6%9(DgT!0PRm7pMi8VTV70h}zld2%+{!9YE@DjHv&@KO#8t7UG=) zNe~cC4#|6f?iJh}mm_H@6X8y{FD13$rOa5b*F8Xr2vSNfffuvc>}^?=9}+-HBod@% zcfjrE+jln~Z$1J0i1=~@0GiDNLcJQPqF|2002ov JPDHLkV1nZ!(%Jw3 literal 0 HcmV?d00001 diff --git a/admin/dialogs/scrawl/images/emptyH.png b/admin/dialogs/scrawl/images/emptyH.png new file mode 100644 index 0000000000000000000000000000000000000000..838ca723119499465f29e881a745f4d8a051e22c GIT binary patch literal 657 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2v2cMyUXw5Z8P6?!9~W&Mteod+EB17cYi1ZuhR-c=YJe)QJao zoqKZj)+^_N)hDk%kM7vxU%SOIZ)HU5u5H`4rB6P*;n@A6IVa_d+Vkc6Z`Cb3f9%S$swHPL zrX0?laV)ZJmtD^C)Jcaf-hX@G%JYPteGa)RpT7ON{^-5+yDx<|?_9t8V%D^yUKQ)t z9lf{e;O)TrtuBRYf*Q8PcI>guUcUO!os-vJoWJvW)22-q?!7sF_4&EmuM_+BN4D;= z&slDtz2el37q(f;)*ZQN z=N^Z=m4&lU_*8HD|Np=0=2?Njpo}XC@(TuXX$KfKp3qYR+O*iy#WAGfR#Jy6Gf%)R z4qpdHXJJo=hVYQC!~KV2MYI-VrJh`QUQ;LM&1;6x#M9b~#Ma7WK4-jqNPV%W#5&yr zqHMw)6OH>XB&SZ@(#H8io2zq2%cn~1gDgj6o15p{xKW{#z;wrkO(^fonRSm08Z|^C z74@VuOY>$h1UKwir)j@Gk;A27;=wb==bbzq+_Gcd9- Y9E)+P-Fqc+HPE>Xp00i_>zopr0P;w4-2eap literal 0 HcmV?d00001 diff --git a/admin/dialogs/scrawl/images/eraser.png b/admin/dialogs/scrawl/images/eraser.png new file mode 100644 index 0000000000000000000000000000000000000000..63e87cecb90ed3ac0e4acbc257c6dddae5311e09 GIT binary patch literal 43271 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
    h>dGcdSlWeEFl}k2MrUUS^bR;=$@vE@GsDa9 zCRVfkO!iK!WhO`#u+q=#eY5hUOO`Ia4IA?6aYQQ5Oo47lSGM#GI6zV?e z;527R?<4z6_MOt(m$AE{v*68ILkKSTOdLso6hxT23gt6K8~fl1Fgf@DPPU|? zOGj9!l+baJd-hOCsg8CCKLbD5ilk1-Dm^td@7f(&jJKq}`JH;z@h%shHd!kdH5o{L z0yf^w$SpZmk938d@9r2=|; zI#!tIUYACF9!^Z6be#R7mX4!bhOKBmLEbGPL&$B;9lb$lNP7#V@}Z^ZW$KJI)-U1V zl4c&UAC0}7q0gHpmz1$=FiS`f@J*(Onl-^ES6Ymm*te3hnQ3IZ=Io9IdTi}a5zFQS zxdcpF#a8={UYgRn_98IfhEj9J>a^x)yPeZ&xsevrLLo&MSx3H2BBCL}IjT8$9kOef z?pb79Jm$F@fdIzAu%7#9^sIKF&~8>Ns+XPKG*v>@D@ZGOWSQK*Di*4ymo6y+ytSpM zgBKZ9!+@H-B@5h6B#=ZY*?`BmJy0+Qvj@<{e}+AN54azzp#NkN9vFdJmrHU#!_FD? z2JWX%=5)c`s&94PjL=eW`j}2>vpt+1UG7G z%gq{wct^kX16D8Uf}mT@np3@-?u*?WYpQa^mG_B5{VYHRZ(Sx>q+XZq=RF7yPv`ZY z55h`8Ds_7;JSbg?$>J2d5B{Iu)_c#2m`*TA{rZ-KxOWF4ouZ{JKpD$&`S|qEHBxx3 z8ST4#oV-Jt-$gMcnnFjC#{u3E)=&$#6Cn;xc*-03i;Jws!sHM=45zNPnvI9a(%GN=Mwvnr4E#`Mn4rn|;Hs``VC!Zett3`3dllh7e$(VWe%MDRb}y|E-lbCF zR;=Y~M^|sUEq7Hqq7sNVZnKZv7sl z&wSWhwZqFj@A$opr+3fiOb1&wcd_jqYTQe&RSS&IR$7alU8|8UrG~`f6LN4{;^*#R z+5&&B5=3|V?T#tY=FLE$4E4JC!;TL;#`w`>&pR#m-{dYcY~pmZ{E|!a+d^*`u@pYa z1@WB}Ft!t5+|9k-w@)T>^pwNk$6|y-0ij^oZ&=T3zg}pB@d|l8xGBel`E10F_0GTL zdD?02GB{E~FE(X4+@%6Y&mVv~)$xwDNr0ERVH4Em1HeRzcKnrXL?=Jc_#b3v= zV)-H2+^ev*Y1!c3li07*AKK!fC<4OPXm;x|O$_oi6;4D}ZxI`zOouB>J@lc}iH@3! zIiuf#+tW#1=!b3Wb=BElVmj^?C*Y7%m@WuCx+3|F_V!=ftFw?uH*{Y48*{el$7$Yx z4#N1oxUq$5((zj{wvpiW0%zPne#PhIV!5=`fn`cn2gH5|(D>^juh)FQAGSx0dWa7# zUVa($s$R||%fvosKdEcr0g2n^tV0~Okf@_)bmLt4)WU0I3gYP4d*{fkxW zyobg;eSpE3!7OA%kyp7-O8FLn8bi#xk$-$eSgx)TaX$Y*E)y{V#_p^bhDTnu zW0|d?Ba1v>%j(2pMYSh2=Bh?Rb4qpK&m1R{Lx@dj)E!UD477&hZwN3-4hE0YCHz z1uKY!QU4DmDOA7CH}xGQ_WJrjyK@ipuw30b6E%Az!ld@`>eR%l@)}U1!esw$q7ol_ zvMQdt+^?YI(_-DUALpa1m&>20r8`=qsq$*=rqiIDx_EB;r21`kT8!&a>u6$Rr)^<| zhbgdwVNG)<7&!?>Hp@=$5c{d1o4yC~rB;y@r{>oIeJe1X4wDJa4qAd7vnqO>>wV-+ zPw*u9WU+s7^>?5$|4b}N^;_Lja~{ za$k7Q5Q7rm7&r%*462991gf6}}dO&2XINF45@&Jndp_x)nqiS*57>D71^PM$Q}l5S=2iQI#e(qu(x?2`Ly*q@ z0R1-7eh9rrry_4>xjPANIyOB$9k^N?E0%Uqs!Q#A?{8jHL+j@8Rx;~4$LCmG1pU_ zV?<>37NJ5*uMLBtrUgV7G%aB+zHTILZGyEFXfly%t`7HeJP#~(+!J+Wm8vC5x8p_& zIh}xhmE8bt@zP=e+n)OV4fYvp)lO>By1irEes(3djmof@~tcWVZJU@0e%pR2)2Ja1!NMpsfj-b`L zo9u(JhvJFZqhleE-gL^C_HYvC_YBWDSN-F%z|&**KH(vChd48vhW^{d{iObXsEhml znHOGp?>77Y^c~GpkovlluIHtpBIot@ynKPLri$9nOO;{dG81lGk^TLLg{D%eY&_oM z%45vKV(}ys#(o^w+!8+Ktuec@5&+QY^nl3rpe%9A0R_u?SZJu$Ag8rckVgR+42IH` zpxiJ}2H?&>O#sRI`udT>Tmjr(8ToQAgByb$_s6dbcGcZ{AJm~)Qc5ogx+dHU`fPn& zpEHYXz~|@I?p6Sn8P5U-87~=10MAgBPnG;rJ7^i-pMs~}yBWW=wnrDGCwCg&6el}* zwynt9et}!0-W0i1V^PnEZclj%4Om=UT#9`P4f#Svnn**>rbyQIPNl9HG1INY+BIsE z;vJ|^{WtEt>D9#wSkd))Hr#yNbC0CB%M43~r1yMa9rU>KoevI6^S-}WbbAd?NTJk4XdI3ar0KtBfsn5#mWjvP zb#h4i<38mvba!Ib8wFUOV*QC(Ne1|BlQ!dsSg`Nw|QZ<@}0!EhUp zS!`C%ljy|=52v14JjQBZY<2JX5;AuXaMNu*MwaU2jH%XJU>5vwrP9rlhOwQ2Bo`&x zKmuMesqi*bq_f_GPW=TgTMI1%J7Sjtry`&KVUQVhbW~#z7h)JG4 z8En)ok#bj1y~pV_>)KJI!n}0uO5RS8l@cMz$pNT1N*opSHCyFiwctn z@Q)+E186X*m6NNCF`z^hp5w$uRf*|PB3}n7tS-w!A0nQ%>y}%ttJJt1E}vm(V{bS6 zPTj$lo(WG|SEHVcd;1XPv3%4^#;YxTs0GMSg|8^KMA{C>LX9w8)pz20Yz#+D3b1I_ z5To(E@At%ox3_;itoqE*z><434x^~pi=nH^!v>faCL#wwE9q~msAa}?-RlhW>M4l7 z3gjQ9(*CN>zW?J}yv~e7bW-fSA)VM%E-r5Ke=DKP$Nz^ap@B*FhmHrInDP4UtyJa!TL22>=+`r93O6_ zg@@0Er9m0ZLx^gJK301`J&7}A1U58s7=$JOP?wP~BAPT(&Z2ivu?QBTfG&=v=1>jt z`yq@}!+tpD*DwDhjZXc&NW*_`TQ>mhqUBcJ7(V67#kJ4>U%WXzoB+80dx8AVRh-9| zc6lYam3@(b`mz1OFJ8X!xSD+1*y*Pixtqz@yt9=&g@-eC)3rK7d-IaV27|oLo)nOY802Y#;C63= zbDr!2P^~-Z?Y8e7f|kbd2BHZLu?Ec5?RIzK_q}<9Oj~_(O3I_gLi|LC1uiEfb#RKT zj*v;HkZ*S`^@o#E0zFiGN`JBnKTl9yQ_nTxL`V2q8#IJKwG9T#qI8rTg;i79|utOa8 zdSkh2e=hgJZ%j>BV|J~`;3DJ?T>en2U0d&Qol9*$ zKZT1LV*69=$-x66mjia@tIa6(s4rmVsE?+41rNBM-=iYbUZ*`(u*@%$Vd8Gi?VXj{tGt@pteA?(L}uYPB|IycPo>c=ymG9bC`#`BAU$idTmA*Jc!T%w*( zjC%8-PMZ_!_m5oSs;+Qm-xRBdBUlkqRnSTD@W8iPz)_BMLag7^*|dO(FXoMD%}(WQ z5)(J$N_@2Lmn$&G$-v=6lvTOh*9HFo+l-XH^i!;0|DMM)*}Q}B-nMbvp$DJ$CRTna zil554@ylI8d!Iaa8SN`l%h35?v|N(m+u<|)vD zEG}gui)&Q1E22v+K3c|s$DrD5uYJz~z%aI8HamDpEIzK%cMjIoAih3rWWDAU7#9h* z3Sxl{uxuK=aedu^U=lEP!>Uy%C0(=Ag~tt~i)75KDU}*#L)>uhJj!en@2I<8do6of zNbl#K-#qTA5SU{}d(N6Ok->F?fLaMRuHGQpiT?oFblhM4_>l`p8}!6Jr=L>XE2~UD z;l{dvjuQX*{_CQ(HyP}<#lYvDpU=z?%pDK5PBmuTTWU#Zf+7I((NQjnf?$)q2_~kg(UZ zVl+~3PG4)r#$I2Yz69PC6;g8e(tQNSb*Xu)v#VNne6;Wg`I$~1>)`dTfBz(X3>l-;|1-*h56pI20lZe@Li=^1CT>AE_uZiz&xm0Qz>@v_d&@4}_A7`ti zUGmne)yao3e{=`mE37m-M5;g#ATI$CL${0IX@|lXhfW;Fi<&|=SCYTH=k)q)j_&(l z-+|2DZJyX54h`(dK5{IvuSg-j*l?$bjnIvDGy@@X88iKTxd;XZ>gLWih&4N+1gF?0 zdst@&Z?qg;9I6ps*v63;XF?BP@eO>gp(7RG(P zy~D>wLM3oG52#y+QRq^WjRsN?eCHZ|3#Q<}-uG*L>yr!CB?xxbcHbwdrzI;5)K%EK zfOidcp;RND?WNozdD(g(%b2s_LWg!oZ}lY}q)IcLw5q54W*NJ*_`px@V4ssmL=zX8 z2@3UTtt+YzzFlwRZEA8lWH3?_nwdtH!^4%g(ks<4W2a69NS)H6A1uFgUtw^?CUDGc zBH}m*8a;G?ataH!0p<@R=(URoB${{kcp`F3uZ(s8=j^8QQWxwwa_IK!>; zQkozb6flk+(=V6zpTz_}RPw$aGkIIK!X?(@olxnH_KTGBsLPG}@u^h-*Wd;WlV`hM z7*ja)vLr0?%i`DmJ<~})ACJEuvZov8$XQ)weiQrT#y_YTe!tV=!-d~=Ua_8T_TG~_ zqtAb^$=_Auy?BPmv8o$(hl||u6%-Fx{Gbc3%z4a_iww7!E%2@fM525av|E#Q%GHUH zfEE?8fheK0fx@k@^6!pw$1Zk6b=Vp3?hC#CkwctYNFV?rLJuaa6SamymmCkomZW0b zls#-y?+F~dK+|*4FFb9vc8QDoWubX6|5PZac>B_pyPr>tlr=4C=^>`?5A1~mf&BC5 z32Q&jX|C;hH!ON+t@H$wf8T*8oTNXP@>eHJTzc7|ux@;ptB`^ziMRFGSBt;C!*TgZ zf)>dy)9ADf5+2r}jlOW(UPi|UTOB%PooFX30M{=Ly!>}QRK%D!Bw)s)yPzXRM7 zTs-mM+AqpyHf5>#3(o5u_4qN)&w!q0NJYzbw%T6ImMQhi806Gi-BWv-M;G&I z`aO}n>dWfac_uRVcJp2^&eMicc?}FZe0OyPG|h90!o+MA!Oc`JeA^q#+qT~g8t+$I z?|=|r-T0*zaVO<`i);~h;poXV&J{a3mA`sH*v_Fm@i~U8(Et4X1naQ_qqtuSpsFPo z{k8qa{1tlqvwp{Yy)RvzQ_E+^!RvQv^JZ-QRa)+RpcxiGjL032uT%B(AS( z&?U6MUTEJl)F`ei&UoPRYNgAkp8J`p%YL&Vjpu9%J1(AqNOSYA49fquj3Z`T)5mcj z{{;I`jz%h>q+R>`737ifIOiEH+dFf`Q?Irr$07!&rpA7YXDZFm!|L{(F%$g)MpxGa zdAS1K!=9Yak2vbN#k{;_X8*lNO1r;RYdr$M-59hL& zjYmF(og%&5;%g0&(|COSs^f>)cLA!OJQ`)ji>(HwJXkGd0hG*ZH0D;I_=fW8qpShD zRf(IwR(*7`aksL){KP9w4Pr;{J^(Gy{}Ib^+e>mHT?A(S8`pw6I46zmD`f zm4MS=w=U^4&%c4#tz2X)>lP-qL{&G8a~cczS(zHsd!u7p%vq84G$y25JZ0k1qhnlY zv4{6J(giBP3zYMi#-yXWo{w%@<>_=%V_JM?N-9L!Geeq$=qNhMBVeTxjr zhHF^{^y0u56sTJi`;?d04!yTg$H}_#9ntG zyPm16ISKj)H?%y;T+(5>=fT3Ej7K zuMAA`L)H$q*{uM5)^~{sfi`V|pC)7A+p>(XJW1UKh^Y?daTMv$8X4|c&U(IkXP;Ee zGyIL8C88yLi-*qz6Y&g*w8siH%Xj7O>K@Z~eEo2HN`n;fi#kuKFmcDXu6p8KlS8iD zFVsFO#eVD*g zWWFlecA3)(vD6V8Y!-_Bz%??&&%*$NrIo+wW-HW-BO^PxzJ13vgWjvfEUhw8jfTYw zdrQm;FwJSPaw9N*%4A|{LrK@iL0ut#`5gF!?_HExb(lo#02l=vv6~s%c6TmW=qr93 zVY*#+;zL2l#S3iiDeygreUac7oTvkB%c1?94+nmru`p9?q{sq4=->?hs(6ZvnC7wV zH%=BPD2y|5MZ}q@L%I{23SrjzM zPq@!>ipkdL#jU!3K{L3y*WqmH| zSBOXiWO($L@8xEJpi+-paaD+~>ipvnRexhXjSB-xM6d+#L-y+VI-8Osl)Sc&-sXEn z>|b-61Nd&BCs;X3qME#;qA?FF83AP*`DISqC}SrV4i4t=pD;>|)61OlIP~s#cgFhm zJx9A2KbnzK`_O0vW4NR=uaaG-zN%i4pRtN^p3Zjo+PZXZ<;2}qnTZk}wNIbTv`4@b zK0f@g_j8g}0$g_^g0YhaJkml*tR=S->HgbSJ4mSEp`wBpv@o{4#`t#nx$yDPZSLNe z_;utXiEa;5h*^zHL9Vfnkeu{AtJJF;XZR!4j$RFUBT)f)9j$i9PS;65{&E96ZU3<- z?=SZLt8r;DQHZpJNC4?bLt^7 zCk?BvpY@fr+qwmBofBsah{^3}Fz|y7TlZ;VbSU>g<965l(E-f8rl_4ACjxgObvX~z z`?TgBRY#_6-Te!p$H!juYh>vrCnPTr3u=6?dIhys$G)0|els+B0-p!0v$hW7f?rsE z-fnPZVMfsY!^)%#IVPzY-W6~|^o049qi%-}tcL+figHryxFPy9P8QUx_D_YSg?gF6$j4UK`-oHH+s4{*LO=e_BLmoIz7HiAMLttuZOYc z+syKQOX76H}Yui)(Dvid}ZJ@D{nPTn~uVEyosD$JxWTMk3|PO znT|Z>$#dgTdpF2StvBvSwT?WVop?sIKh2>B9L9-W@>^7lj#zck9`?PSfkihqqw*7| zmRSEV6}3yRKy!by{`3$-O)N|NpmyxDW82hV3~0;8(E%=V8ml zzfWHpj{VP{sr>gp;XHlmFS>W|>|x#|=wnBj&n>&RdK8VEmhHvvl#k%|dVNZ^zJyer*-$8SD@abuSGXSpL>lrL{ zg@iW%uaPAlg@Ed1X-H3X+j-7wclgMC+D%meA^|cA&)oAfP@B~kRS&6WMmq(vjuv0z zWrqm_lEP^MNZhPtkbkJ)5WvYf(&n`g9d`6j-C0vKl~P*PP@P|?&@QPEaWmHcay(%;27()D+C)xL4z;$IPRUg=5Q4Gi?vR#JjM zAc_z*MIV1RB^50#EhS~u-@$Mc3IUY=A5X@p`v}>-{p3okH3YF zkEi~hdH+vK(CRAvSJA(*{(HX5h1-EH`l`w*DhkS43aZK$%39j0oL%|We>ne7(SJGp zs*kg~Yv}*;>1WjcI{iP0{yJS(={Jb~0Ok+szw`88-v56C=IrzjFW(@4&p$4Uvy+mG zr;C@1cVGaAnaY1==Io^H>f`TqJ5b-<>$aPVlCQU$uF}76{x8$_XR0~2;CNE$A5;FF z^nWhp|CNJ(x&L1Y{?9-+BiRt#O~YeNJ!B;It_Caw(;*pPVBU7NTzL|{YWO?PeL+7N*ai8tM~iEBdy zHYDD3*CwtF5!jG;(_NdmHbh`U;!SsL;@S{_4T(41wTWv(1U4l8U%G48zr#FSyg6e# zAe=!QQ?u9s&N!gp%NNdCXvW06LKttkEgB7{K0T&<(#P*vV!l=8hbKqQ?TAjeTMUzo zK9c%=lrQ?0XImsczuDEO(-#hN_G9dQoi|=NLc}9PD9oVr)u^OtC<&TQU8%ovVct}; z9-}8Hxii&jmpj^_v#j?y?A}g;TbKimHKu&`kMuS~aesv-_`YXmofY6)3acCOR<+n0 zORAYbKHO${InMDgq5s0O9RfDSZX5QcOx3i27B6$E8kYo``yO=~(fO!Xubk?*X2JxPx#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUzL`g(JR5(v#U>Fi0G&GbsGc&WABFAQBW&H;lG7V%HSq6a&=p3^@!o0LWNZTU!fu9x(;+;T6gAK| zUX3q)K?dNALXZKDj*f0X1N4B{3W%M7*b|6-p|o>kWaLs-R#pQbUlE7}(JkW!3Wxx) wG!QERu?7%p1F;U22Ju1SAbF5FkorLa0CKM2R>lkau>b%707*qoM6N<$f*t~~2mk;8 literal 0 HcmV?d00001 diff --git a/admin/dialogs/scrawl/images/redoH.png b/admin/dialogs/scrawl/images/redoH.png new file mode 100644 index 0000000000000000000000000000000000000000..d9f33d38a3d11ce10447830ce409a0890ecad264 GIT binary patch literal 536 zcmV+z0_XjSP)LlRro!K@`S+vst67f)FhPH9;i)IZy=QifsP%Q^7=yx~FIm{DVqJh#8yN2on55 zK6niC-hAJD?=d5!lvD$)D)w6iOxq2aw)?eGO}w=Q({?4W2uyj7_3$nS0b08|CV^$s zcEc4Nn6?`Q=790%;vf4s`J3kd?(rXB%yX=pvVdv3pMkYfEM|mb9T>VsU5&ud zHR{zG?2nRrWd3EgfMHFMKLD%wc#k35+Fxy@XQ-Rrp?E*AqO06&F51~7BhBb9F%{CA zdmJPWQouxT{!<~+LW6%qD0@z^RN@x6tuTZA%{2bb;RZ0`Io4$$5UD%$(J!*|z&Fpa za?fuyZTGrH*P6~!{%Io9+`*3VLY0+{d|s}SVM0@>uRpF)fd0F8hF zgjKx=6b8R6tZy&P{3zz{+r)RSrIc5o-hmLJL6K@zgnPx#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUzF-b&0R5(wyQ*Ba%Fc9qxdXyf4gZLw&GE-Zj!G1tU_|R6xf-Mzw ztkqtHqs45L76*QWA2RbM@MiON_wCZ@{O7ZK+oR9deF10dJg3G9@~FqDz{krMf6sUA zM9%t%Ge#w-z&79UR#oU%de6AjwTpqy2_YI|tk+7Q3^s=6YMHYnLz^_O1&3i+?2mwN&7$-;U#S!Q9m{<3SMoh?w@E00BVyxZ+RCwFLF4JWG!G zOmY$;RtOYQz#3aQ*W5#AiVywHJM`%L@4v^Nzsx*vCin1#lEeQmy!?Oq z<)3F?{!hO2^5n}ed515YeEH$t2cY2pvoHVmpTDyB(*MfC{~Hedzw_aD z|6#-Q0^JY(AHHp1XAM(|igs|-_4sV4KK0;p@m*h1S8U_x=m<-jvZ+JR;{IBr4+&>f zSEaF?oUyAYF85cQWPSYh#i0ycQ4jWf_nW(8?Ylo51`N|SiTvgEn+*yn22WQ%mvv4F FO#t{IsF?r& literal 0 HcmV?d00001 diff --git a/admin/dialogs/scrawl/images/size.png b/admin/dialogs/scrawl/images/size.png new file mode 100644 index 0000000000000000000000000000000000000000..8366845059c94089aef92aa3aeeee79e242732eb GIT binary patch literal 775 zcmeAS@N?(olHy`uVBq!ia0vp^Iv_R&Gmw0`s%8O@k}PqJC<)F_D=AMbN@Z|N$xljE z@XSq2PYp^@^W{ zcO82EKXB&y{MKgq%sz{fI)==3d^r;&6MFPw(_IV71M|xGvv%v3_j2X!dGPP#L^Pja~hhtj9%m4qMKL2y%^Z&`q z=WTfUnlHCkByWLuLg&Z-{~5B^aHX`VrcW0wpCeN?gQ0YF|Ek^0Wm|o-iywUa@%aCL z)%2NBbM`Q#t<@@?!;!p&H+$mBlaI^_YB&B#>#{8s<9mu2JY zGd5l4N$XHbnR5BlcfNx4cmMupDBR$-Y>#a9e1@#m@BaT>^X!XNW-&wBx||KyZ~Xty zRkTzmtwcMm#U?#ZF@LgB=2WKq4bg@9JjHY3ON;;i|F13o-WwPzN)S72Y1Qc%6 zcJYYNXcAOgEAc9NiWcu<*Ig$*&7M7NgR1o_Dx<9^s3W?&d{SwZWC%AQ=Vq^CQZBv#02ZVBfRNMNWq`8qHxO6)(-0}P(7 KelF{r5}E+VpO-NJ literal 0 HcmV?d00001 diff --git a/admin/dialogs/scrawl/images/undo.png b/admin/dialogs/scrawl/images/undo.png new file mode 100644 index 0000000000000000000000000000000000000000..084c7cc73f4058c8084e5ea3ab4e51fd105b7991 GIT binary patch literal 444 zcmV;t0YmPx#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUzI!Q!9R5(v#U>KAjGc&U&EiH|oEXQSKWlhM*$@yPcSjb6|0imIx zY(ULRYin!&1L^-HX$ETG0XlnEb#?Xs>C>nGudAyA8-k93YSsZ=r-))WP>}=>pQ);< z`afyXB(MQ<=FIuOaN)xL%ayrnkSp|9?S2!GDaj0*gvQ(FlretOfvW z6$E0%n3$MFK-vn3oq^aBh<%|nh;Lrlg%pxVI0RlGdnYDm%@o%7K^0FfxN6OiJOCi zi#RxuqoSN#Tot)WQew-+VO#$I2f6IQORU!0vXfFu4udr_4m%hxc|CaQ+tc&%`}Y0* zp6?@=rpaH1_@`<>2#kh5+8+kyfa~8Vm_`&Qf&1?$uoEc2lIZmeVHg0~PYAMri0Se6 zisfa<1zrI21FQgkJAn`w4d(-ql&7Fh^q1h21YD9xhMb<=^2_=%c1k>YpaK0r=t;rC zt=CtVDk}a`Zc&w=rjAAzFb_055%guKXWR05;yaef&C8{>rA7h90VLo8XqA)a5z{mR zl$UZFi*u7y-#5(Rpt#aUb$tcVwXHUL6R&`FK~-0c!y{7ZV&N?eU3VYvo=oj*?jtLb z0%Y5tQ3JY+q#F9ffd-5m?iOx)5tafl#kIoD<11{3}kbno$;nIA;p5?+| zPj_N{G3Qm3Edm$dw4eYE%Yq5$7Rj9jP5AfU_y|@8ao4ld0UH1S002ovPDHLkV1l6! B+-3j( literal 0 HcmV?d00001 diff --git a/admin/dialogs/scrawl/scrawl.css b/admin/dialogs/scrawl/scrawl.css new file mode 100644 index 0000000..4a4c1b3 --- /dev/null +++ b/admin/dialogs/scrawl/scrawl.css @@ -0,0 +1,324 @@ +/*common +*/ +body { + margin: 0; +} + +table { + width: 100%; +} + +table td { + padding: 2px 4px; + vertical-align: middle; +} + +a { + text-decoration: none; +} + +em { + font-style: normal; +} + +.border_style1 { + border: 1px solid #ccc; + border-radius: 5px; + box-shadow: 2px 2px 5px #d3d6da; +} + +/*module +*/ +.main { + margin: 8px; + overflow: hidden; +} + +.hot { + float: left; + height: 335px; +} + +.drawBoard { + position: relative; + cursor: crosshair; +} + +.brushBorad { + position: absolute; + left: 0; + top: 0; + z-index: 998; +} + +.picBoard { + border: none; + text-align: center; + line-height: 300px; + cursor: default; +} + +.operateBar { + margin-top: 10px; + font-size: 12px; + text-align: center; +} + +.operateBar span { + margin-left: 10px; +} + +.drawToolbar { + float: right; + width: 110px; + height: 300px; + overflow: hidden; +} + +.colorBar { + margin-top: 10px; + font-size: 12px; + text-align: center; +} + +.colorBar a { + display: block; + width: 10px; + height: 10px; + border: 1px solid #1006F1; + border-radius: 3px; + box-shadow: 2px 2px 5px #d3d6da; + opacity: 0.3 +} + +.sectionBar { + margin-top: 15px; + font-size: 12px; + text-align: center; +} + +.sectionBar a { + display: inline-block; + width: 10px; + height: 12px; + color: #888; + text-indent: -999px; + opacity: 0.3 +} + +.size1 { + background: url('images/size.png') 1px center no-repeat; +} + +.size2 { + background: url('images/size.png') -10px center no-repeat; +} + +.size3 { + background: url('images/size.png') -22px center no-repeat; +} + +.size4 { + background: url('images/size.png') -35px center no-repeat; +} + +.addImgH { + position: relative; +} + +.addImgH_form { + position: absolute; + left: 18px; + top: -1px; + width: 75px; + height: 21px; + opacity: 0; + cursor: pointer; +} + +.addImgH_form input { + width: 100%; +} + +/*scrawl遮罩层 +*/ +.maskLayerNull { + display: none; +} + +.maskLayer { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + opacity: 0.7; + background-color: #fff; + text-align: center; + font-weight: bold; + line-height: 300px; + z-index: 1000; +} + +/*btn state +*/ +.previousStepH .icon { + display: inline-block; + width: 16px; + height: 16px; + background-image: url('images/undoH.png'); + cursor: pointer; +} + +.previousStepH .text { + color: #888; + cursor: pointer; +} + +.previousStep .icon { + display: inline-block; + width: 16px; + height: 16px; + background-image: url('images/undo.png'); + cursor: default; +} + +.previousStep .text { + color: #ccc; + cursor: default; +} + +.nextStepH .icon { + display: inline-block; + width: 16px; + height: 16px; + background-image: url('images/redoH.png'); + cursor: pointer; +} + +.nextStepH .text { + color: #888; + cursor: pointer; +} + +.nextStep .icon { + display: inline-block; + width: 16px; + height: 16px; + background-image: url('images/redo.png'); + cursor: default; +} + +.nextStep .text { + color: #ccc; + cursor: default; +} + +.clearBoardH .icon { + display: inline-block; + width: 16px; + height: 16px; + background-image: url('images/emptyH.png'); + cursor: pointer; +} + +.clearBoardH .text { + color: #888; + cursor: pointer; +} + +.clearBoard .icon { + display: inline-block; + width: 16px; + height: 16px; + background-image: url('images/empty.png'); + cursor: default; +} + +.clearBoard .text { + color: #ccc; + cursor: default; +} + +.scaleBoardH .icon { + display: inline-block; + width: 16px; + height: 16px; + background-image: url('images/scaleH.png'); + cursor: pointer; +} + +.scaleBoardH .text { + color: #888; + cursor: pointer; +} + +.scaleBoard .icon { + display: inline-block; + width: 16px; + height: 16px; + background-image: url('images/scale.png'); + cursor: default; +} + +.scaleBoard .text { + color: #ccc; + cursor: default; +} + +.removeImgH .icon { + display: inline-block; + width: 16px; + height: 16px; + background-image: url('images/delimgH.png'); + cursor: pointer; +} + +.removeImgH .text { + color: #888; + cursor: pointer; +} + +.removeImg .icon { + display: inline-block; + width: 16px; + height: 16px; + background-image: url('images/delimg.png'); + cursor: default; +} + +.removeImg .text { + color: #ccc; + cursor: default; +} + +.addImgH .icon { + vertical-align: top; + display: inline-block; + width: 16px; + height: 16px; + background-image: url('images/addimg.png') +} + +.addImgH .text { + color: #888; + cursor: pointer; +} + +/*icon +*/ +.brushIcon { + display: inline-block; + width: 16px; + height: 16px; + background-image: url('images/brush.png') +} + +.eraserIcon { + display: inline-block; + width: 16px; + height: 16px; + background-image: url('images/eraser.png') +} + + diff --git a/admin/dialogs/scrawl/scrawl.html b/admin/dialogs/scrawl/scrawl.html new file mode 100644 index 0000000..dc68ca7 --- /dev/null +++ b/admin/dialogs/scrawl/scrawl.html @@ -0,0 +1,95 @@ + + + + + + + + + + +
    +
    +
    + +
    +
    +
    + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    + + 1 + 3 + 5 + 7 +
    +
    + + 1 + 3 + 5 + 7 +
    +
    +
    + + +
    + +
    + +
    +
    +
    + + + + +
    +
    +
    +
    + + + + + \ No newline at end of file diff --git a/admin/dialogs/scrawl/scrawl.js b/admin/dialogs/scrawl/scrawl.js new file mode 100644 index 0000000..669e53d --- /dev/null +++ b/admin/dialogs/scrawl/scrawl.js @@ -0,0 +1,677 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-5-22 + * Time: 上午11:38 + * To change this template use File | Settings | File Templates. + */ +var scrawl = function (options) { + options && this.initOptions(options); +}; +(function () { + var canvas = $G("J_brushBoard"), + context = canvas.getContext('2d'), + drawStep = [], //undo redo存储 + drawStepIndex = 0; //undo redo指针 + + scrawl.prototype = { + isScrawl: false, //是否涂鸦 + brushWidth: -1, //画笔粗细 + brushColor: "", //画笔颜色 + + initOptions: function (options) { + var me = this; + me.originalState(options);//初始页面状态 + me._buildToolbarColor(options.colorList);//动态生成颜色选择集合 + + me._addBoardListener(options.saveNum);//添加画板处理 + me._addOPerateListener(options.saveNum);//添加undo redo clearBoard处理 + me._addColorBarListener();//添加颜色选择处理 + me._addBrushBarListener();//添加画笔大小处理 + me._addEraserBarListener();//添加橡皮大小处理 + me._addAddImgListener();//添加增添背景图片处理 + me._addRemoveImgListenter();//删除背景图片处理 + me._addScalePicListenter();//添加缩放处理 + me._addClearSelectionListenter();//添加清楚选中状态处理 + + me._originalColorSelect(options.drawBrushColor);//初始化颜色选中 + me._originalBrushSelect(options.drawBrushSize);//初始化画笔选中 + me._clearSelection();//清楚选中状态 + }, + + originalState: function (options) { + var me = this; + + me.brushWidth = options.drawBrushSize;//同步画笔粗细 + me.brushColor = options.drawBrushColor;//同步画笔颜色 + + context.lineWidth = me.brushWidth;//初始画笔大小 + context.strokeStyle = me.brushColor;//初始画笔颜色 + context.fillStyle = "transparent";//初始画布背景颜色 + context.lineCap = "round";//去除锯齿 + context.fill(); + }, + _buildToolbarColor: function (colorList) { + var tmp = null, arr = []; + arr.push(""); + for (var i = 0, color; color = colorList[i++];) { + if ((i - 1) % 5 == 0) { + if (i != 1) { + arr.push(""); + } + arr.push(""); + } + tmp = '#' + color; + arr.push(""); + } + arr.push("
    "); + $G("J_colorBar").innerHTML = arr.join(""); + }, + + _addBoardListener: function (saveNum) { + var me = this, + margin = 0, + startX = -1, + startY = -1, + isMouseDown = false, + isMouseMove = false, + isMouseUp = false, + buttonPress = 0, button, flag = ''; + + margin = parseInt(domUtils.getComputedStyle($G("J_wrap"), "margin-left")); + drawStep.push(context.getImageData(0, 0, context.canvas.width, context.canvas.height)); + drawStepIndex += 1; + + domUtils.on(canvas, ["mousedown", "mousemove", "mouseup", "mouseout"], function (e) { + button = browser.webkit ? e.which : buttonPress; + switch (e.type) { + case 'mousedown': + buttonPress = 1; + flag = 1; + isMouseDown = true; + isMouseUp = false; + isMouseMove = false; + me.isScrawl = true; + startX = e.clientX - margin;//10为外边距总和 + startY = e.clientY - margin; + context.beginPath(); + break; + case 'mousemove' : + if (!flag && button == 0) { + return; + } + if (!flag && button) { + startX = e.clientX - margin;//10为外边距总和 + startY = e.clientY - margin; + context.beginPath(); + flag = 1; + } + if (isMouseUp || !isMouseDown) { + return; + } + var endX = e.clientX - margin, + endY = e.clientY - margin; + + context.moveTo(startX, startY); + context.lineTo(endX, endY); + context.stroke(); + startX = endX; + startY = endY; + isMouseMove = true; + break; + case 'mouseup': + buttonPress = 0; + if (!isMouseDown) return; + if (!isMouseMove) { + context.arc(startX, startY, context.lineWidth, 0, Math.PI * 2, false); + context.fillStyle = context.strokeStyle; + context.fill(); + } + context.closePath(); + me._saveOPerate(saveNum); + isMouseDown = false; + isMouseMove = false; + isMouseUp = true; + startX = -1; + startY = -1; + break; + case 'mouseout': + flag = ''; + buttonPress = 0; + if (button == 1) return; + context.closePath(); + break; + } + }); + }, + _addOPerateListener: function (saveNum) { + var me = this; + domUtils.on($G("J_previousStep"), "click", function () { + if (drawStepIndex > 1) { + drawStepIndex -= 1; + context.clearRect(0, 0, context.canvas.width, context.canvas.height); + context.putImageData(drawStep[drawStepIndex - 1], 0, 0); + me.btn2Highlight("J_nextStep"); + drawStepIndex == 1 && me.btn2disable("J_previousStep"); + } + }); + domUtils.on($G("J_nextStep"), "click", function () { + if (drawStepIndex > 0 && drawStepIndex < drawStep.length) { + context.clearRect(0, 0, context.canvas.width, context.canvas.height); + context.putImageData(drawStep[drawStepIndex], 0, 0); + drawStepIndex += 1; + me.btn2Highlight("J_previousStep"); + drawStepIndex == drawStep.length && me.btn2disable("J_nextStep"); + } + }); + domUtils.on($G("J_clearBoard"), "click", function () { + context.clearRect(0, 0, context.canvas.width, context.canvas.height); + drawStep = []; + me._saveOPerate(saveNum); + drawStepIndex = 1; + me.isScrawl = false; + me.btn2disable("J_previousStep"); + me.btn2disable("J_nextStep"); + me.btn2disable("J_clearBoard"); + }); + }, + _addColorBarListener: function () { + var me = this; + domUtils.on($G("J_colorBar"), "click", function (e) { + var target = me.getTarget(e), + color = target.title; + if (!!color) { + me._addColorSelect(target); + + me.brushColor = color; + context.globalCompositeOperation = "source-over"; + context.lineWidth = me.brushWidth; + context.strokeStyle = color; + } + }); + }, + _addBrushBarListener: function () { + var me = this; + domUtils.on($G("J_brushBar"), "click", function (e) { + var target = me.getTarget(e), + size = browser.ie ? target.innerText : target.text; + if (!!size) { + me._addBESelect(target); + + context.globalCompositeOperation = "source-over"; + context.lineWidth = parseInt(size); + context.strokeStyle = me.brushColor; + me.brushWidth = context.lineWidth; + } + }); + }, + _addEraserBarListener: function () { + var me = this; + domUtils.on($G("J_eraserBar"), "click", function (e) { + var target = me.getTarget(e), + size = browser.ie ? target.innerText : target.text; + if (!!size) { + me._addBESelect(target); + + context.lineWidth = parseInt(size); + context.globalCompositeOperation = "destination-out"; + context.strokeStyle = "#FFF"; + } + }); + }, + _addAddImgListener: function () { + var file = $G("J_imgTxt"); + if (!window.FileReader) { + $G("J_addImg").style.display = 'none'; + $G("J_removeImg").style.display = 'none'; + $G("J_sacleBoard").style.display = 'none'; + } + domUtils.on(file, "change", function (e) { + var frm = file.parentNode; + addMaskLayer(lang.backgroundUploading); + + var target = e.target || e.srcElement, + reader = new FileReader(); + reader.onload = function (evt) { + var target = evt.target || evt.srcElement; + ue_callback(target.result, 'SUCCESS'); + }; + reader.readAsDataURL(target.files[0]); + frm.reset(); + }); + }, + _addRemoveImgListenter: function () { + var me = this; + domUtils.on($G("J_removeImg"), "click", function () { + $G("J_picBoard").innerHTML = ""; + me.btn2disable("J_removeImg"); + me.btn2disable("J_sacleBoard"); + }); + }, + _addScalePicListenter: function () { + domUtils.on($G("J_sacleBoard"), "click", function () { + var picBoard = $G("J_picBoard"), + scaleCon = $G("J_scaleCon"), + img = picBoard.children[0]; + + if (img) { + if (!scaleCon) { + picBoard.style.cssText = "position:relative;z-index:999;" + picBoard.style.cssText; + img.style.cssText = "position: absolute;top:" + (canvas.height - img.height) / 2 + "px;left:" + (canvas.width - img.width) / 2 + "px;"; + var scale = new ScaleBoy(); + picBoard.appendChild(scale.init()); + scale.startScale(img); + } else { + if (scaleCon.style.visibility == "visible") { + scaleCon.style.visibility = "hidden"; + picBoard.style.position = ""; + picBoard.style.zIndex = ""; + } else { + scaleCon.style.visibility = "visible"; + picBoard.style.cssText += "position:relative;z-index:999"; + } + } + } + }); + }, + _addClearSelectionListenter: function () { + var doc = document; + domUtils.on(doc, 'mousemove', function (e) { + if (browser.ie && browser.version < 11) + doc.selection.clear(); + else + window.getSelection().removeAllRanges(); + }); + }, + _clearSelection: function () { + var list = ["J_operateBar", "J_colorBar", "J_brushBar", "J_eraserBar", "J_picBoard"]; + for (var i = 0, group; group = list[i++];) { + domUtils.unSelectable($G(group)); + } + }, + + _saveOPerate: function (saveNum) { + var me = this; + if (drawStep.length <= saveNum) { + if (drawStepIndex < drawStep.length) { + me.btn2disable("J_nextStep"); + drawStep.splice(drawStepIndex); + } + drawStep.push(context.getImageData(0, 0, context.canvas.width, context.canvas.height)); + drawStepIndex = drawStep.length; + } else { + drawStep.shift(); + drawStep.push(context.getImageData(0, 0, context.canvas.width, context.canvas.height)); + drawStepIndex = drawStep.length; + } + me.btn2Highlight("J_previousStep"); + me.btn2Highlight("J_clearBoard"); + }, + + _originalColorSelect: function (title) { + var colorList = $G("J_colorList").getElementsByTagName("td"); + for (var j = 0, cell; cell = colorList[j++];) { + if (cell.children[0].title.toLowerCase() == title) { + cell.children[0].style.opacity = 1; + } + } + }, + _originalBrushSelect: function (text) { + var brushList = $G("J_brushBar").children; + for (var i = 0, ele; ele = brushList[i++];) { + if (ele.tagName.toLowerCase() == "a") { + var size = browser.ie ? ele.innerText : ele.text; + if (size.toLowerCase() == text) { + ele.style.opacity = 1; + } + } + } + }, + _addColorSelect: function (target) { + var me = this, + colorList = $G("J_colorList").getElementsByTagName("td"), + eraserList = $G("J_eraserBar").children, + brushList = $G("J_brushBar").children; + + for (var i = 0, cell; cell = colorList[i++];) { + cell.children[0].style.opacity = 0.3; + } + for (var k = 0, ele; ele = brushList[k++];) { + if (ele.tagName.toLowerCase() == "a") { + ele.style.opacity = 0.3; + var size = browser.ie ? ele.innerText : ele.text; + if (size.toLowerCase() == this.brushWidth) { + ele.style.opacity = 1; + } + } + } + for (var j = 0, node; node = eraserList[j++];) { + if (node.tagName.toLowerCase() == "a") { + node.style.opacity = 0.3; + } + } + + target.style.opacity = 1; + target.blur(); + }, + _addBESelect: function (target) { + var brushList = $G("J_brushBar").children; + var eraserList = $G("J_eraserBar").children; + + for (var i = 0, ele; ele = brushList[i++];) { + if (ele.tagName.toLowerCase() == "a") { + ele.style.opacity = 0.3; + } + } + for (var j = 0, node; node = eraserList[j++];) { + if (node.tagName.toLowerCase() == "a") { + node.style.opacity = 0.3; + } + } + + target.style.opacity = 1; + target.blur(); + }, + getCanvasData: function () { + var picContainer = $G("J_picBoard"), + img = picContainer.children[0]; + if (img) { + var x, y; + if (img.style.position == "absolute") { + x = parseInt(img.style.left); + y = parseInt(img.style.top); + } else { + x = (picContainer.offsetWidth - img.width) / 2; + y = (picContainer.offsetHeight - img.height) / 2; + } + context.globalCompositeOperation = "destination-over"; + context.drawImage(img, x, y, img.width, img.height); + } else { + context.globalCompositeOperation = "destination-atop"; + context.fillStyle = "#fff";//重置画布背景白色 + context.fillRect(0, 0, canvas.width, canvas.height); + } + try { + return canvas.toDataURL("image/png").substring(22); + } catch (e) { + return ""; + } + }, + btn2Highlight: function (id) { + var cur = $G(id); + cur.className.indexOf("H") == -1 && (cur.className += "H"); + }, + btn2disable: function (id) { + var cur = $G(id); + cur.className.indexOf("H") != -1 && (cur.className = cur.className.replace("H", "")); + }, + getTarget: function (evt) { + return evt.target || evt.srcElement; + } + }; +})(); + +var ScaleBoy = function () { + this.dom = null; + this.scalingElement = null; +}; +(function () { + function _appendStyle() { + var doc = document, + head = doc.getElementsByTagName('head')[0], + style = doc.createElement('style'), + cssText = '.scale{visibility:hidden;cursor:move;position:absolute;left:0;top:0;width:100px;height:50px;background-color:#fff;font-size:0;line-height:0;opacity:.4;filter:Alpha(opacity=40);}' + + '.scale span{position:absolute;left:0;top:0;width:6px;height:6px;background-color:#006DAE;}' + + '.scale .hand0, .scale .hand7{cursor:nw-resize;}' + + '.scale .hand1, .scale .hand6{left:50%;margin-left:-3px;cursor:n-resize;}' + + '.scale .hand2, .scale .hand4, .scale .hand7{left:100%;margin-left:-6px;}' + + '.scale .hand3, .scale .hand4{top:50%;margin-top:-3px;cursor:w-resize;}' + + '.scale .hand5, .scale .hand6, .scale .hand7{margin-top:-6px;top:100%;}' + + '.scale .hand2, .scale .hand5{cursor:ne-resize;}'; + style.type = 'text/css'; + + try { + style.appendChild(doc.createTextNode(cssText)); + } catch (e) { + style.styleSheet.cssText = cssText; + } + head.appendChild(style); + } + + function _getDom() { + var doc = document, + hand, + arr = [], + scale = doc.createElement('div'); + + scale.id = 'J_scaleCon'; + scale.className = 'scale'; + for (var i = 0; i < 8; i++) { + arr.push(""); + } + scale.innerHTML = arr.join(""); + return scale; + } + + var rect = [ + //[left, top, width, height] + [1, 1, -1, -1], + [0, 1, 0, -1], + [0, 1, 1, -1], + [1, 0, -1, 0], + [0, 0, 1, 0], + [1, 0, -1, 1], + [0, 0, 0, 1], + [0, 0, 1, 1] + ]; + ScaleBoy.prototype = { + init: function () { + _appendStyle(); + var me = this, + scale = me.dom = _getDom(); + + me.scaleMousemove.fp = me; + domUtils.on(scale, 'mousedown', function (e) { + var target = e.target || e.srcElement; + me.start = {x: e.clientX, y: e.clientY}; + if (target.className.indexOf('hand') != -1) { + me.dir = target.className.replace('hand', ''); + } + domUtils.on(document.body, 'mousemove', me.scaleMousemove); + e.stopPropagation ? e.stopPropagation() : e.cancelBubble = true; + }); + domUtils.on(document.body, 'mouseup', function (e) { + if (me.start) { + domUtils.un(document.body, 'mousemove', me.scaleMousemove); + if (me.moved) { + me.updateScaledElement({ + position: {x: scale.style.left, y: scale.style.top}, + size: {w: scale.style.width, h: scale.style.height} + }); + } + delete me.start; + delete me.moved; + delete me.dir; + } + }); + return scale; + }, + startScale: function (objElement) { + var me = this, Idom = me.dom; + + Idom.style.cssText = 'visibility:visible;top:' + objElement.style.top + ';left:' + objElement.style.left + ';width:' + objElement.offsetWidth + 'px;height:' + objElement.offsetHeight + 'px;'; + me.scalingElement = objElement; + }, + updateScaledElement: function (objStyle) { + var cur = this.scalingElement, + pos = objStyle.position, + size = objStyle.size; + if (pos) { + typeof pos.x != 'undefined' && (cur.style.left = pos.x); + typeof pos.y != 'undefined' && (cur.style.top = pos.y); + } + if (size) { + size.w && (cur.style.width = size.w); + size.h && (cur.style.height = size.h); + } + }, + updateStyleByDir: function (dir, offset) { + var me = this, + dom = me.dom, tmp; + + rect['def'] = [1, 1, 0, 0]; + if (rect[dir][0] != 0) { + tmp = parseInt(dom.style.left) + offset.x; + dom.style.left = me._validScaledProp('left', tmp) + 'px'; + } + if (rect[dir][1] != 0) { + tmp = parseInt(dom.style.top) + offset.y; + dom.style.top = me._validScaledProp('top', tmp) + 'px'; + } + if (rect[dir][2] != 0) { + tmp = dom.clientWidth + rect[dir][2] * offset.x; + dom.style.width = me._validScaledProp('width', tmp) + 'px'; + } + if (rect[dir][3] != 0) { + tmp = dom.clientHeight + rect[dir][3] * offset.y; + dom.style.height = me._validScaledProp('height', tmp) + 'px'; + } + if (dir === 'def') { + me.updateScaledElement({position: {x: dom.style.left, y: dom.style.top}}); + } + }, + scaleMousemove: function (e) { + var me = arguments.callee.fp, + start = me.start, + dir = me.dir || 'def', + offset = {x: e.clientX - start.x, y: e.clientY - start.y}; + + me.updateStyleByDir(dir, offset); + arguments.callee.fp.start = {x: e.clientX, y: e.clientY}; + arguments.callee.fp.moved = 1; + }, + _validScaledProp: function (prop, value) { + var ele = this.dom, + wrap = $G("J_picBoard"); + + value = isNaN(value) ? 0 : value; + switch (prop) { + case 'left': + return value < 0 ? 0 : (value + ele.clientWidth) > wrap.clientWidth ? wrap.clientWidth - ele.clientWidth : value; + case 'top': + return value < 0 ? 0 : (value + ele.clientHeight) > wrap.clientHeight ? wrap.clientHeight - ele.clientHeight : value; + case 'width': + return value <= 0 ? 1 : (value + ele.offsetLeft) > wrap.clientWidth ? wrap.clientWidth - ele.offsetLeft : value; + case 'height': + return value <= 0 ? 1 : (value + ele.offsetTop) > wrap.clientHeight ? wrap.clientHeight - ele.offsetTop : value; + } + } + }; +})(); + +//后台回调 +function ue_callback(url, state) { + var doc = document, + picBorard = $G("J_picBoard"), + img = doc.createElement("img"); + + //图片缩放 + function scale(img, max, oWidth, oHeight) { + var width = 0, height = 0, percent, ow = img.width || oWidth, oh = img.height || oHeight; + if (ow > max || oh > max) { + if (ow >= oh) { + if (width = ow - max) { + percent = (width / ow).toFixed(2); + img.height = oh - oh * percent; + img.width = max; + } + } else { + if (height = oh - max) { + percent = (height / oh).toFixed(2); + img.width = ow - ow * percent; + img.height = max; + } + } + } + } + + //移除遮罩层 + removeMaskLayer(); + //状态响应 + if (state == "SUCCESS") { + picBorard.innerHTML = ""; + img.onload = function () { + scale(this, 300); + picBorard.appendChild(img); + + var obj = new scrawl(); + obj.btn2Highlight("J_removeImg"); + //trace 2457 + obj.btn2Highlight("J_sacleBoard"); + }; + img.src = url; + } else { + alert(state); + } +} + +//去掉遮罩层 +function removeMaskLayer() { + var maskLayer = $G("J_maskLayer"); + maskLayer.className = "maskLayerNull"; + maskLayer.innerHTML = ""; + dialog.buttons[0].setDisabled(false); +} + +//添加遮罩层 +function addMaskLayer(html) { + var maskLayer = $G("J_maskLayer"); + dialog.buttons[0].setDisabled(true); + maskLayer.className = "maskLayer"; + maskLayer.innerHTML = html; +} + +//执行确认按钮方法 +function exec(scrawlObj) { + if (scrawlObj.isScrawl) { + addMaskLayer(lang.scrawlUpLoading); + var base64 = scrawlObj.getCanvasData(); + if (!!base64) { + var options = { + timeout: 100000, + onsuccess: function (xhr) { + if (!scrawlObj.isCancelScrawl) { + var responseObj; + responseObj = eval("(" + xhr.responseText + ")"); + if (responseObj.state == "SUCCESS") { + var imgObj = {}, + url = editor.options.scrawlUrlPrefix + responseObj.url; + imgObj.src = url; + imgObj._src = url; + imgObj.alt = responseObj.original || ''; + imgObj.title = responseObj.title || ''; + editor.execCommand("insertImage", imgObj); + dialog.close(); + } else { + alert(responseObj.state); + } + + } + }, + onerror: function () { + alert(lang.imageError); + dialog.close(); + } + }; + options[editor.getOpt('scrawlFieldName')] = base64; + + var actionUrl = editor.getActionUrl(editor.getOpt('scrawlActionName')), + params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '', + url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?' : '&') + params); + ajax.request(url, options); + } + } else { + addMaskLayer(lang.noScarwl + "   "); + } +} + diff --git a/admin/dialogs/searchreplace/searchreplace.html b/admin/dialogs/searchreplace/searchreplace.html new file mode 100644 index 0000000..eba7c17 --- /dev/null +++ b/admin/dialogs/searchreplace/searchreplace.html @@ -0,0 +1,137 @@ + + + + + + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    :
    + +
    + + +
    +   +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    :
    :
    + +
    + + + + +
    +   +
    + +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/admin/dialogs/searchreplace/searchreplace.js b/admin/dialogs/searchreplace/searchreplace.js new file mode 100644 index 0000000..2c6417a --- /dev/null +++ b/admin/dialogs/searchreplace/searchreplace.js @@ -0,0 +1,168 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-9-26 + * Time: 下午12:29 + * To change this template use File | Settings | File Templates. + */ + +//清空上次查选的痕迹 +editor.firstForSR = 0; +editor.currentRangeForSR = null; + +//给tab注册切换事件 +/** + * tab点击处理事件 + * @param tabHeads + * @param tabBodys + * @param obj + */ +function clickHandler(tabHeads, tabBodys, obj) { + //head样式更改 + for (var k = 0, len = tabHeads.length; k < len; k++) { + tabHeads[k].className = ""; + } + obj.className = "focus"; + //body显隐 + var tabSrc = obj.getAttribute("tabSrc"); + for (var j = 0, length = tabBodys.length; j < length; j++) { + var body = tabBodys[j], + id = body.getAttribute("id"); + if (id != tabSrc) { + body.style.zIndex = 1; + } else { + body.style.zIndex = 200; + } + } + +} + +/** + * TAB切换 + * @param tabParentId tab的父节点ID或者对象本身 + */ +function switchTab(tabParentId) { + var tabElements = $G(tabParentId).children, + tabHeads = tabElements[0].children, + tabBodys = tabElements[1].children; + + for (var i = 0, length = tabHeads.length; i < length; i++) { + var head = tabHeads[i]; + if (head.className === "focus") clickHandler(tabHeads, tabBodys, head); + head.onclick = function () { + clickHandler(tabHeads, tabBodys, this); + } + } +} + +$G('searchtab').onmousedown = function () { + $G('search-msg').innerHTML = ''; + $G('replace-msg').innerHTML = '' +} + +//是否区分大小写 +function getMatchCase(id) { + return $G(id).checked ? true : false; +} + +//查找 +$G("nextFindBtn").onclick = function (txt, dir, mcase) { + var findtxt = $G("findtxt").value, obj; + if (!findtxt) { + return false; + } + obj = { + searchStr: findtxt, + dir: 1, + casesensitive: getMatchCase("matchCase") + }; + if (!frCommond(obj)) { + var bk = editor.selection.getRange().createBookmark(); + $G('search-msg').innerHTML = lang.getEnd; + editor.selection.getRange().moveToBookmark(bk).select(); + + + } +}; +$G("nextReplaceBtn").onclick = function (txt, dir, mcase) { + var findtxt = $G("findtxt1").value, obj; + if (!findtxt) { + return false; + } + obj = { + searchStr: findtxt, + dir: 1, + casesensitive: getMatchCase("matchCase1") + }; + frCommond(obj); +}; +$G("preFindBtn").onclick = function (txt, dir, mcase) { + var findtxt = $G("findtxt").value, obj; + if (!findtxt) { + return false; + } + obj = { + searchStr: findtxt, + dir: -1, + casesensitive: getMatchCase("matchCase") + }; + if (!frCommond(obj)) { + $G('search-msg').innerHTML = lang.getStart; + } +}; +$G("preReplaceBtn").onclick = function (txt, dir, mcase) { + var findtxt = $G("findtxt1").value, obj; + if (!findtxt) { + return false; + } + obj = { + searchStr: findtxt, + dir: -1, + casesensitive: getMatchCase("matchCase1") + }; + frCommond(obj); +}; +//替换 +$G("repalceBtn").onclick = function () { + var findtxt = $G("findtxt1").value.replace(/^\s|\s$/g, ""), obj, + replacetxt = $G("replacetxt").value.replace(/^\s|\s$/g, ""); + if (!findtxt) { + return false; + } + if (findtxt == replacetxt || (!getMatchCase("matchCase1") && findtxt.toLowerCase() == replacetxt.toLowerCase())) { + return false; + } + obj = { + searchStr: findtxt, + dir: 1, + casesensitive: getMatchCase("matchCase1"), + replaceStr: replacetxt + }; + frCommond(obj); +}; +//全部替换 +$G("repalceAllBtn").onclick = function () { + var findtxt = $G("findtxt1").value.replace(/^\s|\s$/g, ""), obj, + replacetxt = $G("replacetxt").value.replace(/^\s|\s$/g, ""); + if (!findtxt) { + return false; + } + if (findtxt == replacetxt || (!getMatchCase("matchCase1") && findtxt.toLowerCase() == replacetxt.toLowerCase())) { + return false; + } + obj = { + searchStr: findtxt, + casesensitive: getMatchCase("matchCase1"), + replaceStr: replacetxt, + all: true + }; + var num = frCommond(obj); + if (num) { + $G('replace-msg').innerHTML = lang.countMsg.replace("{#count}", num); + } +}; +//执行 +var frCommond = function (obj) { + return editor.execCommand("searchreplace", obj); +}; +switchTab("searchtab"); \ No newline at end of file diff --git a/admin/dialogs/snapscreen/snapscreen.html b/admin/dialogs/snapscreen/snapscreen.html new file mode 100644 index 0000000..bd77e8a --- /dev/null +++ b/admin/dialogs/snapscreen/snapscreen.html @@ -0,0 +1,90 @@ + + + + + + + + + +
    +

    +
    +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/dialogs/spechars/spechars.html b/admin/dialogs/spechars/spechars.html new file mode 100644 index 0000000..76262ec --- /dev/null +++ b/admin/dialogs/spechars/spechars.html @@ -0,0 +1,42 @@ + + + + + + + + + +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/admin/dialogs/spechars/spechars.js b/admin/dialogs/spechars/spechars.js new file mode 100644 index 0000000..be1902d --- /dev/null +++ b/admin/dialogs/spechars/spechars.js @@ -0,0 +1,86 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-9-26 + * Time: 下午1:09 + * To change this template use File | Settings | File Templates. + */ +var charsContent = [ + { + name: "tsfh", + title: lang.tsfh, + content: toArray("、,。,·,ˉ,ˇ,¨,〃,々,—,~,‖,…,‘,’,“,”,〔,〕,〈,〉,《,》,「,」,『,』,〖,〗,【,】,±,×,÷,∶,∧,∨,∑,∏,∪,∩,∈,∷,√,⊥,∥,∠,⌒,⊙,∫,∮,≡,≌,≈,∽,∝,≠,≮,≯,≤,≥,∞,∵,∴,♂,♀,°,′,″,℃,$,¤,¢,£,‰,§,№,☆,★,○,●,◎,◇,◆,□,■,△,▲,※,→,←,↑,↓,〓,〡,〢,〣,〤,〥,〦,〧,〨,〩,㊣,㎎,㎏,㎜,㎝,㎞,㎡,㏄,㏎,㏑,㏒,㏕,︰,¬,¦,℡,ˊ,ˋ,˙,–,―,‥,‵,℅,℉,↖,↗,↘,↙,∕,∟,∣,≒,≦,≧,⊿,═,║,╒,╓,╔,╕,╖,╗,╘,╙,╚,╛,╜,╝,╞,╟,╠,╡,╢,╣,╤,╥,╦,╧,╨,╩,╪,╫,╬,╭,╮,╯,╰,╱,╲,╳,▁,▂,▃,▄,▅,▆,▇,�,█,▉,▊,▋,▌,▍,▎,▏,▓,▔,▕,▼,▽,◢,◣,◤,◥,☉,⊕,〒,〝,〞") + }, + {name: "lmsz", title: lang.lmsz, content: toArray("ⅰ,ⅱ,ⅲ,ⅳ,ⅴ,ⅵ,ⅶ,ⅷ,ⅸ,ⅹ,Ⅰ,Ⅱ,Ⅲ,Ⅳ,Ⅴ,Ⅵ,Ⅶ,Ⅷ,Ⅸ,Ⅹ,Ⅺ,Ⅻ")}, + { + name: "szfh", + title: lang.szfh, + content: toArray("⒈,⒉,⒊,⒋,⒌,⒍,⒎,⒏,⒐,⒑,⒒,⒓,⒔,⒕,⒖,⒗,⒘,⒙,⒚,⒛,⑴,⑵,⑶,⑷,⑸,⑹,⑺,⑻,⑼,⑽,⑾,⑿,⒀,⒁,⒂,⒃,⒄,⒅,⒆,⒇,①,②,③,④,⑤,⑥,⑦,⑧,⑨,⑩,㈠,㈡,㈢,㈣,㈤,㈥,㈦,㈧,㈨,㈩") + }, + { + name: "rwfh", + title: lang.rwfh, + content: toArray("ぁ,あ,ぃ,い,ぅ,う,ぇ,え,ぉ,お,か,が,き,ぎ,く,ぐ,け,げ,こ,ご,さ,ざ,し,じ,す,ず,せ,ぜ,そ,ぞ,た,だ,ち,ぢ,っ,つ,づ,て,で,と,ど,な,に,ぬ,ね,の,は,ば,ぱ,ひ,び,ぴ,ふ,ぶ,ぷ,へ,べ,ぺ,ほ,ぼ,ぽ,ま,み,む,め,も,ゃ,や,ゅ,ゆ,ょ,よ,ら,り,る,れ,ろ,ゎ,わ,ゐ,ゑ,を,ん,ァ,ア,ィ,イ,ゥ,ウ,ェ,エ,ォ,オ,カ,ガ,キ,ギ,ク,グ,ケ,ゲ,コ,ゴ,サ,ザ,シ,ジ,ス,ズ,セ,ゼ,ソ,ゾ,タ,ダ,チ,ヂ,ッ,ツ,ヅ,テ,デ,ト,ド,ナ,ニ,ヌ,ネ,ノ,ハ,バ,パ,ヒ,ビ,ピ,フ,ブ,プ,ヘ,ベ,ペ,ホ,ボ,ポ,マ,ミ,ム,メ,モ,ャ,ヤ,ュ,ユ,ョ,ヨ,ラ,リ,ル,レ,ロ,ヮ,ワ,ヰ,ヱ,ヲ,ン,ヴ,ヵ,ヶ") + }, + { + name: "xlzm", + title: lang.xlzm, + content: toArray("Α,Β,Γ,Δ,Ε,Ζ,Η,Θ,Ι,Κ,Λ,Μ,Ν,Ξ,Ο,Π,Ρ,Σ,Τ,Υ,Φ,Χ,Ψ,Ω,α,β,γ,δ,ε,ζ,η,θ,ι,κ,λ,μ,ν,ξ,ο,π,ρ,σ,τ,υ,φ,χ,ψ,ω") + }, + { + name: "ewzm", + title: lang.ewzm, + content: toArray("А,Б,В,Г,Д,Е,Ё,Ж,З,И,Й,К,Л,М,Н,О,П,Р,С,Т,У,Ф,Х,Ц,Ч,Ш,Щ,Ъ,Ы,Ь,Э,Ю,Я,а,б,в,г,д,е,ё,ж,з,и,й,к,л,м,н,о,п,р,с,т,у,ф,х,ц,ч,ш,щ,ъ,ы,ь,э,ю,я") + }, + {name: "pyzm", title: lang.pyzm, content: toArray("ā,á,ǎ,à,ē,é,ě,è,ī,í,ǐ,ì,ō,ó,ǒ,ò,ū,ú,ǔ,ù,ǖ,ǘ,ǚ,ǜ,ü")}, + { + name: "yyyb", + title: lang.yyyb, + content: toArray("i:,i,e,æ,ʌ,ə:,ə,u:,u,ɔ:,ɔ,a:,ei,ai,ɔi,əu,au,iə,εə,uə,p,t,k,b,d,g,f,s,ʃ,θ,h,v,z,ʒ,ð,tʃ,tr,ts,dʒ,dr,dz,m,n,ŋ,l,r,w,j,") + }, + { + name: "zyzf", + title: lang.zyzf, + content: toArray("ㄅ,ㄆ,ㄇ,ㄈ,ㄉ,ㄊ,ㄋ,ㄌ,ㄍ,ㄎ,ㄏ,ㄐ,ㄑ,ㄒ,ㄓ,ㄔ,ㄕ,ㄖ,ㄗ,ㄘ,ㄙ,ㄚ,ㄛ,ㄜ,ㄝ,ㄞ,ㄟ,ㄠ,ㄡ,ㄢ,ㄣ,ㄤ,ㄥ,ㄦ,ㄧ,ㄨ") + } +]; +(function createTab(content) { + for (var i = 0, ci; ci = content[i++];) { + var span = document.createElement("span"); + span.setAttribute("tabSrc", ci.name); + span.innerHTML = ci.title; + if (i == 1) span.className = "focus"; + domUtils.on(span, "click", function () { + var tmps = $G("tabHeads").children; + for (var k = 0, sk; sk = tmps[k++];) { + sk.className = ""; + } + tmps = $G("tabBodys").children; + for (var k = 0, sk; sk = tmps[k++];) { + sk.style.display = "none"; + } + this.className = "focus"; + $G(this.getAttribute("tabSrc")).style.display = ""; + }); + $G("tabHeads").appendChild(span); + domUtils.insertAfter(span, document.createTextNode("\n")); + var div = document.createElement("div"); + div.id = ci.name; + div.style.display = (i == 1) ? "" : "none"; + var cons = ci.content; + for (var j = 0, con; con = cons[j++];) { + var charSpan = document.createElement("span"); + charSpan.innerHTML = con; + domUtils.on(charSpan, "click", function () { + editor.execCommand("insertHTML", this.innerHTML); + dialog.close(); + }); + div.appendChild(charSpan); + } + $G("tabBodys").appendChild(div); + } +})(charsContent); + +function toArray(str) { + return str.split(","); +} diff --git a/admin/dialogs/table/dragicon.png b/admin/dialogs/table/dragicon.png new file mode 100644 index 0000000000000000000000000000000000000000..f26203bf3f0026891fc8374f109724a69eb38b22 GIT binary patch literal 304 zcmV-00nh%4P)p00001b5ch_0Itp) z=>Px#=t)FDR47x8lCciKP#A@KY2U+Oz-BN?3|$yZoaJ-YrY6>w+wB>;0|AN6r2r z_B6y2bQp%1X$_7DP`QFiq0z;_c3wk<3Lh&$^V;p?#e$PywxH71VT^XlHZ=jml#@|NVkRMLVaC0F_%) zcB=vWe$h}nSjAV$|0D + + + + + + + +
    +
    +
    +

    +
      +
    • + +
    • +
    • + +
    • +
    +
      +
    • + +
    • +
    • + +
    • +
    +
    +
    +
    +

    +
      +
    • + +
    • +
    • + +
    • +
    +
    +
    +
    +

    +
      +
    • + + +
    • +
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/admin/dialogs/table/edittable.js b/admin/dialogs/table/edittable.js new file mode 100644 index 0000000..5ec3d32 --- /dev/null +++ b/admin/dialogs/table/edittable.js @@ -0,0 +1,241 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-12-19 + * Time: 下午4:55 + * To change this template use File | Settings | File Templates. + */ +(function () { + var title = $G("J_title"), + titleCol = $G("J_titleCol"), + caption = $G("J_caption"), + sorttable = $G("J_sorttable"), + autoSizeContent = $G("J_autoSizeContent"), + autoSizePage = $G("J_autoSizePage"), + tone = $G("J_tone"), + me, + preview = $G("J_preview"); + + var editTable = function () { + me = this; + me.init(); + }; + editTable.prototype = { + init: function () { + var colorPiker = new UE.ui.ColorPicker({ + editor: editor + }), + colorPop = new UE.ui.Popup({ + editor: editor, + content: colorPiker + }); + + title.checked = editor.queryCommandState("inserttitle") == -1; + titleCol.checked = editor.queryCommandState("inserttitlecol") == -1; + caption.checked = editor.queryCommandState("insertcaption") == -1; + sorttable.checked = editor.queryCommandState("enablesort") == 1; + + var enablesortState = editor.queryCommandState("enablesort"), + disablesortState = editor.queryCommandState("disablesort"); + + sorttable.checked = !!(enablesortState < 0 && disablesortState >= 0); + sorttable.disabled = !!(enablesortState < 0 && disablesortState < 0); + sorttable.title = enablesortState < 0 && disablesortState < 0 ? lang.errorMsg : ''; + + me.createTable(title.checked, titleCol.checked, caption.checked); + me.setAutoSize(); + me.setColor(me.getColor()); + + domUtils.on(title, "click", me.titleHanler); + domUtils.on(titleCol, "click", me.titleColHanler); + domUtils.on(caption, "click", me.captionHanler); + domUtils.on(sorttable, "click", me.sorttableHanler); + domUtils.on(autoSizeContent, "click", me.autoSizeContentHanler); + domUtils.on(autoSizePage, "click", me.autoSizePageHanler); + + domUtils.on(tone, "click", function () { + colorPop.showAnchor(tone); + }); + domUtils.on(document, 'mousedown', function () { + colorPop.hide(); + }); + colorPiker.addListener("pickcolor", function () { + me.setColor(arguments[1]); + colorPop.hide(); + }); + colorPiker.addListener("picknocolor", function () { + me.setColor(""); + colorPop.hide(); + }); + }, + + createTable: function (hasTitle, hasTitleCol, hasCaption) { + var arr = [], + sortSpan = '^'; + arr.push(""); + if (hasCaption) { + arr.push("") + } + if (hasTitle) { + arr.push(""); + if (hasTitleCol) { + arr.push(""); + } + for (var j = 0; j < 5; j++) { + arr.push(""); + } + arr.push(""); + } + for (var i = 0; i < 6; i++) { + arr.push(""); + if (hasTitleCol) { + arr.push("") + } + for (var k = 0; k < 5; k++) { + arr.push("") + } + arr.push(""); + } + arr.push("
    " + lang.captionName + "
    " + lang.titleName + "" + lang.titleName + "
    " + lang.titleName + "" + lang.cellsName + "
    "); + preview.innerHTML = arr.join(""); + this.updateSortSpan(); + }, + titleHanler: function () { + var example = $G("J_example"), + frg = document.createDocumentFragment(), + color = domUtils.getComputedStyle(domUtils.getElementsByTagName(example, "td")[0], "border-color"), + colCount = example.rows[0].children.length; + + if (title.checked) { + example.insertRow(0); + for (var i = 0, node; i < colCount; i++) { + node = document.createElement("th"); + node.innerHTML = lang.titleName; + frg.appendChild(node); + } + example.rows[0].appendChild(frg); + + } else { + domUtils.remove(example.rows[0]); + } + me.setColor(color); + me.updateSortSpan(); + }, + titleColHanler: function () { + var example = $G("J_example"), + color = domUtils.getComputedStyle(domUtils.getElementsByTagName(example, "td")[0], "border-color"), + colArr = example.rows, + colCount = colArr.length; + + if (titleCol.checked) { + for (var i = 0, node; i < colCount; i++) { + node = document.createElement("th"); + node.innerHTML = lang.titleName; + colArr[i].insertBefore(node, colArr[i].children[0]); + } + } else { + for (var i = 0; i < colCount; i++) { + domUtils.remove(colArr[i].children[0]); + } + } + me.setColor(color); + me.updateSortSpan(); + }, + captionHanler: function () { + var example = $G("J_example"); + if (caption.checked) { + var row = document.createElement('caption'); + row.innerHTML = lang.captionName; + example.insertBefore(row, example.firstChild); + } else { + domUtils.remove(domUtils.getElementsByTagName(example, 'caption')[0]); + } + }, + sorttableHanler: function () { + me.updateSortSpan(); + }, + autoSizeContentHanler: function () { + var example = $G("J_example"); + example.removeAttribute("width"); + }, + autoSizePageHanler: function () { + var example = $G("J_example"); + var tds = example.getElementsByTagName(example, "td"); + utils.each(tds, function (td) { + td.removeAttribute("width"); + }); + example.setAttribute('width', '100%'); + }, + updateSortSpan: function () { + var example = $G("J_example"), + row = example.rows[0]; + + var spans = domUtils.getElementsByTagName(example, "span"); + utils.each(spans, function (span) { + span.parentNode.removeChild(span); + }); + if (sorttable.checked) { + utils.each(row.cells, function (cell, i) { + var span = document.createElement("span"); + span.innerHTML = "^"; + cell.appendChild(span); + }); + } + }, + getColor: function () { + var start = editor.selection.getStart(), color, + cell = domUtils.findParentByTagName(start, ["td", "th", "caption"], true); + color = cell && domUtils.getComputedStyle(cell, "border-color"); + if (!color) color = "#DDDDDD"; + return color; + }, + setColor: function (color) { + var example = $G("J_example"), + arr = domUtils.getElementsByTagName(example, "td").concat( + domUtils.getElementsByTagName(example, "th"), + domUtils.getElementsByTagName(example, "caption") + ); + + tone.value = color; + utils.each(arr, function (node) { + node.style.borderColor = color; + }); + + }, + setAutoSize: function () { + var me = this; + autoSizePage.checked = true; + me.autoSizePageHanler(); + } + }; + + new editTable; + + dialog.onok = function () { + editor.__hasEnterExecCommand = true; + + var checks = { + title: "inserttitle deletetitle", + titleCol: "inserttitlecol deletetitlecol", + caption: "insertcaption deletecaption", + sorttable: "enablesort disablesort" + }; + editor.fireEvent('saveScene'); + for (var i in checks) { + var cmds = checks[i].split(" "), + input = $G("J_" + i); + if (input["checked"]) { + editor.queryCommandState(cmds[0]) != -1 && editor.execCommand(cmds[0]); + } else { + editor.queryCommandState(cmds[1]) != -1 && editor.execCommand(cmds[1]); + } + } + + editor.execCommand("edittable", tone.value); + autoSizeContent.checked ? editor.execCommand('adaptbytext') : ""; + autoSizePage.checked ? editor.execCommand("adaptbywindow") : ""; + editor.fireEvent('saveScene'); + + editor.__hasEnterExecCommand = false; + }; +})(); \ No newline at end of file diff --git a/admin/dialogs/table/edittd.html b/admin/dialogs/table/edittd.html new file mode 100644 index 0000000..8be85f6 --- /dev/null +++ b/admin/dialogs/table/edittd.html @@ -0,0 +1,62 @@ + + + + + + + + +
    + + +
    + + + \ No newline at end of file diff --git a/admin/dialogs/table/edittip.html b/admin/dialogs/table/edittip.html new file mode 100644 index 0000000..954f7bb --- /dev/null +++ b/admin/dialogs/table/edittip.html @@ -0,0 +1,33 @@ + + + + 表格删除提示 + + + + +
    +
    + +
    +
    + +
    +
    + + + \ No newline at end of file diff --git a/admin/dialogs/template/config.js b/admin/dialogs/template/config.js new file mode 100644 index 0000000..1999fb2 --- /dev/null +++ b/admin/dialogs/template/config.js @@ -0,0 +1,42 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-8-8 + * Time: 下午2:00 + * To change this template use File | Settings | File Templates. + */ +var templates = [ + { + "pre": "pre0.png", + 'title': lang.blank, + 'preHtml': '

     欢迎使用UEditor!

    ', + "html": '

    欢迎使用UEditor!

    ' + + }, + { + "pre": "pre1.png", + 'title': lang.blog, + 'preHtml': '

    深入理解Range

    UEditor二次开发

    什么是Range

    对于“插入”选项卡上的库,在设计时都充分考虑了其中的项与文档整体外观的协调性。


    Range能干什么

    在“开始”选项卡上,通过从快速样式库中为所选文本选择一种外观,您可以方便地更改文档中所选文本的格式。

    ', + "html": '

    [键入文档标题]

    [键入文档副标题]

    [标题 1]

    对于“插入”选项卡上的库,在设计时都充分考虑了其中的项与文档整体外观的协调性。 您可以使用这些库来插入表格、页眉、页脚、列表、封面以及其他文档构建基块。 您创建的图片、图表或关系图也将与当前的文档外观协调一致。

    [标题 2]

    在“开始”选项卡上,通过从快速样式库中为所选文本选择一种外观,您可以方便地更改文档中所选文本的格式。 您还可以使用“开始”选项卡上的其他控件来直接设置文本格式。大多数控件都允许您选择是使用当前主题外观,还是使用某种直接指定的格式。

    [标题 3]

    对于“插入”选项卡上的库,在设计时都充分考虑了其中的项与文档整体外观的协调性。 您可以使用这些库来插入表格、页眉、页脚、列表、封面以及其他文档构建基块。 您创建的图片、图表或关系图也将与当前的文档外观协调一致。


    ' + + }, + { + "pre": "pre2.png", + 'title': lang.resume, + 'preHtml': '

    WEB前端开发简历

    插

    入

    照

    片

    联系电话:[键入您的电话]

    电子邮件:[键入您的电子邮件地址]

    家庭住址:[键入您的地址]

    目标职位

    WEB前端研发工程师

    学历

    1. [起止时间] [学校名称] [所学专业] [所获学位]

    工作经验


    ', + "html": '

    [此处键入简历标题]


    【此处插入照片】


    联系电话:[键入您的电话]


    电子邮件:[键入您的电子邮件地址]


    家庭住址:[键入您的地址]


    目标职位

    [此处键入您的期望职位]

    学历

    1. [键入起止时间] [键入学校名称] [键入所学专业] [键入所获学位]

    2. [键入起止时间] [键入学校名称] [键入所学专业] [键入所获学位]

    工作经验

    1. [键入起止时间] [键入公司名称] [键入职位名称]

      1. [键入负责项目] [键入项目简介]

      2. [键入负责项目] [键入项目简介]

    2. [键入起止时间] [键入公司名称] [键入职位名称]

      1. [键入负责项目] [键入项目简介]

    掌握技能

     [这里可以键入您所掌握的技能]

    ' + + }, + { + "pre": "pre3.png", + 'title': lang.richText, + 'preHtml': '

    [此处键入文章标题]

    图文混排方法

    图片居左,文字围绕图片排版

    方法:在文字前面插入图片,设置居左对齐,然后即可在右边输入多行文


    还有没有什么其他的环绕方式呢?这里是居右环绕


    欢迎大家多多尝试,为UEditor提供更多高质量模板!

    ', + "html": '


    [此处键入文章标题]

    图文混排方法

    1. 图片居左,文字围绕图片排版

    方法:在文字前面插入图片,设置居左对齐,然后即可在右边输入多行文本


    2. 图片居右,文字围绕图片排版

    方法:在文字前面插入图片,设置居右对齐,然后即可在左边输入多行文本


    3. 图片居中环绕排版

    方法:亲,这个真心没有办法。。。



    还有没有什么其他的环绕方式呢?这里是居右环绕


    欢迎大家多多尝试,为UEditor提供更多高质量模板!


    占位


    占位


    占位


    占位


    占位



    ' + }, + { + "pre": "pre4.png", + 'title': lang.sciPapers, + 'preHtml': '

    [键入文章标题]

    摘要:这里可以输入很长很长很长很长很长很长很长很长很差的摘要

    标题 1

    这里可以输入很多内容,可以图文混排,可以有列表等。

    标题 2

    1. 列表 1

    2. 列表 2

      1. 多级列表 1

      2. 多级列表 2

    3. 列表 3

    标题 3

    来个文字图文混排的


    ', + 'html': '

    [键入文章标题]

    摘要:这里可以输入很长很长很长很长很长很长很长很长很差的摘要

    标题 1

    这里可以输入很多内容,可以图文混排,可以有列表等。

    标题 2

    来个列表瞅瞅:

    1. 列表 1

    2. 列表 2

      1. 多级列表 1

      2. 多级列表 2

    3. 列表 3

    标题 3

    来个文字图文混排的

    这里可以多行

    右边是图片

    绝对没有问题的,不信你也可以试试看


    ' + } +]; \ No newline at end of file diff --git a/admin/dialogs/template/images/bg.gif b/admin/dialogs/template/images/bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..8c1d10ad1933e02086e8a1b3c807c7d1e57d51db GIT binary patch literal 84 zcmZ?wbhEHb6kw2GXkcLY|NsA)GiMZkvM_*v4u}BBFfeKN|6H_V+Po~-c70vN1t=1+A%PQ29uxwx4>qZSNmg$Vo0WSSm;`Hl{Ww|6H_V+Po~-c6&>|-aSW-r_2!NtU#o%$i-Y0&su(f8j@G?~f`NtGer^@M zrYdIdrP)2_bk~ELr2i)^H(PkDy?QdpIbuVC@BX&$s!L5iRYqm|O_N&n@I;(N<+i7f+;9Z? Phk?P<)z4*}Q$iB}^elK+ literal 0 HcmV?d00001 diff --git a/admin/dialogs/template/images/pre2.png b/admin/dialogs/template/images/pre2.png new file mode 100644 index 0000000000000000000000000000000000000000..5a55672c1f9c4d41d5b5cf52d76bb2b7e7c6b186 GIT binary patch literal 394 zcmeAS@N?(olHy`uVBq!ia0vp^DM0MT!2~3?K3Qf5q$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;1Ffi(Px;TbZ+h>KHoj_IVWAxIr&Fiabo)3x94Up%M35SEe^0#X9dS;F-9{&3Ljos=IM}2LB&w>e?K^KZ|9tHA z)W~h}eTfo>R&7s^?LYqdE7+t-Dv4L4H{``lKYf(JYIB0^>jrz9Khf>{)o!mlw-~mt za!)h6<9vO9zW09 gTfg@IqFVdQ&MBb@0QJAA?EnA( literal 0 HcmV?d00001 diff --git a/admin/dialogs/template/images/pre3.png b/admin/dialogs/template/images/pre3.png new file mode 100644 index 0000000000000000000000000000000000000000..d852d29f13bcf743e15df824901ab568123a5aae GIT binary patch literal 485 zcmVTEH>0M4JV5-1QxJ>b$K`ZPMW6ena#ScoGi+aGE}QBI9b2~7O)VofCVgI z0Sj2@r|V8tRYg%8l35(bVHm0eOOPtd@{r7;D7wSi^O|UT7k&b(?|avE4}m2@pKY0^ zX8{XXz`D@ra0V&khG!6NNY4Tm0v50s9T*)L9q3sISir&!aYH5D@CmFqjy=yiBr_3O zu`P1E)qr;HnlAuCCeD2n8T2!dey#!;npC;SpUiv|xYU?E`rwKTr@$H|hS bPXPu1`Qm#ITgjGb00000NkvXXu0mjf8+_C8 literal 0 HcmV?d00001 diff --git a/admin/dialogs/template/images/pre4.png b/admin/dialogs/template/images/pre4.png new file mode 100644 index 0000000000000000000000000000000000000000..0d7bc72ab99fe2c0ed9de1d89fd1c3e82ac3fd43 GIT binary patch literal 393 zcmeAS@N?(olHy`uVBq!ia0vp^DM0MT!2~3?K3Qf5q$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;1FfeL+x;TbZ+5xOQzYV@t-I~V=Oc$U@%9?>h?uf)>*!tD zz9*sh?!vZ&M%HQV5wX`#zTA@g`shVPPoZs!AO#y_jv5_v2~@eKa{lwdV71lh?Z-1u+JRxq;OXk;vd$@?2>^GKp!om* literal 0 HcmV?d00001 diff --git a/admin/dialogs/template/template.css b/admin/dialogs/template/template.css new file mode 100644 index 0000000..aba5f30 --- /dev/null +++ b/admin/dialogs/template/template.css @@ -0,0 +1,99 @@ +.wrap { + padding: 5px; + font-size: 14px; +} + +.left { + width: 425px; + float: left; +} + +.right { + width: 160px; + border: 1px solid #ccc; + float: right; + padding: 5px; + margin-right: 5px; +} + +.right .pre { + height: 332px; + overflow-y: auto; +} + +.right .preitem { + border: white 1px solid; + margin: 5px 0; + padding: 2px 0; +} + +.right .preitem:hover { + background-color: lemonChiffon; + cursor: pointer; + border: #ccc 1px solid; +} + +.right .preitem img { + display: block; + margin: 0 auto; + width: 100px; +} + +.clear { + clear: both; +} + +.top { + height: 26px; + line-height: 26px; + padding: 5px; +} + +.bottom { + height: 320px; + width: 100%; + margin: 0 auto; +} + +.transparent { + background: url("images/bg.gif") repeat; +} + +.bottom table tr td { + border: 1px dashed #ccc; +} + +#colorPicker { + width: 17px; + height: 17px; + border: 1px solid #CCC; + display: inline-block; + border-radius: 3px; + box-shadow: 2px 2px 5px #D3D6DA; +} + +.border_style1 { + padding: 2px; + border: 1px solid #ccc; + border-radius: 5px; + box-shadow: 2px 2px 5px #d3d6da; +} + +p { + margin: 5px 0 +} + +table { + clear: both; + margin-bottom: 10px; + border-collapse: collapse; + word-break: break-all; +} + +li { + clear: both +} + +ol { + padding-left: 40px; +} \ No newline at end of file diff --git a/admin/dialogs/template/template.html b/admin/dialogs/template/template.html new file mode 100644 index 0000000..0ac9c22 --- /dev/null +++ b/admin/dialogs/template/template.html @@ -0,0 +1,26 @@ + + + + + + + + + +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + + + + diff --git a/admin/dialogs/template/template.js b/admin/dialogs/template/template.js new file mode 100644 index 0000000..e2fa747 --- /dev/null +++ b/admin/dialogs/template/template.js @@ -0,0 +1,53 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-8-8 + * Time: 下午2:09 + * To change this template use File | Settings | File Templates. + */ +(function () { + var me = editor, + preview = $G("preview"), + preitem = $G("preitem"), + tmps = templates, + currentTmp; + var initPre = function () { + var str = ""; + for (var i = 0, tmp; tmp = tmps[i++];) { + str += '
    '; + } + preitem.innerHTML = str; + }; + var pre = function (n) { + var tmp = tmps[n - 1]; + currentTmp = tmp; + clearItem(); + domUtils.setStyles(preitem.childNodes[n - 1], { + "background-color": "lemonChiffon", + "border": "#ccc 1px solid" + }); + preview.innerHTML = tmp.preHtml ? tmp.preHtml : ""; + }; + var clearItem = function () { + var items = preitem.children; + for (var i = 0, item; item = items[i++];) { + domUtils.setStyles(item, { + "background-color": "", + "border": "white 1px solid" + }); + } + }; + dialog.onok = function () { + if (!$G("issave").checked) { + me.execCommand("cleardoc"); + } + var obj = { + html: currentTmp && currentTmp.html + }; + me.execCommand("template", obj); + }; + initPre(); + window.pre = pre; + pre(2) + +})(); \ No newline at end of file diff --git a/admin/dialogs/video/images/bg.png b/admin/dialogs/video/images/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..580be0a01dff4c70c72f78a3f40186660ee8eee0 GIT binary patch literal 2810 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 Bm*4;Z literal 0 HcmV?d00001 diff --git a/admin/dialogs/video/images/file-icons.gif b/admin/dialogs/video/images/file-icons.gif new file mode 100644 index 0000000000000000000000000000000000000000..d8c02c27e242f0584fc6b214f35b4f6d8caec332 GIT binary patch literal 20097 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 literal 0 HcmV?d00001 diff --git a/admin/dialogs/video/images/file-icons.png b/admin/dialogs/video/images/file-icons.png new file mode 100644 index 0000000000000000000000000000000000000000..3ff82c8c488f53a7aff67fbe39742e3321183eca GIT binary patch literal 44070 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

    *vGSxI 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 literal 0 HcmV?d00001 diff --git a/admin/dialogs/video/images/icons.gif b/admin/dialogs/video/images/icons.gif new file mode 100644 index 0000000000000000000000000000000000000000..78459dea7b12ccbeec81d19ecdab22b1658e93b4 GIT binary patch literal 453 zcmZ?wbhEHbbY#$A*vtR||Ns9FJNP^N(4UCIf1{56|NHmvpFe+o|NadW2g{=nia%Kx z85lSjbU>mYGZarn*x(aH@fLZq!wgUiaA+%BrQuMGlI(3v}$4ket=c%G-JG_a6@d zUMtW1Dv_dMk(#;&JDULU);6IIt*+RD80Beh(v#{r8-@JE7rOMyrKZ@`PM+5- zK4PEn@UifH&1a7opNKNDvAy~H((Lt@PiCLrh`sqL^yyzFM}*_N9gV+*y1bvCcd{tw zP+atQ`ojjtR_?nOH&4iCw(0v^v}@~SfpwBi-JHA%0-p_?kEd#ga=ENn_|&M5?L?$c z!i1+jT>6R+ul!uQ+^$n$Hm~o7%Nb0wJ#GK7NE~>4aE?#6+>{R=oUZeJnouMg`B^J) rUi3;Xl^IQMkE|4#X6EZ{`gBG$ultcLuMHMNRKNMR>qv$%6N5DXx{1lO literal 0 HcmV?d00001 diff --git a/admin/dialogs/video/images/icons.png b/admin/dialogs/video/images/icons.png new file mode 100644 index 0000000000000000000000000000000000000000..12e4700163ac87fa38ae3d92a2c39d0fb4690fed GIT binary patch literal 2678 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 literal 0 HcmV?d00001 diff --git a/admin/dialogs/video/images/left_focus.jpg b/admin/dialogs/video/images/left_focus.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7886d276dda2e0aecdae22393eac534ed507babf GIT binary patch literal 11423 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 T+mF>-Zi@@LHB9%bmHhD^k7NPf literal 0 HcmV?d00001 diff --git a/admin/dialogs/video/images/none_focus.jpg b/admin/dialogs/video/images/none_focus.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7c768dcb47aaa289135afd2bd0e8eb0b6ecb7536 GIT binary patch literal 11546 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 C61Fb@ literal 0 HcmV?d00001 diff --git a/admin/dialogs/video/images/right_focus.jpg b/admin/dialogs/video/images/right_focus.jpg new file mode 100644 index 0000000000000000000000000000000000000000..173e10d2d91026c7283566993afb2f3a0267ea40 GIT binary patch literal 11334 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 literal 0 HcmV?d00001 diff --git a/admin/dialogs/video/images/success.gif b/admin/dialogs/video/images/success.gif new file mode 100644 index 0000000000000000000000000000000000000000..8d4f3112b9d1df2147ed3b67d9736163dedd11e1 GIT binary patch literal 445 zcmZ?wbhEHb)L_tHxXJ(m|NsC0{`>#WKmY&!`~ULm|4%>v3rzVXIOUh{)L$ageu+>2 zB{Acd%*pZwE#>TlQSztb-KopJH+%!_|l-~7Ag*59?a z{_c7B@6_{ur(gU#_wwKE_y6vG`1j=VzZYNsfBgCX$DjXizW@L859r4KV8@~pia%Kx z85k@WbU+dyKQXY~a+p)#p(E9QVoA}-BeJtDJbfs+R&065YSGzOop#2q7tzUUTK@E- z1Qpqe*fm*b*T-Fam_8!ZPiJg?eRTb9ku+5;xVnw>Wr$>Ce}(b zvq{bgY~#~oR8Cparp&0%zbdUw!o*Z6ds70hP&$teqekA&7*16-748@%Mnl0vSqU6+ zOpICr!NSHY@7SLk+rBLP3&#jWP!Xxbb jiN%_{Rv%uKKTTNF#>acL^G5)OtDBg<-IWs>91PX~W`xy? literal 0 HcmV?d00001 diff --git a/admin/dialogs/video/images/success.png b/admin/dialogs/video/images/success.png new file mode 100644 index 0000000000000000000000000000000000000000..94f968dc8fd3c7ca8f6cb599d006ef3f23b62c7d GIT binary patch literal 1621 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m{l@EB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMwS&*t9 zlvO-#?>2=9ZF3nBND}m`vLFhHXsTY(OatnYqyQCInmZhe+73JqDfIV%MiQ6rPIL(9V zO~LIJBb<8mfsWA!MJ-ZP!-Rn82gHOYTp$OY^i%VI>AeV;u(vXbonl~MI_~M>7*cWT z%njcRVMh`65C6~Q2yI{K`NBQQh9heAinXE1(JfB=Ul%M;Ke#x6g%L8^f5l4Te zj&BcK1znDIyZS2~eC7F3K+}tVTa$=u*HTU0W4>0#`+Qf%|GkyBERBs#$Y}P@k7@U2 zd#*XsYr~WGeCA1uSK>2HTD)g9mP}Xrpg$+`K&8dx2JS~bjCx(hj5}1;-8qn2_>|?> zp{d+2q{I0hbQS!U-jOut`kSEi+IhQJGmBl4O%se*W?OGKZ0Mp?XmGnRgezL^8vCJ4 z#-ek9(R&%4!h+;oXA~Mtbyie=u#0PDiI#!iX`%2?^@kRL8ma*r6?+*}W4e|_8~J&& z+-+*Ub3{dDcAIF|!MTDz0#78qKYeaeVU$wDOOs3cR=e5FZ*O2e-6xc{Uu=$;!s>*M z>nZ|V>zUp8-oE6^wXjV+_UOvuE&SORr`;3hnBKu~e3rzlY@NRjD|5Ui2t>^@Ve7jy z)2vT>u1vesjJgG`f;l_n`FmbR~b^~{VzXB}7CdU_pt>lO9l=E;X#4<2bZu32r~J^e^%TSISQ_Qm$= z7d{rOo2%^RUGseJkpn9(MWszUQdl(i&RN5PBgZ0d#S7ZipShU3W`>Nsy6C#pCD*KW zyxHW%b?m|pr;dF;L$saa#oaeO`u=>jkXTjl9*cLEvOD!Jdr4ooKJW9gY7?D{e?uM^ z`_}E4`0yR0boA=9>3>WXzUH{&pDfpZ;_2xb=j*pKsk#WyD%J#5t{1#azeB z4SJq8H2*dJVX$xugZHVh{7U`u4@oM|quz5j-hRJi{qwh1k5uNqu`W>3HJG&Y^R}6R z$Gq-HPue$sd${oT*XKO8zN>Oe_%K^bZNm3^-vf7@5X# + + + + + + + + +

    + + + + + + + + + + + + \ No newline at end of file diff --git a/admin/dialogs/video/video.js b/admin/dialogs/video/video.js new file mode 100644 index 0000000..4f136da --- /dev/null +++ b/admin/dialogs/video/video.js @@ -0,0 +1,803 @@ +/** + * Created by JetBrains PhpStorm. + * User: taoqili + * Date: 12-2-20 + * Time: 上午11:19 + * To change this template use File | Settings | File Templates. + */ + +(function () { + + var video = {}, + uploadVideoList = [], + isModifyUploadVideo = false, + uploadFile; + + window.onload = function () { + $focus($G("videoUrl")); + initTabs(); + initVideo(); + initUpload(); + }; + + /* 初始化tab标签 */ + function initTabs() { + var tabs = $G('tabHeads').children; + for (var i = 0; i < tabs.length; i++) { + domUtils.on(tabs[i], "click", function (e) { + var j, bodyId, target = e.target || e.srcElement; + for (j = 0; j < tabs.length; j++) { + bodyId = tabs[j].getAttribute('data-content-id'); + if (tabs[j] == target) { + domUtils.addClass(tabs[j], 'focus'); + domUtils.addClass($G(bodyId), 'focus'); + } else { + domUtils.removeClasses(tabs[j], 'focus'); + domUtils.removeClasses($G(bodyId), 'focus'); + } + } + }); + } + } + + function initVideo() { + createAlignButton(["videoFloat", "upload_alignment"]); + addUrlChangeListener($G("videoUrl")); + addOkListener(); + + //编辑视频时初始化相关信息 + (function () { + var img = editor.selection.getRange().getClosedNode(), url; + if (img && img.className) { + var hasFakedClass = (img.className == "edui-faked-video"), + hasUploadClass = img.className.indexOf("edui-upload-video") != -1; + if (hasFakedClass || hasUploadClass) { + $G("videoUrl").value = url = img.getAttribute("_url"); + $G("videoWidth").value = img.width; + $G("videoHeight").value = img.height; + var align = domUtils.getComputedStyle(img, "float"), + parentAlign = domUtils.getComputedStyle(img.parentNode, "text-align"); + updateAlignButton(parentAlign === "center" ? "center" : align); + } + if (hasUploadClass) { + isModifyUploadVideo = true; + } + } + createPreviewVideo(url); + })(); + } + + /** + * 监听确认和取消两个按钮事件,用户执行插入或者清空正在播放的视频实例操作 + */ + function addOkListener() { + dialog.onok = function () { + $G("preview").innerHTML = ""; + var currentTab = findFocus("tabHeads", "tabSrc"); + switch (currentTab) { + case "video": + return insertSingle(); + break; + case "videoSearch": + return insertSearch("searchList"); + break; + case "upload": + return insertUpload(); + break; + } + }; + dialog.oncancel = function () { + $G("preview").innerHTML = ""; + }; + } + + /** + * 依据传入的align值更新按钮信息 + * @param align + */ + function updateAlignButton(align) { + var aligns = $G("videoFloat").children; + for (var i = 0, ci; ci = aligns[i++];) { + if (ci.getAttribute("name") == align) { + if (ci.className != "focus") { + ci.className = "focus"; + } + } else { + if (ci.className == "focus") { + ci.className = ""; + } + } + } + } + + /** + * 将单个视频信息插入编辑器中 + */ + function insertSingle() { + var width = $G("videoWidth"), + height = $G("videoHeight"), + url = $G('videoUrl').value, + align = findFocus("videoFloat", "name"); + if (!url) return false; + if (!checkNum([width, height])) return false; + editor.execCommand('insertvideo', { + url: convert_url(url), + width: width.value, + height: height.value, + align: align + }, isModifyUploadVideo ? 'upload' : null); + } + + /** + * 将元素id下的所有代表视频的图片插入编辑器中 + * @param id + */ + function insertSearch(id) { + var imgs = domUtils.getElementsByTagName($G(id), "img"), + videoObjs = []; + for (var i = 0, img; img = imgs[i++];) { + if (img.getAttribute("selected")) { + videoObjs.push({ + url: img.getAttribute("ue_video_url"), + width: 420, + height: 280, + align: "none" + }); + } + } + editor.execCommand('insertvideo', videoObjs); + } + + /** + * 找到id下具有focus类的节点并返回该节点下的某个属性 + * @param id + * @param returnProperty + */ + function findFocus(id, returnProperty) { + var tabs = $G(id).children, + property; + for (var i = 0, ci; ci = tabs[i++];) { + if (ci.className == "focus") { + property = ci.getAttribute(returnProperty); + break; + } + } + return property; + } + + function convert_url(url) { + if (!url) return ''; + url = utils.trim(url) + .replace(/v\.youku\.com\/v_show\/id_([\w\-=]+)\.html/i, 'player.youku.com/player.php/sid/$1/v.swf') + .replace(/(www\.)?youtube\.com\/watch\?v=([\w\-]+)/i, "www.youtube.com/v/$2") + .replace(/youtu.be\/(\w+)$/i, "www.youtube.com/v/$1") + .replace(/v\.ku6\.com\/.+\/([\w\.]+)\.html.*$/i, "player.ku6.com/refer/$1/v.swf") + .replace(/www\.56\.com\/u\d+\/v_([\w\-]+)\.html/i, "player.56.com/v_$1.swf") + .replace(/www.56.com\/w\d+\/play_album\-aid\-\d+_vid\-([^.]+)\.html/i, "player.56.com/v_$1.swf") + .replace(/v\.pps\.tv\/play_([\w]+)\.html.*$/i, "player.pps.tv/player/sid/$1/v.swf") + .replace(/www\.letv\.com\/ptv\/vplay\/([\d]+)\.html.*$/i, "i7.imgs.letv.com/player/swfPlayer.swf?id=$1&autoplay=0") + .replace(/www\.tudou\.com\/programs\/view\/([\w\-]+)\/?/i, "www.tudou.com/v/$1") + .replace(/v\.qq\.com\/cover\/[\w]+\/[\w]+\/([\w]+)\.html/i, "static.video.qq.com/TPout.swf?vid=$1") + .replace(/v\.qq\.com\/.+[\?\&]vid=([^&]+).*$/i, "static.video.qq.com/TPout.swf?vid=$1") + .replace(/my\.tv\.sohu\.com\/[\w]+\/[\d]+\/([\d]+)\.shtml.*$/i, "share.vrs.sohu.com/my/v.swf&id=$1"); + + return url; + } + + /** + * 检测传入的所有input框中输入的长宽是否是正数 + * @param nodes input框集合, + */ + function checkNum(nodes) { + for (var i = 0, ci; ci = nodes[i++];) { + var value = ci.value; + if (!isNumber(value) && value) { + alert(lang.numError); + ci.value = ""; + ci.focus(); + return false; + } + } + return true; + } + + /** + * 数字判断 + * @param value + */ + function isNumber(value) { + return /(0|^[1-9]\d*$)/.test(value); + } + + /** + * 创建图片浮动选择按钮 + * @param ids + */ + function createAlignButton(ids) { + for (var i = 0, ci; ci = ids[i++];) { + var floatContainer = $G(ci), + nameMaps = { + "none": lang['default'], + "left": lang.floatLeft, + "right": lang.floatRight, + "center": lang.block + }; + for (var j in nameMaps) { + var div = document.createElement("div"); + div.setAttribute("name", j); + if (j == "none") div.className = "focus"; + div.style.cssText = "background:url(images/" + j + "_focus.jpg);"; + div.setAttribute("title", nameMaps[j]); + floatContainer.appendChild(div); + } + switchSelect(ci); + } + } + + /** + * 选择切换 + * @param selectParentId + */ + function switchSelect(selectParentId) { + var selects = $G(selectParentId).children; + for (var i = 0, ci; ci = selects[i++];) { + domUtils.on(ci, "click", function () { + for (var j = 0, cj; cj = selects[j++];) { + cj.className = ""; + cj.removeAttribute && cj.removeAttribute("class"); + } + this.className = "focus"; + }) + } + } + + /** + * 监听url改变事件 + * @param url + */ + function addUrlChangeListener(url) { + if (browser.ie) { + url.onpropertychange = function () { + createPreviewVideo(this.value); + } + } else { + url.addEventListener("input", function () { + createPreviewVideo(this.value); + }, false); + } + } + + /** + * 根据url生成视频预览 + * @param url + */ + function createPreviewVideo(url) { + if (!url) return; + + var conUrl = convert_url(url); + + conUrl = utils.unhtmlForUrl(conUrl); + + $G("preview").innerHTML = '
    ' + lang.urlError + '
    ' + + '' + + ''; + } + + + /* 插入上传视频 */ + function insertUpload() { + var videoObjs = [], + uploadDir = editor.getOpt('videoUrlPrefix'), + width = parseInt($G('upload_width').value, 10) || 420, + height = parseInt($G('upload_height').value, 10) || 280, + align = findFocus("upload_alignment", "name") || 'none'; + for (var key in uploadVideoList) { + var file = uploadVideoList[key]; + videoObjs.push({ + url: uploadDir + file.url, + width: width, + height: height, + align: align + }); + } + + var count = uploadFile.getQueueCount(); + if (count) { + $('.info', '#queueList').html('' + '还有2个未上传文件'.replace(/[\d]/, count) + ''); + return false; + } else { + editor.execCommand('insertvideo', videoObjs, 'upload'); + } + } + + /*初始化上传标签*/ + function initUpload() { + uploadFile = new UploadFile('queueList'); + } + + + /* 上传附件 */ + function UploadFile(target) { + this.$wrap = target.constructor == String ? $('#' + target) : $(target); + this.init(); + } + + UploadFile.prototype = { + init: function () { + this.fileList = []; + this.initContainer(); + this.initUploader(); + }, + initContainer: function () { + this.$queue = this.$wrap.find('.filelist'); + }, + /* 初始化容器 */ + initUploader: function () { + var _this = this, + $ = jQuery, // just in case. Make sure it's not an other libaray. + $wrap = _this.$wrap, + // 图片容器 + $queue = $wrap.find('.filelist'), + // 状态栏,包括进度和控制按钮 + $statusBar = $wrap.find('.statusBar'), + // 文件总体选择信息。 + $info = $statusBar.find('.info'), + // 上传按钮 + $upload = $wrap.find('.uploadBtn'), + // 上传按钮 + $filePickerBtn = $wrap.find('.filePickerBtn'), + // 上传按钮 + $filePickerBlock = $wrap.find('.filePickerBlock'), + // 没选择文件之前的内容。 + $placeHolder = $wrap.find('.placeholder'), + // 总体进度条 + $progress = $statusBar.find('.progress').hide(), + // 添加的文件数量 + fileCount = 0, + // 添加的文件总大小 + fileSize = 0, + // 优化retina, 在retina下这个值是2 + ratio = window.devicePixelRatio || 1, + // 缩略图大小 + thumbnailWidth = 113 * ratio, + thumbnailHeight = 113 * ratio, + // 可能有pedding, ready, uploading, confirm, done. + state = '', + // 所有文件的进度信息,key为file id + percentages = {}, + supportTransition = (function () { + var s = document.createElement('p').style, + r = 'transition' in s || + 'WebkitTransition' in s || + 'MozTransition' in s || + 'msTransition' in s || + 'OTransition' in s; + s = null; + return r; + })(), + // WebUploader实例 + uploader, + actionUrl = editor.getActionUrl(editor.getOpt('videoActionName')), + fileMaxSize = editor.getOpt('videoMaxSize'), + acceptExtensions = (editor.getOpt('videoAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, ''); + ; + + if (!WebUploader.Uploader.support()) { + $('#filePickerReady').after($('
    ').html(lang.errorNotSupport)).hide(); + return; + } else if (!editor.getOpt('videoActionName')) { + $('#filePickerReady').after($('
    ').html(lang.errorLoadConfig)).hide(); + return; + } + + uploader = _this.uploader = WebUploader.create({ + pick: { + id: '#filePickerReady', + label: lang.uploadSelectFile + }, + swf: '../../third-party/webuploader/Uploader.swf', + server: actionUrl, + fileVal: editor.getOpt('videoFieldName'), + duplicate: true, + fileSingleSizeLimit: fileMaxSize, + compress: false + }); + uploader.addButton({ + id: '#filePickerBlock' + }); + uploader.addButton({ + id: '#filePickerBtn', + label: lang.uploadAddFile + }); + + setState('pedding'); + + // 当有文件添加进来时执行,负责view的创建 + function addFile(file) { + var $li = $('
  • ' + + '

    ' + file.name + '

    ' + + '

    ' + + '

    ' + + '
  • '), + + $btns = $('
    ' + + '' + lang.uploadDelete + '' + + '' + lang.uploadTurnRight + '' + + '' + lang.uploadTurnLeft + '
    ').appendTo($li), + $prgress = $li.find('p.progress span'), + $wrap = $li.find('p.imgWrap'), + $info = $('

    ').hide().appendTo($li), + + showError = function (code) { + switch (code) { + case 'exceed_size': + text = lang.errorExceedSize; + break; + case 'interrupt': + text = lang.errorInterrupt; + break; + case 'http': + text = lang.errorHttp; + break; + case 'not_allow_type': + text = lang.errorFileType; + break; + default: + text = lang.errorUploadRetry; + break; + } + $info.text(text).show(); + }; + + if (file.getStatus() === 'invalid') { + showError(file.statusText); + } else { + $wrap.text(lang.uploadPreview); + if ('|png|jpg|jpeg|bmp|gif|'.indexOf('|' + file.ext.toLowerCase() + '|') == -1) { + $wrap.empty().addClass('notimage').append('' + + '' + file.name + ''); + } else { + if (browser.ie && browser.version <= 7) { + $wrap.text(lang.uploadNoPreview); + } else { + uploader.makeThumb(file, function (error, src) { + if (error || !src || (/^data:/.test(src) && browser.ie && browser.version <= 7)) { + $wrap.text(lang.uploadNoPreview); + } else { + var $img = $(''); + $wrap.empty().append($img); + $img.on('error', function () { + $wrap.text(lang.uploadNoPreview); + }); + } + }, thumbnailWidth, thumbnailHeight); + } + } + percentages[file.id] = [file.size, 0]; + file.rotation = 0; + + /* 检查文件格式 */ + if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) { + showError('not_allow_type'); + uploader.removeFile(file); + } + } + + file.on('statuschange', function (cur, prev) { + if (prev === 'progress') { + $prgress.hide().width(0); + } else if (prev === 'queued') { + $li.off('mouseenter mouseleave'); + $btns.remove(); + } + // 成功 + if (cur === 'error' || cur === 'invalid') { + showError(file.statusText); + percentages[file.id][1] = 1; + } else if (cur === 'interrupt') { + showError('interrupt'); + } else if (cur === 'queued') { + percentages[file.id][1] = 0; + } else if (cur === 'progress') { + $info.hide(); + $prgress.css('display', 'block'); + } else if (cur === 'complete') { + } + + $li.removeClass('state-' + prev).addClass('state-' + cur); + }); + + $li.on('mouseenter', function () { + $btns.stop().animate({height: 30}); + }); + $li.on('mouseleave', function () { + $btns.stop().animate({height: 0}); + }); + + $btns.on('click', 'span', function () { + var index = $(this).index(), + deg; + + switch (index) { + case 0: + uploader.removeFile(file); + return; + case 1: + file.rotation += 90; + break; + case 2: + file.rotation -= 90; + break; + } + + if (supportTransition) { + deg = 'rotate(' + file.rotation + 'deg)'; + $wrap.css({ + '-webkit-transform': deg, + '-mos-transform': deg, + '-o-transform': deg, + 'transform': deg + }); + } else { + $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')'); + } + + }); + + $li.insertBefore($filePickerBlock); + } + + // 负责view的销毁 + function removeFile(file) { + var $li = $('#' + file.id); + delete percentages[file.id]; + updateTotalProgress(); + $li.off().find('.file-panel').off().end().remove(); + } + + function updateTotalProgress() { + var loaded = 0, + total = 0, + spans = $progress.children(), + percent; + + $.each(percentages, function (k, v) { + total += v[0]; + loaded += v[0] * v[1]; + }); + + percent = total ? loaded / total : 0; + + spans.eq(0).text(Math.round(percent * 100) + '%'); + spans.eq(1).css('width', Math.round(percent * 100) + '%'); + updateStatus(); + } + + function setState(val, files) { + + if (val != state) { + + var stats = uploader.getStats(); + + $upload.removeClass('state-' + state); + $upload.addClass('state-' + val); + + switch (val) { + + /* 未选择文件 */ + case 'pedding': + $queue.addClass('element-invisible'); + $statusBar.addClass('element-invisible'); + $placeHolder.removeClass('element-invisible'); + $progress.hide(); + $info.hide(); + uploader.refresh(); + break; + + /* 可以开始上传 */ + case 'ready': + $placeHolder.addClass('element-invisible'); + $queue.removeClass('element-invisible'); + $statusBar.removeClass('element-invisible'); + $progress.hide(); + $info.show(); + $upload.text(lang.uploadStart); + uploader.refresh(); + break; + + /* 上传中 */ + case 'uploading': + $progress.show(); + $info.hide(); + $upload.text(lang.uploadPause); + break; + + /* 暂停上传 */ + case 'paused': + $progress.show(); + $info.hide(); + $upload.text(lang.uploadContinue); + break; + + case 'confirm': + $progress.show(); + $info.hide(); + $upload.text(lang.uploadStart); + + stats = uploader.getStats(); + if (stats.successNum && !stats.uploadFailNum) { + setState('finish'); + return; + } + break; + + case 'finish': + $progress.hide(); + $info.show(); + if (stats.uploadFailNum) { + $upload.text(lang.uploadRetry); + } else { + $upload.text(lang.uploadStart); + } + break; + } + + state = val; + updateStatus(); + + } + + if (!_this.getQueueCount()) { + $upload.addClass('disabled') + } else { + $upload.removeClass('disabled') + } + + } + + function updateStatus() { + var text = '', stats; + + if (state === 'ready') { + text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize)); + } else if (state === 'confirm') { + stats = uploader.getStats(); + if (stats.uploadFailNum) { + text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum); + } + } else { + stats = uploader.getStats(); + text = lang.updateStatusFinish.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize)).replace('_', stats.successNum); + + if (stats.uploadFailNum) { + text += lang.updateStatusError.replace('_', stats.uploadFailNum); + } + } + + $info.html(text); + } + + uploader.on('fileQueued', function (file) { + fileCount++; + fileSize += file.size; + + if (fileCount === 1) { + $placeHolder.addClass('element-invisible'); + $statusBar.show(); + } + + addFile(file); + }); + + uploader.on('fileDequeued', function (file) { + fileCount--; + fileSize -= file.size; + + removeFile(file); + updateTotalProgress(); + }); + + uploader.on('filesQueued', function (file) { + if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) { + setState('ready'); + } + updateTotalProgress(); + }); + + uploader.on('all', function (type, files) { + switch (type) { + case 'uploadFinished': + setState('confirm', files); + break; + case 'startUpload': + /* 添加额外的GET参数 */ + var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '', + url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?' : '&') + 'encode=utf-8&' + params); + uploader.option('server', url); + setState('uploading', files); + break; + case 'stopUpload': + setState('paused', files); + break; + } + }); + + uploader.on('uploadBeforeSend', function (file, data, header) { + //这里可以通过data对象添加POST参数 + header['X_Requested_With'] = 'XMLHttpRequest'; + }); + + uploader.on('uploadProgress', function (file, percentage) { + var $li = $('#' + file.id), + $percent = $li.find('.progress span'); + + $percent.css('width', percentage * 100 + '%'); + percentages[file.id][1] = percentage; + updateTotalProgress(); + }); + + uploader.on('uploadSuccess', function (file, ret) { + var $file = $('#' + file.id); + try { + var responseText = (ret._raw || ret), + json = utils.str2json(responseText); + if (json.state == 'SUCCESS') { + uploadVideoList.push({ + 'url': json.url, + 'type': json.type, + 'original': json.original + }); + $file.append(''); + } else { + $file.find('.error').text(json.state).show(); + } + } catch (e) { + $file.find('.error').text(lang.errorServerUpload).show(); + } + }); + + uploader.on('uploadError', function (file, code) { + }); + uploader.on('error', function (code, file) { + if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') { + addFile(file); + } + }); + uploader.on('uploadComplete', function (file, ret) { + }); + + $upload.on('click', function () { + if ($(this).hasClass('disabled')) { + return false; + } + + if (state === 'ready') { + uploader.upload(); + } else if (state === 'paused') { + uploader.upload(); + } else if (state === 'uploading') { + uploader.stop(); + } + }); + + $upload.addClass('state-' + state); + updateTotalProgress(); + }, + getQueueCount: function () { + var file, i, status, readyFile = 0, files = this.uploader.getFiles(); + for (i = 0; file = files[i++];) { + status = file.getStatus(); + if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++; + } + return readyFile; + }, + refresh: function () { + this.uploader.refresh(); + } + }; + +})(); diff --git a/admin/dialogs/webapp/webapp.html b/admin/dialogs/webapp/webapp.html new file mode 100644 index 0000000..098abee --- /dev/null +++ b/admin/dialogs/webapp/webapp.html @@ -0,0 +1,70 @@ + + + + + + + + + +
    +
    +
    + + + \ No newline at end of file diff --git a/admin/dialogs/wordimage/fClipboard_ueditor.swf b/admin/dialogs/wordimage/fClipboard_ueditor.swf new file mode 100644 index 0000000000000000000000000000000000000000..ac5d27f81d2111c8581a042564c5275edd751e1c GIT binary patch literal 1908 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
    ukC`1!p{x~JlsV7pDC73)_A$z0@ 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 + * 参数的意思:beforeBegin<span>afterBegin this is span! beforeEnd</span> afterEnd
    + * 此外,如果使用本函数插入带有script标签的HTML字符串,script标签对应的脚本将不会被执行。 + * + * @shortcut insertHTML + * @meta standard + * + * @returns {HTMLElement} 目标元素 + */ +baidu.dom.insertHTML = function (element, position, html) { + element = baidu.dom.g(element); + var range, begin; + if (element.insertAdjacentHTML && !baidu.browser.opera) { + element.insertAdjacentHTML(position, html); + } else { + range = element.ownerDocument.createRange(); + position = position.toUpperCase(); + if (position == 'AFTERBEGIN' || position == 'BEFOREEND') { + range.selectNodeContents(element); + range.collapse(position == 'AFTERBEGIN'); + } else { + begin = position == 'BEFOREBEGIN'; + range[begin ? 'setStartBefore' : 'setEndAfter'](element); + range.collapse(begin); + } + range.insertNode(range.createContextualFragment(html)); + } + return element; +}; + +baidu.insertHTML = baidu.dom.insertHTML; + +/** + * 操作flash对象的方法,包括创建flash对象、获取flash对象以及判断flash插件的版本号 + * @namespace baidu.swf + */ +baidu.swf = baidu.swf || {}; + + +/** + * 浏览器支持的flash插件版本 + * @property version 浏览器支持的flash插件版本 + * @grammar baidu.swf.version + * @return {String} 版本号 + * @meta standard + */ +baidu.swf.version = (function () { + var n = navigator; + if (n.plugins && n.mimeTypes.length) { + var plugin = n.plugins["Shockwave Flash"]; + if (plugin && plugin.description) { + return plugin.description + .replace(/([a-zA-Z]|\s)+/, "") + .replace(/(\s)+r/, ".") + ".0"; + } + } else if (window.ActiveXObject && !window.opera) { + for (var i = 12; i >= 2; i--) { + try { + var c = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.' + i); + if (c) { + var version = c.GetVariable("$version"); + return version.replace(/WIN/g, '').replace(/,/g, '.'); + } + } catch (e) { + } + } + } +})(); + +/** + * 操作字符串的方法 + * @namespace baidu.string + */ +baidu.string = baidu.string || {}; + + +/** + * 对目标字符串进行html编码 + * @name baidu.string.encodeHTML + * @function + * @grammar baidu.string.encodeHTML(source) + * @param {string} source 目标字符串 + * @remark + * 编码字符有5个:&<>"' + * @shortcut encodeHTML + * @meta standard + * @see baidu.string.decodeHTML + * + * @returns {string} html编码后的字符串 + */ +baidu.string.encodeHTML = function (source) { + return String(source) + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, """) + .replace(/'/g, "'"); +}; + +baidu.encodeHTML = baidu.string.encodeHTML; + +/** + * 创建flash对象的html字符串 + * @name baidu.swf.createHTML + * @function + * @grammar baidu.swf.createHTML(options) + * + * @param {Object} options 创建flash的选项参数 + * @param {string} options.id 要创建的flash的标识 + * @param {string} options.url flash文件的url + * @param {String} options.errorMessage 未安装flash player或flash player版本号过低时的提示 + * @param {string} options.ver 最低需要的flash player版本号 + * @param {string} options.width flash的宽度 + * @param {string} options.height flash的高度 + * @param {string} options.align flash的对齐方式,允许值:middle/left/right/top/bottom + * @param {string} options.base 设置用于解析swf文件中的所有相对路径语句的基本目录或URL + * @param {string} options.bgcolor swf文件的背景色 + * @param {string} options.salign 设置缩放的swf文件在由width和height设置定义的区域内的位置。允许值:l/r/t/b/tl/tr/bl/br + * @param {boolean} options.menu 是否显示右键菜单,允许值:true/false + * @param {boolean} options.loop 播放到最后一帧时是否重新播放,允许值: true/false + * @param {boolean} options.play flash是否在浏览器加载时就开始播放。允许值:true/false + * @param {string} options.quality 设置flash播放的画质,允许值:low/medium/high/autolow/autohigh/best + * @param {string} options.scale 设置flash内容如何缩放来适应设置的宽高。允许值:showall/noborder/exactfit + * @param {string} options.wmode 设置flash的显示模式。允许值:window/opaque/transparent + * @param {string} options.allowscriptaccess 设置flash与页面的通信权限。允许值:always/never/sameDomain + * @param {string} options.allownetworking 设置swf文件中允许使用的网络API。允许值:all/internal/none + * @param {boolean} options.allowfullscreen 是否允许flash全屏。允许值:true/false + * @param {boolean} options.seamlesstabbing 允许设置执行无缝跳格,从而使用户能跳出flash应用程序。该参数只能在安装Flash7及更高版本的Windows中使用。允许值:true/false + * @param {boolean} options.devicefont 设置静态文本对象是否以设备字体呈现。允许值:true/false + * @param {boolean} options.swliveconnect 第一次加载flash时浏览器是否应启动Java。允许值:true/false + * @param {Object} options.vars 要传递给flash的参数,支持JSON或string类型。 + * + * @see baidu.swf.create + * @meta standard + * @returns {string} flash对象的html字符串 + */ +baidu.swf.createHTML = function (options) { + options = options || {}; + var version = baidu.swf.version, + needVersion = options['ver'] || '6.0.0', + vUnit1, vUnit2, i, k, len, item, tmpOpt = {}, + encodeHTML = baidu.string.encodeHTML; + for (k in options) { + tmpOpt[k] = options[k]; + } + options = tmpOpt; + if (version) { + version = version.split('.'); + needVersion = needVersion.split('.'); + for (i = 0; i < 3; i++) { + vUnit1 = parseInt(version[i], 10); + vUnit2 = parseInt(needVersion[i], 10); + if (vUnit2 < vUnit1) { + break; + } else if (vUnit2 > vUnit1) { + return ''; + } + } + } else { + return ''; + } + + var vars = options['vars'], + objProperties = ['classid', 'codebase', 'id', 'width', 'height', 'align']; + options['align'] = options['align'] || 'middle'; + options['classid'] = 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000'; + options['codebase'] = 'http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0'; + options['movie'] = options['url'] || ''; + delete options['vars']; + delete options['url']; + if ('string' == typeof vars) { + options['flashvars'] = vars; + } else { + var fvars = []; + for (k in vars) { + item = vars[k]; + fvars.push(k + "=" + encodeURIComponent(item)); + } + options['flashvars'] = fvars.join('&'); + } + var str = [''); + var params = { + 'wmode': 1, + 'scale': 1, + 'quality': 1, + 'play': 1, + 'loop': 1, + 'menu': 1, + 'salign': 1, + 'bgcolor': 1, + 'base': 1, + 'allowscriptaccess': 1, + 'allownetworking': 1, + 'allowfullscreen': 1, + 'seamlesstabbing': 1, + 'devicefont': 1, + 'swliveconnect': 1, + 'flashvars': 1, + 'movie': 1 + }; + + for (k in options) { + item = options[k]; + k = k.toLowerCase(); + if (params[k] && (item || item === false || item === 0)) { + str.push(''); + } + } + options['src'] = options['movie']; + options['name'] = options['id']; + delete options['id']; + delete options['movie']; + delete options['classid']; + delete options['codebase']; + options['type'] = 'application/x-shockwave-flash'; + options['pluginspage'] = 'http://www.macromedia.com/go/getflashplayer'; + str.push(''); + + return str.join(''); +}; + + +/** + * 在页面中创建一个flash对象 + * @name baidu.swf.create + * @function + * @grammar baidu.swf.create(options[, container]) + * + * @param {Object} options 创建flash的选项参数 + * @param {string} options.id 要创建的flash的标识 + * @param {string} options.url flash文件的url + * @param {String} options.errorMessage 未安装flash player或flash player版本号过低时的提示 + * @param {string} options.ver 最低需要的flash player版本号 + * @param {string} options.width flash的宽度 + * @param {string} options.height flash的高度 + * @param {string} options.align flash的对齐方式,允许值:middle/left/right/top/bottom + * @param {string} options.base 设置用于解析swf文件中的所有相对路径语句的基本目录或URL + * @param {string} options.bgcolor swf文件的背景色 + * @param {string} options.salign 设置缩放的swf文件在由width和height设置定义的区域内的位置。允许值:l/r/t/b/tl/tr/bl/br + * @param {boolean} options.menu 是否显示右键菜单,允许值:true/false + * @param {boolean} options.loop 播放到最后一帧时是否重新播放,允许值: true/false + * @param {boolean} options.play flash是否在浏览器加载时就开始播放。允许值:true/false + * @param {string} options.quality 设置flash播放的画质,允许值:low/medium/high/autolow/autohigh/best + * @param {string} options.scale 设置flash内容如何缩放来适应设置的宽高。允许值:showall/noborder/exactfit + * @param {string} options.wmode 设置flash的显示模式。允许值:window/opaque/transparent + * @param {string} options.allowscriptaccess 设置flash与页面的通信权限。允许值:always/never/sameDomain + * @param {string} options.allownetworking 设置swf文件中允许使用的网络API。允许值:all/internal/none + * @param {boolean} options.allowfullscreen 是否允许flash全屏。允许值:true/false + * @param {boolean} options.seamlesstabbing 允许设置执行无缝跳格,从而使用户能跳出flash应用程序。该参数只能在安装Flash7及更高版本的Windows中使用。允许值:true/false + * @param {boolean} options.devicefont 设置静态文本对象是否以设备字体呈现。允许值:true/false + * @param {boolean} options.swliveconnect 第一次加载flash时浏览器是否应启动Java。允许值:true/false + * @param {Object} options.vars 要传递给flash的参数,支持JSON或string类型。 + * + * @param {HTMLElement|string} [container] flash对象的父容器元素,不传递该参数时在当前代码位置创建flash对象。 + * @meta standard + * @see baidu.swf.createHTML,baidu.swf.getMovie + */ +baidu.swf.create = function (options, target) { + options = options || {}; + var html = baidu.swf.createHTML(options) + || options['errorMessage'] + || ''; + + if (target && 'string' == typeof target) { + target = document.getElementById(target); + } + baidu.dom.insertHTML(target || document.body, 'beforeEnd', html); +}; +/** + * 判断是否为ie浏览器 + * @name baidu.browser.ie + * @field + * @grammar baidu.browser.ie + * @returns {Number} IE版本号 + */ +baidu.browser.ie = baidu.ie = /msie (\d+\.\d+)/i.test(navigator.userAgent) ? (document.documentMode || +RegExp['\x241']) : undefined; + +/** + * 移除数组中的项 + * @name baidu.array.remove + * @function + * @grammar baidu.array.remove(source, match) + * @param {Array} source 需要移除项的数组 + * @param {Any} match 要移除的项 + * @meta standard + * @see baidu.array.removeAt + * + * @returns {Array} 移除后的数组 + */ +baidu.array.remove = function (source, match) { + var len = source.length; + + while (len--) { + if (len in source && source[len] === match) { + source.splice(len, 1); + } + } + return source; +}; + +/** + * 判断目标参数是否Array对象 + * @name baidu.lang.isArray + * @function + * @grammar baidu.lang.isArray(source) + * @param {Any} source 目标参数 + * @meta standard + * @see baidu.lang.isString,baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate + * + * @returns {boolean} 类型判断结果 + */ +baidu.lang.isArray = function (source) { + return '[object Array]' == Object.prototype.toString.call(source); +}; + + +/** + * 将一个变量转换成array + * @name baidu.lang.toArray + * @function + * @grammar baidu.lang.toArray(source) + * @param {mix} source 需要转换成array的变量 + * @version 1.3 + * @meta standard + * @returns {array} 转换后的array + */ +baidu.lang.toArray = function (source) { + if (source === null || source === undefined) + return []; + if (baidu.lang.isArray(source)) + return source; + if (typeof source.length !== 'number' || typeof source === 'string' || baidu.lang.isFunction(source)) { + return [source]; + } + if (source.item) { + var l = source.length, array = new Array(l); + while (l--) + array[l] = source[l]; + return array; + } + + return [].slice.call(source); +}; + +/** + * 获得flash对象的实例 + * @name baidu.swf.getMovie + * @function + * @grammar baidu.swf.getMovie(name) + * @param {string} name flash对象的名称 + * @see baidu.swf.create + * @meta standard + * @returns {HTMLElement} flash对象的实例 + */ +baidu.swf.getMovie = function (name) { + var movie = document[name], ret; + return baidu.browser.ie == 9 ? + movie && movie.length ? + (ret = baidu.array.remove(baidu.lang.toArray(movie), function (item) { + return item.tagName.toLowerCase() != "embed"; + })).length == 1 ? ret[0] : ret + : movie + : movie || window[name]; +}; + + +baidu.flash._Base = (function () { + + var prefix = 'bd__flash__'; + + /** + * 创建一个随机的字符串 + * @private + * @return {String} + */ + function _createString() { + return prefix + Math.floor(Math.random() * 2147483648).toString(36); + }; + + /** + * 检查flash状态 + * @private + * @param {Object} target flash对象 + * @return {Boolean} + */ + function _checkReady(target) { + if (typeof target !== 'undefined' && typeof target.flashInit !== 'undefined' && target.flashInit()) { + return true; + } else { + return false; + } + }; + + /** + * 调用之前进行压栈的函数 + * @private + * @param {Array} callQueue 调用队列 + * @param {Object} target flash对象 + * @return {Null} + */ + function _callFn(callQueue, target) { + var result = null; + + callQueue = callQueue.reverse(); + baidu.each(callQueue, function (item) { + result = target.call(item.fnName, item.params); + item.callBack(result); + }); + }; + + /** + * 为传入的匿名函数创建函数名 + * @private + * @param {String|Function} fun 传入的匿名函数或者函数名 + * @return {String} + */ + function _createFunName(fun) { + var name = ''; + + if (baidu.lang.isFunction(fun)) { + name = _createString(); + window[name] = function () { + fun.apply(window, arguments); + }; + + return name; + } else if (baidu.lang.isString) { + return fun; + } + }; + + /** + * 绘制flash + * @private + * @param {Object} options 创建参数 + * @return {Object} + */ + function _render(options) { + if (!options.id) { + options.id = _createString(); + } + + var container = options.container || ''; + delete(options.container); + + baidu.swf.create(options, container); + + return baidu.swf.getMovie(options.id); + }; + + return function (options, callBack) { + var me = this, + autoRender = (typeof options.autoRender !== 'undefined' ? options.autoRender : true), + createOptions = options.createOptions || {}, + target = null, + isReady = false, + callQueue = [], + timeHandle = null, + callBack = callBack || []; + + /** + * 将flash文件绘制到页面上 + * @public + * @return {Null} + */ + me.render = function () { + target = _render(createOptions); + + if (callBack.length > 0) { + baidu.each(callBack, function (funName, index) { + callBack[index] = _createFunName(options[funName] || new Function()); + }); + } + me.call('setJSFuncName', [callBack]); + }; + + /** + * 返回flash状态 + * @return {Boolean} + */ + me.isReady = function () { + return isReady; + }; + + /** + * 调用flash接口的统一入口 + * @param {String} fnName 调用的函数名 + * @param {Array} params 传入的参数组成的数组,若不许要参数,需传入空数组 + * @param {Function} [callBack] 异步调用后将返回值作为参数的调用回调函数,如无返回值,可以不传入此参数 + * @return {Null} + */ + me.call = function (fnName, params, callBack) { + if (!fnName) return null; + callBack = callBack || new Function(); + + var result = null; + + if (isReady) { + result = target.call(fnName, params); + callBack(result); + } else { + callQueue.push({ + fnName: fnName, + params: params, + callBack: callBack + }); + + (!timeHandle) && (timeHandle = setInterval(_check, 200)); + } + }; + + /** + * 为传入的匿名函数创建函数名 + * @public + * @param {String|Function} fun 传入的匿名函数或者函数名 + * @return {String} + */ + me.createFunName = function (fun) { + return _createFunName(fun); + }; + + /** + * 检查flash是否ready, 并进行调用 + * @private + * @return {Null} + */ + function _check() { + if (_checkReady(target)) { + clearInterval(timeHandle); + timeHandle = null; + _call(); + + isReady = true; + } + }; + + /** + * 调用之前进行压栈的函数 + * @private + * @return {Null} + */ + function _call() { + _callFn(callQueue, target); + callQueue = []; + } + + autoRender && me.render(); + }; +})(); + + +/** + * 创建flash based imageUploader + * @class + * @grammar baidu.flash.imageUploader(options) + * @param {Object} createOptions 创建flash时需要的参数,请参照baidu.swf.create文档 + * @config {Object} vars 创建imageUploader时所需要的参数 + * @config {Number} vars.gridWidth 每一个预览图片所占的宽度,应该为flash寛的整除 + * @config {Number} vars.gridHeight 每一个预览图片所占的高度,应该为flash高的整除 + * @config {Number} vars.picWidth 单张预览图片的宽度 + * @config {Number} vars.picHeight 单张预览图片的高度 + * @config {String} vars.uploadDataFieldName POST请求中图片数据的key,默认值'picdata' + * @config {String} vars.picDescFieldName POST请求中图片描述的key,默认值'picDesc' + * @config {Number} vars.maxSize 文件的最大体积,单位'MB' + * @config {Number} vars.compressSize 上传前如果图片体积超过该值,会先压缩 + * @config {Number} vars.maxNum:32 最大上传多少个文件 + * @config {Number} vars.compressLength 能接受的最大边长,超过该值会等比压缩 + * @config {String} vars.url 上传的url地址 + * @config {Number} vars.mode mode == 0时,是使用滚动条,mode == 1时,拉伸flash, 默认值为0 + * @see baidu.swf.createHTML + * @param {String} backgroundUrl 背景图片路径 + * @param {String} listBacgroundkUrl 布局控件背景 + * @param {String} buttonUrl 按钮图片不背景 + * @param {String|Function} selectFileCallback 选择文件的回调 + * @param {String|Function} exceedFileCallback文件超出限制的最大体积时的回调 + * @param {String|Function} deleteFileCallback 删除文件的回调 + * @param {String|Function} startUploadCallback 开始上传某个文件时的回调 + * @param {String|Function} uploadCompleteCallback 某个文件上传完成的回调 + * @param {String|Function} uploadErrorCallback 某个文件上传失败的回调 + * @param {String|Function} allCompleteCallback 全部上传完成时的回调 + * @param {String|Function} changeFlashHeight 改变Flash的高度,mode==1的时候才有用 + */ +baidu.flash.imageUploader = baidu.flash.imageUploader || function (options) { + + var me = this, + options = options || {}, + _flash = new baidu.flash._Base(options, [ + 'selectFileCallback', + 'exceedFileCallback', + 'deleteFileCallback', + 'startUploadCallback', + 'uploadCompleteCallback', + 'uploadErrorCallback', + 'allCompleteCallback', + 'changeFlashHeight' + ]); + /** + * 开始或回复上传图片 + * @public + * @return {Null} + */ + me.upload = function () { + _flash.call('upload'); + }; + + /** + * 暂停上传图片 + * @public + * @return {Null} + */ + me.pause = function () { + _flash.call('pause'); + }; + me.addCustomizedParams = function (index, obj) { + _flash.call('addCustomizedParams', [index, obj]); + } +}; + +/** + * 操作原生对象的方法 + * @namespace baidu.object + */ +baidu.object = baidu.object || {}; + + +/** + * 将源对象的所有属性拷贝到目标对象中 + * @author erik + * @name baidu.object.extend + * @function + * @grammar baidu.object.extend(target, source) + * @param {Object} target 目标对象 + * @param {Object} source 源对象 + * @see baidu.array.merge + * @remark + * + 1.目标对象中,与源对象key相同的成员将会被覆盖。
    + 2.源对象的prototype成员不会拷贝。 + + * @shortcut extend + * @meta standard + * + * @returns {Object} 目标对象 + */ +baidu.extend = + baidu.object.extend = function (target, source) { + for (var p in source) { + if (source.hasOwnProperty(p)) { + target[p] = source[p]; + } + } + + return target; + }; + + +/** + * 创建flash based fileUploader + * @class + * @grammar baidu.flash.fileUploader(options) + * @param {Object} options + * @config {Object} createOptions 创建flash时需要的参数,请参照baidu.swf.create文档 + * @config {String} createOptions.width + * @config {String} createOptions.height + * @config {Number} maxNum 最大可选文件数 + * @config {Function|String} selectFile + * @config {Function|String} exceedMaxSize + * @config {Function|String} deleteFile + * @config {Function|String} uploadStart + * @config {Function|String} uploadComplete + * @config {Function|String} uploadError + * @config {Function|String} uploadProgress + */ +baidu.flash.fileUploader = baidu.flash.fileUploader || function (options) { + var me = this, + options = options || {}; + + options.createOptions = baidu.extend({ + wmod: 'transparent' + }, options.createOptions || {}); + + var _flash = new baidu.flash._Base(options, [ + 'selectFile', + 'exceedMaxSize', + 'deleteFile', + 'uploadStart', + 'uploadComplete', + 'uploadError', + 'uploadProgress' + ]); + + _flash.call('setMaxNum', options.maxNum ? [options.maxNum] : [1]); + + /** + * 设置当鼠标移动到flash上时,是否变成手型 + * @public + * @param {Boolean} isCursor + * @return {Null} + */ + me.setHandCursor = function (isCursor) { + _flash.call('setHandCursor', [isCursor || false]); + }; + + /** + * 设置鼠标相应函数名 + * @param {String|Function} fun + */ + me.setMSFunName = function (fun) { + _flash.call('setMSFunName', [_flash.createFunName(fun)]); + }; + + /** + * 执行上传操作 + * @param {String} url 上传的url + * @param {String} fieldName 上传的表单字段名 + * @param {Object} postData 键值对,上传的POST数据 + * @param {Number|Array|null|-1} [index]上传的文件序列 + * Int值上传该文件 + * Array一次串行上传该序列文件 + * -1/null上传所有文件 + * @return {Null} + */ + me.upload = function (url, fieldName, postData, index) { + + if (typeof url !== 'string' || typeof fieldName !== 'string') return null; + if (typeof index === 'undefined') index = -1; + + _flash.call('upload', [url, fieldName, postData, index]); + }; + + /** + * 取消上传操作 + * @public + * @param {Number|-1} index + */ + me.cancel = function (index) { + if (typeof index === 'undefined') index = -1; + _flash.call('cancel', [index]); + }; + + /** + * 删除文件 + * @public + * @param {Number|Array} [index] 要删除的index,不传则全部删除 + * @param {Function} callBack + * */ + me.deleteFile = function (index, callBack) { + + var callBackAll = function (list) { + callBack && callBack(list); + }; + + if (typeof index === 'undefined') { + _flash.call('deleteFilesAll', [], callBackAll); + return; + } + ; + + if (typeof index === 'Number') index = [index]; + index.sort(function (a, b) { + return b - a; + }); + baidu.each(index, function (item) { + _flash.call('deleteFileBy', item, callBackAll); + }); + }; + + /** + * 添加文件类型,支持macType + * @public + * @param {Object|Array[Object]} type {description:String, extention:String} + * @return {Null}; + */ + me.addFileType = function (type) { + var type = type || [[]]; + + if (type instanceof Array) type = [type]; + else type = [[type]]; + _flash.call('addFileTypes', type); + }; + + /** + * 设置文件类型,支持macType + * @public + * @param {Object|Array[Object]} type {description:String, extention:String} + * @return {Null}; + */ + me.setFileType = function (type) { + var type = type || [[]]; + + if (type instanceof Array) type = [type]; + else type = [[type]]; + _flash.call('setFileTypes', type); + }; + + /** + * 设置可选文件的数量限制 + * @public + * @param {Number} num + * @return {Null} + */ + me.setMaxNum = function (num) { + _flash.call('setMaxNum', [num]); + }; + + /** + * 设置可选文件大小限制,以兆M为单位 + * @public + * @param {Number} num,0为无限制 + * @return {Null} + */ + me.setMaxSize = function (num) { + _flash.call('setMaxSize', [num]); + }; + + /** + * @public + */ + me.getFileAll = function (callBack) { + _flash.call('getFileAll', [], callBack); + }; + + /** + * @public + * @param {Number} index + * @param {Function} [callBack] + */ + me.getFileByIndex = function (index, callBack) { + _flash.call('getFileByIndex', [], callBack); + }; + + /** + * @public + * @param {Number} index + * @param {function} [callBack] + */ + me.getStatusByIndex = function (index, callBack) { + _flash.call('getStatusByIndex', [], callBack); + }; +}; + +/** + * 使用动态script标签请求服务器资源,包括由服务器端的回调和浏览器端的回调 + * @namespace baidu.sio + */ +baidu.sio = baidu.sio || {}; + +/** + * + * @param {HTMLElement} src script节点 + * @param {String} url script节点的地址 + * @param {String} [charset] 编码 + */ +baidu.sio._createScriptTag = function (scr, url, charset) { + scr.setAttribute('type', 'text/javascript'); + charset && scr.setAttribute('charset', charset); + scr.setAttribute('src', url); + document.getElementsByTagName('head')[0].appendChild(scr); +}; + +/** + * 删除script的属性,再删除script标签,以解决修复内存泄漏的问题 + * + * @param {HTMLElement} src script节点 + */ +baidu.sio._removeScriptTag = function (scr) { + if (scr.clearAttributes) { + scr.clearAttributes(); + } else { + for (var attr in scr) { + if (scr.hasOwnProperty(attr)) { + delete scr[attr]; + } + } + } + if (scr && scr.parentNode) { + scr.parentNode.removeChild(scr); + } + scr = null; +}; + + +/** + * 通过script标签加载数据,加载完成由浏览器端触发回调 + * @name baidu.sio.callByBrowser + * @function + * @grammar baidu.sio.callByBrowser(url, opt_callback, opt_options) + * @param {string} url 加载数据的url + * @param {Function|string} opt_callback 数据加载结束时调用的函数或函数名 + * @param {Object} opt_options 其他可选项 + * @config {String} [charset] script的字符集 + * @config {Integer} [timeOut] 超时时间,超过这个时间将不再响应本请求,并触发onfailure函数 + * @config {Function} [onfailure] timeOut设定后才生效,到达超时时间时触发本函数 + * @remark + * 1、与callByServer不同,callback参数只支持Function类型,不支持string。 + * 2、如果请求了一个不存在的页面,callback函数在IE/opera下也会被调用,因此使用者需要在onsuccess函数中判断数据是否正确加载。 + * @meta standard + * @see baidu.sio.callByServer + */ +baidu.sio.callByBrowser = function (url, opt_callback, opt_options) { + var scr = document.createElement("SCRIPT"), + scriptLoaded = 0, + options = opt_options || {}, + charset = options['charset'], + callback = opt_callback || function () { + }, + timeOut = options['timeOut'] || 0, + timer; + scr.onload = scr.onreadystatechange = function () { + if (scriptLoaded) { + return; + } + + var readyState = scr.readyState; + if ('undefined' == typeof readyState + || readyState == "loaded" + || readyState == "complete") { + scriptLoaded = 1; + try { + callback(); + clearTimeout(timer); + } finally { + scr.onload = scr.onreadystatechange = null; + baidu.sio._removeScriptTag(scr); + } + } + }; + + if (timeOut) { + timer = setTimeout(function () { + scr.onload = scr.onreadystatechange = null; + baidu.sio._removeScriptTag(scr); + options.onfailure && options.onfailure(); + }, timeOut); + } + + baidu.sio._createScriptTag(scr, url, charset); +}; + +/** + * 通过script标签加载数据,加载完成由服务器端触发回调 + * @name baidu.sio.callByServer + * @function + * @grammar baidu.sio.callByServer(url, callback[, opt_options]) + * @param {string} url 加载数据的url. + * @param {Function|string} callback 服务器端调用的函数或函数名。如果没有指定本参数,将在URL中寻找options['queryField']做为callback的方法名. + * @param {Object} opt_options 加载数据时的选项. + * @config {string} [charset] script的字符集 + * @config {string} [queryField] 服务器端callback请求字段名,默认为callback + * @config {Integer} [timeOut] 超时时间(单位:ms),超过这个时间将不再响应本请求,并触发onfailure函数 + * @config {Function} [onfailure] timeOut设定后才生效,到达超时时间时触发本函数 + * @remark + * 如果url中已经包含key为“options['queryField']”的query项,将会被替换成callback中参数传递或自动生成的函数名。 + * @meta standard + * @see baidu.sio.callByBrowser + */ +baidu.sio.callByServer = /**@function*/function (url, callback, opt_options) { + var scr = document.createElement('SCRIPT'), + prefix = 'bd__cbs__', + callbackName, + callbackImpl, + options = opt_options || {}, + charset = options['charset'], + queryField = options['queryField'] || 'callback', + timeOut = options['timeOut'] || 0, + timer, + reg = new RegExp('(\\?|&)' + queryField + '=([^&]*)'), + matches; + + if (baidu.lang.isFunction(callback)) { + callbackName = prefix + Math.floor(Math.random() * 2147483648).toString(36); + window[callbackName] = getCallBack(0); + } else if (baidu.lang.isString(callback)) { + callbackName = callback; + } else { + if (matches = reg.exec(url)) { + callbackName = matches[2]; + } + } + + if (timeOut) { + timer = setTimeout(getCallBack(1), timeOut); + } + url = url.replace(reg, '\x241' + queryField + '=' + callbackName); + + if (url.search(reg) < 0) { + url += (url.indexOf('?') < 0 ? '?' : '&') + queryField + '=' + callbackName; + } + baidu.sio._createScriptTag(scr, url, charset); + + /* + * 返回一个函数,用于立即(挂在window上)或者超时(挂在setTimeout中)时执行 + */ + function getCallBack(onTimeOut) { + /*global callbackName, callback, scr, options;*/ + return function () { + try { + if (onTimeOut) { + options.onfailure && options.onfailure(); + } else { + callback.apply(window, arguments); + clearTimeout(timer); + } + window[callbackName] = null; + delete window[callbackName]; + } catch (exception) { + } finally { + baidu.sio._removeScriptTag(scr); + } + } + } +}; + +/** + * 通过请求一个图片的方式令服务器存储一条日志 + * @function + * @grammar baidu.sio.log(url) + * @param {string} url 要发送的地址. + * @author: int08h,leeight + */ +baidu.sio.log = function (url) { + var img = new Image(), + key = 'tangram_sio_log_' + Math.floor(Math.random() * + 2147483648).toString(36); + window[key] = img; + + img.onload = img.onerror = img.onabort = function () { + img.onload = img.onerror = img.onabort = null; + + window[key] = null; + img = null; + }; + img.src = url; +}; + + +/* + * Tangram + * Copyright 2009 Baidu Inc. All rights reserved. + * + * path: baidu/json.js + * author: erik + * version: 1.1.0 + * date: 2009/12/02 + */ + + +/** + * 操作json对象的方法 + * @namespace baidu.json + */ +baidu.json = baidu.json || {}; +/* + * Tangram + * Copyright 2009 Baidu Inc. All rights reserved. + * + * path: baidu/json/parse.js + * author: erik, berg + * version: 1.2 + * date: 2009/11/23 + */ + + +/** + * 将字符串解析成json对象。注:不会自动祛除空格 + * @name baidu.json.parse + * @function + * @grammar baidu.json.parse(data) + * @param {string} source 需要解析的字符串 + * @remark + * 该方法的实现与ecma-262第五版中规定的JSON.parse不同,暂时只支持传入一个参数。后续会进行功能丰富。 + * @meta standard + * @see baidu.json.stringify,baidu.json.decode + * + * @returns {JSON} 解析结果json对象 + */ +baidu.json.parse = function (data) { + //2010/12/09:更新至不使用原生parse,不检测用户输入是否正确 + return (new Function("return (" + data + ")"))(); +}; +/* + * Tangram + * Copyright 2009 Baidu Inc. All rights reserved. + * + * path: baidu/json/decode.js + * author: erik, cat + * version: 1.3.4 + * date: 2010/12/23 + */ + + +/** + * 将字符串解析成json对象,为过时接口,今后会被baidu.json.parse代替 + * @name baidu.json.decode + * @function + * @grammar baidu.json.decode(source) + * @param {string} source 需要解析的字符串 + * @meta out + * @see baidu.json.encode,baidu.json.parse + * + * @returns {JSON} 解析结果json对象 + */ +baidu.json.decode = baidu.json.parse; +/* + * Tangram + * Copyright 2009 Baidu Inc. All rights reserved. + * + * path: baidu/json/stringify.js + * author: erik + * version: 1.1.0 + * date: 2010/01/11 + */ + + +/** + * 将json对象序列化 + * @name baidu.json.stringify + * @function + * @grammar baidu.json.stringify(value) + * @param {JSON} value 需要序列化的json对象 + * @remark + * 该方法的实现与ecma-262第五版中规定的JSON.stringify不同,暂时只支持传入一个参数。后续会进行功能丰富。 + * @meta standard + * @see baidu.json.parse,baidu.json.encode + * + * @returns {string} 序列化后的字符串 + */ +baidu.json.stringify = (function () { + /** + * 字符串处理时需要转义的字符表 + * @private + */ + var escapeMap = { + "\b": '\\b', + "\t": '\\t', + "\n": '\\n', + "\f": '\\f', + "\r": '\\r', + '"': '\\"', + "\\": '\\\\' + }; + + /** + * 字符串序列化 + * @private + */ + function encodeString(source) { + if (/["\\\x00-\x1f]/.test(source)) { + source = source.replace( + /["\\\x00-\x1f]/g, + function (match) { + var c = escapeMap[match]; + if (c) { + return c; + } + c = match.charCodeAt(); + return "\\u00" + + Math.floor(c / 16).toString(16) + + (c % 16).toString(16); + }); + } + return '"' + source + '"'; + } + + /** + * 数组序列化 + * @private + */ + function encodeArray(source) { + var result = ["["], + l = source.length, + preComma, i, item; + + for (i = 0; i < l; i++) { + item = source[i]; + + switch (typeof item) { + case "undefined": + case "function": + case "unknown": + break; + default: + if (preComma) { + result.push(','); + } + result.push(baidu.json.stringify(item)); + preComma = 1; + } + } + result.push("]"); + return result.join(""); + } + + /** + * 处理日期序列化时的补零 + * @private + */ + function pad(source) { + return source < 10 ? '0' + source : source; + } + + /** + * 日期序列化 + * @private + */ + function encodeDate(source) { + return '"' + source.getFullYear() + "-" + + pad(source.getMonth() + 1) + "-" + + pad(source.getDate()) + "T" + + pad(source.getHours()) + ":" + + pad(source.getMinutes()) + ":" + + pad(source.getSeconds()) + '"'; + } + + return function (value) { + switch (typeof value) { + case 'undefined': + return 'undefined'; + + case 'number': + return isFinite(value) ? String(value) : "null"; + + case 'string': + return encodeString(value); + + case 'boolean': + return String(value); + + default: + if (value === null) { + return 'null'; + } else if (value instanceof Array) { + return encodeArray(value); + } else if (value instanceof Date) { + return encodeDate(value); + } else { + var result = ['{'], + encode = baidu.json.stringify, + preComma, + item; + + for (var key in value) { + if (Object.prototype.hasOwnProperty.call(value, key)) { + item = value[key]; + switch (typeof item) { + case 'undefined': + case 'unknown': + case 'function': + break; + default: + if (preComma) { + result.push(','); + } + preComma = 1; + result.push(encode(key) + ':' + encode(item)); + } + } + } + result.push('}'); + return result.join(''); + } + } + }; +})(); +/* + * Tangram + * Copyright 2009 Baidu Inc. All rights reserved. + * + * path: baidu/json/encode.js + * author: erik, cat + * version: 1.3.4 + * date: 2010/12/23 + */ + + +/** + * 将json对象序列化,为过时接口,今后会被baidu.json.stringify代替 + * @name baidu.json.encode + * @function + * @grammar baidu.json.encode(value) + * @param {JSON} value 需要序列化的json对象 + * @meta out + * @see baidu.json.decode,baidu.json.stringify + * + * @returns {string} 序列化后的字符串 + */ +baidu.json.encode = baidu.json.stringify; diff --git a/admin/dialogs/wordimage/wordimage.html b/admin/dialogs/wordimage/wordimage.html new file mode 100644 index 0000000..8ca3e9e --- /dev/null +++ b/admin/dialogs/wordimage/wordimage.html @@ -0,0 +1,153 @@ + + + + + + + + + +
    +
    + +
    +
    +
    +
    +
    + +
    + : +
    +
    +
    + + + + + + \ No newline at end of file diff --git a/admin/dialogs/wordimage/wordimage.js b/admin/dialogs/wordimage/wordimage.js new file mode 100644 index 0000000..bffc17d --- /dev/null +++ b/admin/dialogs/wordimage/wordimage.js @@ -0,0 +1,159 @@ +/** + * Created by JetBrains PhpStorm. + * User: taoqili + * Date: 12-1-30 + * Time: 下午12:50 + * To change this template use File | Settings | File Templates. + */ + + + +var wordImage = {}; +//(function(){ +var g = baidu.g, + flashObj, flashContainer; + +wordImage.init = function (opt, callbacks) { + showLocalPath("localPath"); + //createCopyButton("clipboard","localPath"); + createFlashUploader(opt, callbacks); + addUploadListener(); + addOkListener(); +}; + +function hideFlash() { + flashObj = null; + flashContainer.innerHTML = ""; +} + +function addOkListener() { + dialog.onok = function () { + if (!imageUrls.length) return; + var urlPrefix = editor.getOpt('imageUrlPrefix'), + images = domUtils.getElementsByTagName(editor.document, "img"); + editor.fireEvent('saveScene'); + for (var i = 0, img; img = images[i++];) { + var src = img.getAttribute("word_img"); + if (!src) continue; + for (var j = 0, url; url = imageUrls[j++];) { + if (src.indexOf(url.original.replace(" ", "")) != -1) { + img.src = urlPrefix + url.url; + img.setAttribute("_src", urlPrefix + url.url); //同时修改"_src"属性 + img.setAttribute("title", url.title); + domUtils.removeAttributes(img, ["word_img", "style", "width", "height"]); + editor.fireEvent("selectionchange"); + break; + } + } + } + editor.fireEvent('saveScene'); + hideFlash(); + }; + dialog.oncancel = function () { + hideFlash(); + } +} + +/** + * 绑定开始上传事件 + */ +function addUploadListener() { + g("upload").onclick = function () { + flashObj.upload(); + this.style.display = "none"; + }; +} + +function showLocalPath(id) { + //单张编辑 + var img = editor.selection.getRange().getClosedNode(); + var images = editor.execCommand('wordimage'); + if (images.length == 1 || img && img.tagName == 'IMG') { + g(id).value = images[0]; + return; + } + var path = images[0]; + var leftSlashIndex = path.lastIndexOf("/") || 0, //不同版本的doc和浏览器都可能影响到这个符号,故直接判断两种 + rightSlashIndex = path.lastIndexOf("\\") || 0, + separater = leftSlashIndex > rightSlashIndex ? "/" : "\\"; + + path = path.substring(0, path.lastIndexOf(separater) + 1); + g(id).value = path; +} + +function createFlashUploader(opt, callbacks) { + //由于lang.flashI18n是静态属性,不可以直接进行修改,否则会影响到后续内容 + var i18n = utils.extend({}, lang.flashI18n); + //处理图片资源地址的编码,补全等问题 + for (var i in i18n) { + if (!(i in {"lang": 1, "uploadingTF": 1, "imageTF": 1, "textEncoding": 1}) && i18n[i]) { + i18n[i] = encodeURIComponent(editor.options.langPath + editor.options.lang + "/images/" + i18n[i]); + } + } + opt = utils.extend(opt, i18n, false); + var option = { + createOptions: { + id: 'flash', + url: opt.flashUrl, + width: opt.width, + height: opt.height, + errorMessage: lang.flashError, + wmode: browser.safari ? 'transparent' : 'window', + ver: '10.0.0', + vars: opt, + container: opt.container + } + }; + + option = extendProperty(callbacks, option); + flashObj = new baidu.flash.imageUploader(option); + flashContainer = $G(opt.container); +} + +function extendProperty(fromObj, toObj) { + for (var i in fromObj) { + if (!toObj[i]) { + toObj[i] = fromObj[i]; + } + } + return toObj; +} + +//})(); + +function getPasteData(id) { + baidu.g("msg").innerHTML = lang.copySuccess + "
    "; + setTimeout(function () { + baidu.g("msg").innerHTML = ""; + }, 5000); + return baidu.g(id).value; +} + +function createCopyButton(id, dataFrom) { + baidu.swf.create({ + id: "copyFlash", + url: "fClipboard_ueditor.swf", + width: "58", + height: "25", + errorMessage: "", + bgColor: "#CBCBCB", + wmode: "transparent", + ver: "10.0.0", + vars: { + tid: dataFrom + } + }, id + ); + + var clipboard = baidu.swf.getMovie("copyFlash"); + var clipinterval = setInterval(function () { + if (clipboard && clipboard.flashInit) { + clearInterval(clipinterval); + clipboard.setHandCursor(true); + clipboard.setContentFuncName("getPasteData"); + //clipboard.setMEFuncName("mouseEventHandler"); + } + }, 500); +} + +createCopyButton("clipboard", "localPath"); \ No newline at end of file diff --git a/admin/html/czkm.html b/admin/html/czkm.html new file mode 100644 index 0000000..8e85c88 --- /dev/null +++ b/admin/html/czkm.html @@ -0,0 +1,263 @@ + + + + + + + + 欢迎页 + + + + + + +
    + + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    + + + + + + +
    +
    +
    + + +
    + + + + + + + + + \ No newline at end of file diff --git a/admin/html/ddgl.html b/admin/html/ddgl.html new file mode 100644 index 0000000..5bdb849 --- /dev/null +++ b/admin/html/ddgl.html @@ -0,0 +1,205 @@ + + + + + + + + 欢迎页 + + + + + + +
    + + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    +
    +
    + +
    + + + +
    +
    + +
    +
    + + +
    + + + + + + + + + \ No newline at end of file diff --git a/admin/html/dlgl.html b/admin/html/dlgl.html new file mode 100644 index 0000000..b40e39a --- /dev/null +++ b/admin/html/dlgl.html @@ -0,0 +1,302 @@ + + + + + + + + 欢迎页 + + + + + + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + + +
    +
    +
    + + +
    + + +
    + + + + + + + + + \ No newline at end of file diff --git a/admin/html/dljb.html b/admin/html/dljb.html new file mode 100644 index 0000000..d158225 --- /dev/null +++ b/admin/html/dljb.html @@ -0,0 +1,287 @@ + + + + + + + + 欢迎页 + + + + + + +
    +
    +
    + +
    +
    +
    注意:切换页面会自动取消当前选择的应用
    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    【请输入小于1的小数】代理实际支付 = 基础价格 * + 折率;例如:套餐价格为100元,代理折率为0.9,则代理购买价格为90元 +
    +
    +
    +
    + +
    + +
    本级别的价格(用于在线开通代理),为0或空则不开启自助开通/升级
    +
    +
    + +
    +
    + + +
    +
    +
    + + +
    + + +
    + + + + + + + + + \ No newline at end of file diff --git a/admin/html/fksz.html b/admin/html/fksz.html new file mode 100644 index 0000000..372c57b --- /dev/null +++ b/admin/html/fksz.html @@ -0,0 +1,201 @@ + + + + + + + + 欢迎页 + + + + + + + +
    + +
    +
    +

    系统设置

    +
    +
    +
    + +
    + +
    +
    +
    + +
    + + +
    +
    +
    + +
    + + +
    +
    +
    + +
    + + +
    +
    +
    +
    + + +
    +
    + +
    + +
    +
    +
    + +
    +
    +

    免签约设置

    +
    +
    + 支持市面上大部分易支付,若不知道支付域名请联系供应商客服询问,部分易支付不支持回调二次验证,如果已付款跳回站点显示未付款请关闭二次验证 +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + + +
    +
    + +
    + +
    +
    +
    + +
    + + + + + + + + + \ No newline at end of file diff --git a/admin/html/ktsq.html b/admin/html/ktsq.html new file mode 100644 index 0000000..b798aa3 --- /dev/null +++ b/admin/html/ktsq.html @@ -0,0 +1,113 @@ + + + + + + + + 欢迎页 + + + + + +
    +
    +
    + +
    + +
    +
    +
    + +
    +
    +
    + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/admin/html/sqgl.html b/admin/html/sqgl.html new file mode 100644 index 0000000..a3c7981 --- /dev/null +++ b/admin/html/sqgl.html @@ -0,0 +1,192 @@ + + + + + + + + 欢迎页 + + + + + + +
    +
    +
    + +
    + +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    +
    必须在12.0更新后新增的用户才能显示用户来源,来源ID按不同情况为订单ID(前台)、管理ID(后台)、卡密ID(卡密)、代理ID(代理)
    +
    + + +
    + + + + + + + + + \ No newline at end of file diff --git a/admin/html/tckm.html b/admin/html/tckm.html new file mode 100644 index 0000000..b452c17 --- /dev/null +++ b/admin/html/tckm.html @@ -0,0 +1,256 @@ + + + + + + + + 欢迎页 + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + +
    +
    + +
    + + + + + +
    +
    + +
    +
    +
    + + + +
    + + + + + + + + + \ No newline at end of file diff --git a/admin/html/tclb.html b/admin/html/tclb.html new file mode 100644 index 0000000..e092897 --- /dev/null +++ b/admin/html/tclb.html @@ -0,0 +1,130 @@ + + + + + + + + 欢迎页 + + + + + + +
    + +
    + + +
    + + + + + + + + + \ No newline at end of file diff --git a/admin/html/tjtc.html b/admin/html/tjtc.html new file mode 100644 index 0000000..7021253 --- /dev/null +++ b/admin/html/tjtc.html @@ -0,0 +1,140 @@ + + + + + + + + 欢迎页 + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    + +
    + +
    注意:代理购买时候的实际支付价格 = 这里的代理价格 × 代理等级设置的提卡折率
    +
    +
    +
    + +
    + +
    如果使用方式为扣除余额,则为余额数量(点),如果使用方式为到期时间,则为使用分钟数。填-1则不会到期
    +
    + +
    +
    + +
    + + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + + + + + + + \ No newline at end of file diff --git a/admin/html/tjyy.html b/admin/html/tjyy.html new file mode 100644 index 0000000..a422227 --- /dev/null +++ b/admin/html/tjyy.html @@ -0,0 +1,196 @@ + + + + + + + + 添加应用 + + + + + + +
    +
    +
    + +
    + +
    +
    +
    + + +
    + + + + + + +
    +
    +
    + +
    + + + +
    +
    +
    + +
    + + +
    +
    +
    + +
    + +
    每分钟扣除的余额点数,仅使用方式为扣除余额时候有效
    +
    + +
    +
    + +
    + +
    如果使用方式为扣除余额,则为扣除的余额数量(点),如果使用方式为到期时间,则为扣除的使用分钟数
    + +
    +
    + + + +
    + +
    + +
    推荐为软件授权心跳间隔秒数 × 1.5,注意:小于1会导致数据库数据大量沉余而增加大量资源消耗和大幅减慢API速度,当超过3个周期未心跳将会自动下线(即此处设置10,30秒内均无心跳则token失效下线,需要用户重新登录)
    +
    +
    + +
    + +
    + +
    应用公告通过获取应用信息进行返回
    +
    +
    +
    + +
    + +
    只能是标准的小数格式,若需要1.1.101这种格式请在软件内置版本说明常量,此处仅判断软件是否有新版
    +
    +
    +
    + +
    + +
    通过获取应用信息返回
    +
    + +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    可以是百度云链接、或者下载绝对地址等等,获取应用信息中的下载地址和首页下载应用都会是这个地址
    +
    +
    +
    + +
    + +
    用户授权成功后才能获取这个,建议将一些重要数据放在这里面
    +
    +
    +
    +
    + + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/admin/html/userset.html b/admin/html/userset.html new file mode 100644 index 0000000..3f2f1df --- /dev/null +++ b/admin/html/userset.html @@ -0,0 +1,90 @@ + + + + + + + + 欢迎页 + + + + + + + +
    + +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + + +
    +
    + +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/admin/html/welcome.html b/admin/html/welcome.html new file mode 100644 index 0000000..0819809 --- /dev/null +++ b/admin/html/welcome.html @@ -0,0 +1,303 @@ + + + + + + + + 欢迎页 + + + + + + +
    +
    +
    +
    + +
    +
    +

    loading

    +

    应用数量

    +
    +
    +
    +
    +
    +
    + +
    +
    +

    loading

    +

    系统版本

    +
    +
    +
    +
    +
    +
    + +
    +
    +

    loading

    +

    充值卡密

    +
    +
    +
    +
    +
    +
    + +
    +
    +

    loading

    +

    套餐卡密

    +
    +
    +
    +
    +
    +
    + +
    +
    +

    loading

    +

    代理数量

    +
    +
    +
    +
    +
    +
    + +
    +
    +

    loading

    +

    订单数量

    +
    +
    +
    + +
    +
    +
    +

    系统公告

    +
    + +
    +
    +
    +
    +
    +
    +
    +

    系统更新

    +
    + +
    +
    +
    +
    +
    +
    +
    +

    更新日志

    +
    + +
    +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/admin/html/xjsz.html b/admin/html/xjsz.html new file mode 100644 index 0000000..7e109cb --- /dev/null +++ b/admin/html/xjsz.html @@ -0,0 +1,153 @@ + + + + + + + + 欢迎页 + + + + + + + +
    +
    + +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + + +
    +
    +
    + + +
    + + +
    + + + + + + + + + \ No newline at end of file diff --git a/admin/html/xqbj.html b/admin/html/xqbj.html new file mode 100644 index 0000000..691418d --- /dev/null +++ b/admin/html/xqbj.html @@ -0,0 +1,286 @@ + + + + + + + + 欢迎页 + + + + + + + +
    + +
    +
    +

    应用封面上传

    +
    +
    + +
    + +
    +
    +
    + +

    点击上传,或将文件拖拽到此处

    +
    +
    +
    + +
    +
    +
    + +
    +
    +

    详情介绍设置

    +
    +
    +
    + + +

    + +
    +
    + +
    + + + + + + + + + + + + + + \ No newline at end of file diff --git a/admin/html/xtsz.html b/admin/html/xtsz.html new file mode 100644 index 0000000..f1a31b1 --- /dev/null +++ b/admin/html/xtsz.html @@ -0,0 +1,488 @@ + + + + + + + + 欢迎页 + + + + + + + +
    + + +
    +
    +

    站点信息设置

    +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + + +
    +
    + + +
    + +
    +
    +
    +
    +
    +

    添加系统管理员

    +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    +
    + + +
    +
    + +
    + +
    +
    +
    +
    +
    +

    发信设置

    +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    + +
    +
    +
    请先保存后再发送测试邮件
    + + + +
    +
    + + +
    + +
    +
    +
    +
    +
    +

    内容设置

    +
    + +
    +
    代理公告支持HTML,同时支持 Layui + 相关组件,如果是跨域请求请注意请求头设置允许跨域
    首页导航示例:<a class="mdl-navigation__link" href="链接地址1">链接名称1</a> + <a class="mdl-navigation__link" href="http://fkw.wenquan6.cn">温泉发卡网</a> +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    +
    +
    + + +
    +
    + +
    + +
    +
    +
    +
    +
    +

    验证码设置

    +
    +
    +
    验证码使用的是vaptcha,您需要自行注册、创建验证单元后获取VID和Key,请确保VID和KEY正确后再开启验证码,否则将无法登录后台
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    + + +
    +
    + + +
    +
    + +
    + +
    +
    +
    +
    +
    +

    Api Token设置

    +
    +
    +
    请注意,此Token用于Api访问进行签名,有关签名相关问题请查看文档,重置token会导致以前的token立即失效,请谨慎操作!
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + +
    + +
    +
    +
    + +
    + + + + + + + + + \ No newline at end of file diff --git a/admin/html/yhxt.html b/admin/html/yhxt.html new file mode 100644 index 0000000..726e5fa --- /dev/null +++ b/admin/html/yhxt.html @@ -0,0 +1,150 @@ + + + + + + + + 欢迎页 + + + + + + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + + +
    +
    +
    + + +
    + + +
    + + + + + + + + + \ No newline at end of file diff --git a/admin/html/yxrz.html b/admin/html/yxrz.html new file mode 100644 index 0000000..698cf4e --- /dev/null +++ b/admin/html/yxrz.html @@ -0,0 +1,71 @@ + + + + + + + + 欢迎页 + + + + + + + +
    +
      +
      + + + + + + + + + \ No newline at end of file diff --git a/admin/html/yygl.html b/admin/html/yygl.html new file mode 100644 index 0000000..b4354b1 --- /dev/null +++ b/admin/html/yygl.html @@ -0,0 +1,206 @@ + + + + + + + + 欢迎页 + + + + + + +
      + +
      + + +
      + + + + + + + \ No newline at end of file diff --git a/admin/index.php b/admin/index.php new file mode 100644 index 0000000..ec19e56 --- /dev/null +++ b/admin/index.php @@ -0,0 +1,33 @@ +select_first_row('sq_admin', '*', array('username' => $_SESSION['admin_username'], 'password' => $_SESSION['admin_password']), 'AND')) { + echo '没有登录:code:-2'; + header('Location: login.html'); + + die(); +} +if ($_SERVER['HTTP_USER_AGENT'] !== $_SESSION['admin_HTTP_USER_AGENT']) { + echo '没有登录:code:-3'; + header('Location: login.html'); + die(); +} +if (!empty($_GET['mod']) && $_GET['mod'] == 'loginout') { + unset($_SESSION['admin_username']); + unset($_SESSION['admin_password']); + unset($_SESSION['admin_HTTP_USER_AGENT']); + header('Location: login.html'); +} +header('Location: admin.html'); \ No newline at end of file diff --git a/admin/lang/en/en.js b/admin/lang/en/en.js new file mode 100644 index 0000000..7c4072a --- /dev/null +++ b/admin/lang/en/en.js @@ -0,0 +1,762 @@ +/** + * Created with JetBrains PhpStorm. + * User: taoqili + * Date: 12-6-12 + * Time: 下午6:57 + * To change this template use File | Settings | File Templates. + */ +UE.I18N['en'] = { + 'labelMap': { + 'anchor': 'Anchor', + 'undo': 'Undo', + 'redo': 'Redo', + 'bold': 'Bold', + 'indent': 'Indent', + 'snapscreen': 'SnapScreen', + 'italic': 'Italic', + 'underline': 'Underline', + 'strikethrough': 'Strikethrough', + 'subscript': 'SubScript', + 'fontborder': 'text border', + 'superscript': 'SuperScript', + 'formatmatch': 'Format Match', + 'source': 'Source', + 'blockquote': 'BlockQuote', + 'pasteplain': 'PastePlain', + 'selectall': 'SelectAll', + 'print': 'Print', + 'preview': 'Preview', + 'horizontal': 'Horizontal', + 'removeformat': 'RemoveFormat', + 'time': 'Time', + 'date': 'Date', + 'unlink': 'Unlink', + 'insertrow': 'InsertRow', + 'insertcol': 'InsertCol', + 'mergeright': 'MergeRight', + 'mergedown': 'MergeDown', + 'deleterow': 'DeleteRow', + 'deletecol': 'DeleteCol', + 'splittorows': 'SplitToRows', + 'insertcode': 'insert code', + 'splittocols': 'SplitToCols', + 'splittocells': 'SplitToCells', + 'deletecaption': 'DeleteCaption', + 'inserttitle': 'InsertTitle', + 'mergecells': 'MergeCells', + 'deletetable': 'DeleteTable', + 'cleardoc': 'Clear', + 'insertparagraphbeforetable': "InsertParagraphBeforeTable", + 'fontfamily': 'FontFamily', + 'fontsize': 'FontSize', + 'paragraph': 'Paragraph', + 'simpleupload': 'Single Image', + 'insertimage': 'Multi Image', + 'edittable': 'Edit Table', + 'edittd': 'Edit Td', + 'link': 'Link', + 'emotion': 'Emotion', + 'spechars': 'Spechars', + 'searchreplace': 'SearchReplace', + 'map': 'BaiduMap', + 'gmap': 'GoogleMap', + 'insertvideo': 'Video', + 'help': 'Help', + 'justifyleft': 'JustifyLeft', + 'justifyright': 'JustifyRight', + 'justifycenter': 'JustifyCenter', + 'justifyjustify': 'Justify', + 'forecolor': 'FontColor', + 'backcolor': 'BackColor', + 'insertorderedlist': 'OL', + 'insertunorderedlist': 'UL', + 'fullscreen': 'FullScreen', + 'directionalityltr': 'EnterFromLeft', + 'directionalityrtl': 'EnterFromRight', + 'rowspacingtop': 'RowSpacingTop', + 'rowspacingbottom': 'RowSpacingBottom', + 'pagebreak': 'PageBreak', + 'insertframe': 'Iframe', + 'imagenone': 'Default', + 'imageleft': 'ImageLeft', + 'imageright': 'ImageRight', + 'attachment': 'Attachment', + 'imagecenter': 'ImageCenter', + 'wordimage': 'WordImage', + 'lineheight': 'LineHeight', + 'edittip': 'EditTip', + 'customstyle': 'CustomStyle', + 'scrawl': 'Scrawl', + 'autotypeset': 'AutoTypeset', + 'webapp': 'WebAPP', + 'touppercase': 'UpperCase', + 'tolowercase': 'LowerCase', + 'template': 'Template', + 'background': 'Background', + 'inserttable': 'InsertTable', + 'music': 'Music', + 'charts': 'charts', + 'drafts': 'Load from Drafts' + }, + 'insertorderedlist': { + 'num': '1,2,3...', + 'num1': '1),2),3)...', + 'num2': '(1),(2),(3)...', + 'cn': '一,二,三....', + 'cn1': '一),二),三)....', + 'cn2': '(一),(二),(三)....', + 'decimal': '1,2,3...', + 'lower-alpha': 'a,b,c...', + 'lower-roman': 'i,ii,iii...', + 'upper-alpha': 'A,B,C...', + 'upper-roman': 'I,II,III...' + }, + 'insertunorderedlist': { + 'circle': '○ Circle', + 'disc': '● Circle dot', + 'square': '■ Rectangle ', + 'dash': '- Dash', + 'dot': '。dot' + }, + 'paragraph': { + 'p': 'Paragraph', + 'h1': 'Title 1', + 'h2': 'Title 2', + 'h3': 'Title 3', + 'h4': 'Title 4', + 'h5': 'Title 5', + 'h6': 'Title 6' + }, + 'fontfamily': { + 'songti': 'Sim Sun', + 'kaiti': 'Sim Kai', + 'heiti': 'Sim Hei', + 'lishu': 'Sim Li', + 'yahei': 'Microsoft YaHei', + 'andaleMono': 'Andale Mono', + 'arial': 'Arial', + 'arialBlack': 'Arial Black', + 'comicSansMs': 'Comic Sans MS', + 'impact': 'Impact', + 'timesNewRoman': 'Times New Roman' + }, + 'customstyle': { + 'tc': 'Title center', + 'tl': 'Title left', + 'im': 'Important', + 'hi': 'Highlight' + }, + 'autoupload': { + 'exceedSizeError': 'File Size Exceed', + 'exceedTypeError': 'File Type Not Allow', + 'jsonEncodeError': 'Server Return Format Error', + 'loading': "loading...", + 'loadError': "load error", + 'errorLoadConfig': 'Server config not loaded, upload can not work.', + }, + 'simpleupload': { + 'exceedSizeError': 'File Size Exceed', + 'exceedTypeError': 'File Type Not Allow', + 'jsonEncodeError': 'Server Return Format Error', + 'loading': "loading...", + 'loadError': "load error", + 'errorLoadConfig': 'Server config not loaded, upload can not work.', + }, + 'elementPathTip': "Path", + 'wordCountTip': "Word Count", + 'wordCountMsg': '{#count} characters entered,{#leave} left. ', + 'wordOverFlowMsg': 'The number of characters has exceeded allowable maximum values, the server may refuse to save!', + 'ok': "OK", + 'cancel': "Cancel", + 'closeDialog': "closeDialog", + 'tableDrag': "You must import the file uiUtils.js before drag! ", + 'autofloatMsg': "The plugin AutoFloat depends on EditorUI!", + 'loadconfigError': 'Get server config error.', + 'loadconfigFormatError': 'Server config format error.', + 'loadconfigHttpError': 'Get server config http error.', + 'snapScreen_plugin': { + 'browserMsg': "Only IE supported!", + 'callBackErrorMsg': "The callback data is wrong,please check the config!", + 'uploadErrorMsg': "Upload error,please check your server environment! " + }, + 'insertcode': { + 'as3': 'ActionScript 3', + 'bash': 'Bash/Shell', + 'cpp': 'C/C++', + 'css': 'CSS', + 'cf': 'ColdFusion', + 'c#': 'C#', + 'delphi': 'Delphi', + 'diff': 'Diff', + 'erlang': 'Erlang', + 'groovy': 'Groovy', + 'html': 'HTML', + 'java': 'Java', + 'jfx': 'JavaFX', + 'js': 'JavaScript', + 'pl': 'Perl', + 'php': 'PHP', + 'plain': 'Plain Text', + 'ps': 'PowerShell', + 'python': 'Python', + 'ruby': 'Ruby', + 'scala': 'Scala', + 'sql': 'SQL', + 'vb': 'Visual Basic', + 'xml': 'XML' + }, + 'confirmClear': "Do you confirm to clear the Document?", + 'contextMenu': { + 'delete': "Delete", + 'selectall': "Select all", + 'deletecode': "Delete Code", + 'cleardoc': "Clear Document", + 'confirmclear': "Do you confirm to clear the Document?", + 'unlink': "Unlink", + 'paragraph': "Paragraph", + 'edittable': "Table property", + 'aligncell': 'Align cell', + 'aligntable': 'Table alignment', + 'tableleft': 'Left float', + 'tablecenter': 'Center', + 'tableright': 'Right float', + 'aligntd': 'Cell alignment', + 'edittd': "Cell property", + 'setbordervisible': 'set table edge visible', + 'table': "Table", + 'justifyleft': 'Justify Left', + 'justifyright': 'Justify Right', + 'justifycenter': 'Justify Center', + 'justifyjustify': 'Default', + 'deletetable': "Delete table", + 'insertparagraphbefore': "InsertedBeforeLine", + 'insertparagraphafter': 'InsertedAfterLine', + 'inserttable': 'Insert table', + 'insertcaption': 'Insert caption', + 'deletecaption': 'Delete Caption', + 'inserttitle': 'Insert Title', + 'deletetitle': 'Delete Title', + 'inserttitlecol': 'Insert Title Col', + 'deletetitlecol': 'Delete Title Col', + 'averageDiseRow': 'AverageDise Row', + 'averageDisCol': 'AverageDis Col', + 'deleterow': "Delete row", + 'deletecol': "Delete col", + 'insertrow': "Insert row", + 'insertcol': "Insert col", + 'insertrownext': 'Insert Row Next', + 'insertcolnext': 'Insert Col Next', + 'mergeright': "Merge right", + 'mergeleft': "Merge left", + 'mergedown': "Merge down", + 'mergecells': "Merge cells", + 'splittocells': "Split to cells", + 'splittocols': "Split to Cols", + 'splittorows': "Split to Rows", + 'tablesort': 'Table sorting', + 'enablesort': 'Sorting Enable', + 'disablesort': 'Sorting Disable', + 'reversecurrent': 'Reverse current', + 'orderbyasc': 'Order By ASCII', + 'reversebyasc': 'Reverse By ASCII', + 'orderbynum': 'Order By Num', + 'reversebynum': 'Reverse By Num', + 'borderbk': 'Border shading', + 'setcolor': 'interlaced color', + 'unsetcolor': 'Cancel interlacedcolor', + 'setbackground': 'Background interlaced', + 'unsetbackground': 'Cancel Bk interlaced', + 'redandblue': 'Blue and red', + 'threecolorgradient': 'Three-color gradient', + 'copy': "Copy(Ctrl + c)", + 'copymsg': "Browser does not support. Please use 'Ctrl + c' instead!", + 'paste': "Paste(Ctrl + v)", + 'pastemsg': "Browser does not support. Please use 'Ctrl + v' instead!" + }, + 'copymsg': "Browser does not support. Please use 'Ctrl + c' instead!", + 'pastemsg': "Browser does not support. Please use 'Ctrl + v' instead!", + 'anthorMsg': "Link", + 'clearColor': 'Clear', + 'standardColor': 'Standard color', + 'themeColor': 'Theme color', + 'property': 'Property', + 'default': 'Default', + 'modify': 'Modify', + 'justifyleft': 'Justify Left', + 'justifyright': 'Justify Right', + 'justifycenter': 'Justify Center', + 'justify': 'Default', + 'clear': 'Clear', + 'anchorMsg': 'Anchor', + 'delete': 'Delete', + 'clickToUpload': "Click to upload", + 'unset': 'Language hasn\'t been set!', + 't_row': 'row', + 't_col': 'col', + 'pasteOpt': 'Paste Option', + 'pasteSourceFormat': "Keep Source Formatting", + 'tagFormat': 'Keep tag', + 'pasteTextFormat': 'Keep Text only', + 'more': 'More', + 'autoTypeSet': { + 'mergeLine': "Merge empty line", + 'delLine': "Del empty line", + 'removeFormat': "Remove format", + 'indent': "Indent", + 'alignment': "Alignment", + 'imageFloat': "Image float", + 'removeFontsize': "Remove font size", + 'removeFontFamily': "Remove fontFamily", + 'removeHtml': "Remove redundant HTML code", + 'pasteFilter': "Paste filter", + 'run': "Done", + 'symbol': 'Symbol Conversion', + 'bdc2sb': 'Full-width to Half-width', + 'tobdc': 'Half-width to Full-width' + }, + + 'background': { + 'static': { + 'lang_background_normal': 'Normal', + 'lang_background_local': 'Online', + 'lang_background_set': 'Background Set', + 'lang_background_none': 'No Background', + 'lang_background_colored': 'Colored Background', + 'lang_background_color': 'Color Set', + 'lang_background_netimg': 'Net-Image', + 'lang_background_align': 'Align Type', + 'lang_background_position': 'Position', + 'repeatType': {'options': ["Center", "Repeat-x", "Repeat-y", "Tile", "Custom"]} + }, + 'noUploadImage': "No pictures has been uploaded!", + 'toggleSelect': 'Change the active state by click!\n Image Size: ' + }, + //===============dialog i18N======================= + 'insertimage': { + 'static': { + 'lang_tab_remote': "Insert", + 'lang_tab_upload': "Local", + 'lang_tab_online': "Manager", + 'lang_tab_search': "Search", + 'lang_input_url': "Address:", + 'lang_input_size': "Size:", + 'lang_input_width': "Width", + 'lang_input_height': "Height", + 'lang_input_border': "Border:", + 'lang_input_vhspace': "Margins:", + 'lang_input_title': "Title:", + 'lang_input_align': 'Image Float Style:', + 'lang_imgLoading': "Loading...", + 'lang_start_upload': "Start Upload", + 'lock': {'title': "Lock rate"}, + 'searchType': {'title': "ImageType", 'options': ["News", "Wallpaper", "emotions", "photo"]}, + 'searchTxt': {'value': "Enter the search keyword!"}, + 'searchBtn': {'value': "Search"}, + 'searchReset': {'value': "Clear"}, + 'noneAlign': {'title': 'None Float'}, + 'leftAlign': {'title': 'Left Float'}, + 'rightAlign': {'title': 'Right Float'}, + 'centerAlign': {'title': 'Center In A Line'} + }, + 'uploadSelectFile': 'Select File', + 'uploadAddFile': 'Add File', + 'uploadStart': 'Start Upload', + 'uploadPause': 'Pause Upload', + 'uploadContinue': 'Continue Upload', + 'uploadRetry': 'Retry Upload', + 'uploadDelete': 'Delete', + 'uploadTurnLeft': 'Turn Left', + 'uploadTurnRight': 'Turn Right', + 'uploadPreview': 'Doing Preview', + 'uploadNoPreview': 'Can Not Preview', + 'updateStatusReady': 'Selected _ pictures, total _KB.', + 'updateStatusConfirm': '_ uploaded successfully and _ upload failed', + 'updateStatusFinish': 'Total _ pictures (_KB), _ uploaded successfully', + 'updateStatusError': ' and _ upload failed', + 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player', + 'errorLoadConfig': 'Server config not loaded, upload can not work.', + 'errorExceedSize': 'File Size Exceed', + 'errorFileType': 'File Type Not Allow', + 'errorInterrupt': 'File Upload Interrupted', + 'errorUploadRetry': 'Upload Error, Please Retry.', + 'errorHttp': 'Http Error', + 'errorServerUpload': 'Server Result Error.', + 'remoteLockError': "Cannot Lock the Proportion between width and height", + 'numError': "Please enter the correct Num. e.g 123,400", + 'imageUrlError': "The image format may be wrong!", + 'imageLoadError': "Error,please check the network or URL!", + 'searchRemind': "Enter the search keyword!", + 'searchLoading': "Image is loading,please wait...", + 'searchRetry': " Sorry,can't find the image,please try again!" + }, + 'attachment': { + 'static': { + 'lang_tab_upload': 'Upload', + 'lang_tab_online': 'Online', + 'lang_start_upload': "Start upload", + 'lang_drop_remind': "You can drop files here, a single maximum of 300 files" + }, + 'uploadSelectFile': 'Select File', + 'uploadAddFile': 'Add File', + 'uploadStart': 'Start Upload', + 'uploadPause': 'Pause Upload', + 'uploadContinue': 'Continue Upload', + 'uploadRetry': 'Retry Upload', + 'uploadDelete': 'Delete', + 'uploadTurnLeft': 'Turn Left', + 'uploadTurnRight': 'Turn Right', + 'uploadPreview': 'Doing Preview', + 'updateStatusReady': 'Selected _ files, total _KB.', + 'updateStatusConfirm': '_ uploaded successfully and _ upload failed', + 'updateStatusFinish': 'Total _ files (_KB), _ uploaded successfully', + 'updateStatusError': ' and _ upload failed', + 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player', + 'errorLoadConfig': 'Server config not loaded, upload can not work.', + 'errorExceedSize': 'File Size Exceed', + 'errorFileType': 'File Type Not Allow', + 'errorInterrupt': 'File Upload Interrupted', + 'errorUploadRetry': 'Upload Error, Please Retry.', + 'errorHttp': 'Http Error', + 'errorServerUpload': 'Server Result Error.' + }, + + 'insertvideo': { + 'static': { + 'lang_tab_insertV': "Video", + 'lang_tab_searchV': "Search", + 'lang_tab_uploadV': "Upload", + 'lang_video_url': " URL ", + 'lang_video_size': "Video Size", + 'lang_videoW': "Width", + 'lang_videoH': "Height", + 'lang_alignment': "Alignment", + 'videoSearchTxt': {'value': "Enter the search keyword!"}, + 'videoType': {'options': ["All", "Hot", "Entertainment", "Funny", "Sports", "Science", "variety"]}, + 'videoSearchBtn': {'value': "Search in Baidu"}, + 'videoSearchReset': {'value': "Clear result"}, + + 'lang_input_fileStatus': ' No file uploaded!', + 'startUpload': {'style': "background:url(upload.png) no-repeat;"}, + + 'lang_upload_size': "Video Size", + 'lang_upload_width': "Width", + 'lang_upload_height': "Height", + 'lang_upload_alignment': "Alignment", + 'lang_format_advice': "Recommends mp4 format." + }, + 'numError': "Please enter the correct Num. e.g 123,400", + 'floatLeft': "Float left", + 'floatRight': "Float right", + 'default': "Default", + 'block': "Display in block", + 'urlError': "The video url format may be wrong!", + 'loading': "  The video is loading, please wait…", + 'clickToSelect': "Click to select", + 'goToSource': 'Visit source video ', + 'noVideo': "    Sorry,can't find the video,please try again!", + + 'browseFiles': 'Open files', + 'uploadSuccess': 'Upload Successful!', + 'delSuccessFile': 'Remove from the success of the queue', + 'delFailSaveFile': 'Remove the save failed file', + 'statusPrompt': ' file(s) uploaded! ', + 'flashVersionError': 'The current Flash version is too low, please update FlashPlayer,then try again!', + 'flashLoadingError': 'The Flash failed loading! Please check the path or network state', + 'fileUploadReady': 'Wait for uploading...', + 'delUploadQueue': 'Remove from the uploading queue ', + 'limitPrompt1': 'Can not choose more than single', + 'limitPrompt2': 'file(s)!Please choose again!', + 'delFailFile': 'Remove failure file', + 'fileSizeLimit': 'File size exceeds the limit!', + 'emptyFile': 'Can not upload an empty file!', + 'fileTypeError': 'File type error!', + 'unknownError': 'Unknown error!', + 'fileUploading': 'Uploading,please wait...', + 'cancelUpload': 'Cancel upload', + 'netError': 'Network error', + 'failUpload': 'Upload failed', + 'serverIOError': 'Server IO error!', + 'noAuthority': 'No Permission!', + 'fileNumLimit': 'Upload limit to the number', + 'failCheck': 'Authentication fails, the upload is skipped!', + 'fileCanceling': 'Cancel, please wait...', + 'stopUploading': 'Upload has stopped...', + + 'uploadSelectFile': 'Select File', + 'uploadAddFile': 'Add File', + 'uploadStart': 'Start Upload', + 'uploadPause': 'Pause Upload', + 'uploadContinue': 'Continue Upload', + 'uploadRetry': 'Retry Upload', + 'uploadDelete': 'Delete', + 'uploadTurnLeft': 'Turn Left', + 'uploadTurnRight': 'Turn Right', + 'uploadPreview': 'Doing Preview', + 'updateStatusReady': 'Selected _ files, total _KB.', + 'updateStatusConfirm': '_ uploaded successfully and _ upload failed', + 'updateStatusFinish': 'Total _ files (_KB), _ uploaded successfully', + 'updateStatusError': ' and _ upload failed', + 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player', + 'errorLoadConfig': 'Server config not loaded, upload can not work.', + 'errorExceedSize': 'File Size Exceed', + 'errorFileType': 'File Type Not Allow', + 'errorInterrupt': 'File Upload Interrupted', + 'errorUploadRetry': 'Upload Error, Please Retry.', + 'errorHttp': 'Http Error', + 'errorServerUpload': 'Server Result Error.' + }, + 'webapp': { + 'tip1': "This function provided by Baidu APP,please apply for baidu APPKey webmaster first!", + 'tip2': "And then open the file ueditor.config.js to set it! ", + 'applyFor': "APPLY FOR", + 'anthorApi': "Baidu API" + }, + 'template': { + 'static': { + 'lang_template_bkcolor': 'Background Color', + 'lang_template_clear': 'Keep Content', + 'lang_template_select': 'Select Template' + }, + 'blank': "Blank", + 'blog': "Blog", + 'resume': "Resume", + 'richText': "Rich Text", + 'scrPapers': "Scientific Papers" + }, + scrawl: { + 'static': { + 'lang_input_previousStep': "Previous", + 'lang_input_nextsStep': "Next", + 'lang_input_clear': 'Clear', + 'lang_input_addPic': 'AddImage', + 'lang_input_ScalePic': 'ScaleImage', + 'lang_input_removePic': 'RemoveImage', + 'J_imgTxt': {title: 'Add background image'} + }, + 'noScarwl': "No paint, a white paper...", + 'scrawlUpLoading': "Image is uploading, please wait...", + 'continueBtn': "Try again", + 'imageError': "Image failed to load!", + 'backgroundUploading': 'Image is uploading,please wait...' + }, + 'music': { + 'static': { + 'lang_input_tips': "Input singer/song/album, search you interested in music!", + 'J_searchBtn': {value: 'Search songs'} + }, + 'emptyTxt': 'Not search to the relevant music results, please change a keyword try.', + 'chapter': 'Songs', + 'singer': 'Singer', + 'special': 'Album', + 'listenTest': 'Audition' + }, + anchor: { + 'static': { + 'lang_input_anchorName': 'Anchor Name:' + } + }, + 'charts': { + 'static': { + 'lang_data_source': 'Data source:', + 'lang_chart_format': 'Chart format:', + 'lang_data_align': 'Align', + 'lang_chart_align_same': 'Consistent with the X-axis Y-axis', + 'lang_chart_align_reverse': 'X-axis Y-axis opposite', + 'lang_chart_title': 'Title', + 'lang_chart_main_title': 'main title:', + 'lang_chart_sub_title': 'sub title:', + 'lang_chart_x_title': 'X-axis title:', + 'lang_chart_y_title': 'Y-axis title:', + 'lang_chart_tip': 'Prompt', + 'lang_cahrt_tip_prefix': 'prefix:', + 'lang_cahrt_tip_description': '仅饼图有效, 当鼠标移动到饼图中相应的块上时,提示框内的文字的前缀', + 'lang_chart_data_unit': 'Unit', + 'lang_chart_data_unit_title': 'unit:', + 'lang_chart_data_unit_description': '显示在每个数据点上的数据的单位, 比如: 温度的单位 ℃', + 'lang_chart_type': 'Chart type:', + 'lang_prev_btn': 'Previous', + 'lang_next_btn': 'Next' + } + }, + emotion: { + 'static': { + 'lang_input_choice': 'Choice', + 'lang_input_Tuzki': 'Tuzki', + 'lang_input_lvdouwa': 'LvDouWa', + 'lang_input_BOBO': 'BOBO', + 'lang_input_babyCat': 'BabyCat', + 'lang_input_bubble': 'Bubble', + 'lang_input_youa': 'YouA' + } + }, + gmap: { + 'static': { + 'lang_input_address': 'Address:', + 'lang_input_search': 'Search', + 'address': {value: "Beijing"} + }, + searchError: 'Unable to locate the address!' + }, + help: { + 'static': { + 'lang_input_about': 'About', + 'lang_input_shortcuts': 'Shortcuts', + 'lang_input_introduction': "UEditor is developed by Baidu Co.ltd. It is lightweight, customizable , focusing on user experience and etc. , UEditor is based on open source BSD license , allowing free use and redistribution.", + 'lang_Txt_shortcuts': 'Shortcuts', + 'lang_Txt_func': 'Function', + 'lang_Txt_bold': 'Bold', + 'lang_Txt_copy': 'Copy', + 'lang_Txt_cut': 'Cut', + 'lang_Txt_Paste': 'Paste', + 'lang_Txt_undo': 'Undo', + 'lang_Txt_redo': 'Redo', + 'lang_Txt_italic': 'Italic', + 'lang_Txt_underline': 'Underline', + 'lang_Txt_selectAll': 'Select All', + 'lang_Txt_visualEnter': 'Submit', + 'lang_Txt_fullscreen': 'Fullscreen' + } + }, + insertframe: { + 'static': { + 'lang_input_address': 'Address:', + 'lang_input_width': 'Width:', + 'lang_input_height': 'height:', + 'lang_input_isScroll': 'Enable scrollbars:', + 'lang_input_frameborder': 'Show frame border:', + 'lang_input_alignMode': 'Alignment:', + 'align': {title: "Alignment", options: ["Default", "Left", "Right", "Center"]} + }, + 'enterAddress': 'Please enter an address!' + }, + link: { + 'static': { + 'lang_input_text': 'Text:', + 'lang_input_url': 'URL:', + 'lang_input_title': 'Title:', + 'lang_input_target': 'open in new window:' + }, + 'validLink': 'Supports only effective when a link is selected', + 'httpPrompt': 'The hyperlink you enter should start with "http|https|ftp://"!' + }, + map: { + 'static': { + lang_city: "City", + lang_address: "Address", + city: {value: "Beijing"}, + lang_search: "Search", + lang_dynamicmap: "Dynamic map" + }, + cityMsg: "Please enter the city name!", + errorMsg: "Can't find the place!" + }, + searchreplace: { + 'static': { + lang_tab_search: "Search", + lang_tab_replace: "Replace", + lang_search1: "Search", + lang_search2: "Search", + lang_replace: "Replace", + lang_searchReg: 'Support regular expression ,which starts and ends with a slash ,for example "/expression/"', + lang_searchReg1: 'Support regular expression ,which starts and ends with a slash ,for example "/expression/"', + lang_case_sensitive1: "Case sense", + lang_case_sensitive2: "Case sense", + nextFindBtn: {value: "Next"}, + preFindBtn: {value: "Preview"}, + nextReplaceBtn: {value: "Next"}, + preReplaceBtn: {value: "Preview"}, + repalceBtn: {value: "Replace"}, + repalceAllBtn: {value: "Replace all"} + }, + getEnd: "Has the search to the bottom!", + getStart: "Has the search to the top!", + countMsg: "Altogether replaced {#count} character(s)!" + }, + snapscreen: { + 'static': { + lang_showMsg: "You should install the UEditor screenshots program first!", + lang_download: "Download!", + lang_step1: "Step1:Download the program and then run it", + lang_step2: "Step2:After complete install,try to click the button again" + } + }, + spechars: { + 'static': {}, + tsfh: "Special", + lmsz: "Roman", + szfh: "Numeral", + rwfh: "Japanese", + xlzm: "The Greek", + ewzm: "Russian", + pyzm: "Phonetic", + yyyb: "English", + zyzf: "Others" + }, + 'edittable': { + 'static': { + 'lang_tableStyle': 'Table style', + 'lang_insertCaption': 'Add table header row', + 'lang_insertTitle': 'Add table title row', + 'lang_insertTitleCol': 'Add table title col', + 'lang_tableSize': 'Automatically adjust table size', + 'lang_autoSizeContent': 'Adaptive by form text', + 'lang_orderbycontent': "Table of contents sortable", + 'lang_autoSizePage': 'Page width adaptive', + 'lang_example': 'Example', + 'lang_borderStyle': 'Table Border', + 'lang_color': 'Color:' + }, + captionName: 'Caption', + titleName: 'Title', + cellsName: 'text', + errorMsg: 'There are merged cells, can not sort.' + }, + 'edittip': { + 'static': { + lang_delRow: 'Delete entire row', + lang_delCol: 'Delete entire col' + } + }, + 'edittd': { + 'static': { + lang_tdBkColor: 'Background Color:' + } + }, + 'formula': { + 'static': {} + }, + wordimage: { + 'static': { + lang_resave: "The re-save step", + uploadBtn: {src: "upload.png", alt: "Upload"}, + clipboard: {style: "background: url(copy.png) -153px -1px no-repeat;"}, + lang_step: " 1. Click top button to copy the url and then open the dialog to paste it. 2. Open after choose photos uploaded process." + }, + fileType: "Image", + flashError: "Flash initialization failed!", + netError: "Network error! Please try again!", + copySuccess: "URL has been copied!", + + 'flashI18n': { + lang: encodeURI('{"UploadingState":"totalNum: ${a},uploadComplete: ${b}", "BeforeUpload":"waitingNum: ${a}", "ExceedSize":"Size exceed${a}", "ErrorInPreview":"Preview failed", "DefaultDescription":"Description", "LoadingImage":"Loading..."}'), + uploadingTF: encodeURI('{"font":"Arial", "size":12, "color":"0x000", "bold":"true", "italic":"false", "underline":"false"}'), + imageTF: encodeURI('{"font":"Arial", "size":11, "color":"red", "bold":"false", "italic":"false", "underline":"false"}'), + textEncoding: "utf-8", + addImageSkinURL: "addImage.png", + allDeleteBtnUpSkinURL: "allDeleteBtnUpSkin.png", + allDeleteBtnHoverSkinURL: "allDeleteBtnHoverSkin.png", + rotateLeftBtnEnableSkinURL: "rotateLeftEnable.png", + rotateLeftBtnDisableSkinURL: "rotateLeftDisable.png", + rotateRightBtnEnableSkinURL: "rotateRightEnable.png", + rotateRightBtnDisableSkinURL: "rotateRightDisable.png", + deleteBtnEnableSkinURL: "deleteEnable.png", + deleteBtnDisableSkinURL: "deleteDisable.png", + backgroundURL: '', + listBackgroundURL: '', + buttonURL: 'button.png' + } + }, + 'autosave': { + 'success': 'Local conservation success' + } +}; diff --git a/admin/lang/en/images/addimage.png b/admin/lang/en/images/addimage.png new file mode 100644 index 0000000000000000000000000000000000000000..3a2fd17121b9e0d435b2ca082d696c33b9f27b79 GIT binary patch literal 3373 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 ZzyK$sgmq7P@T33$002ovPDHLkV1jUEUt0hG literal 0 HcmV?d00001 diff --git a/admin/lang/en/images/alldeletebtnupskin.png b/admin/lang/en/images/alldeletebtnupskin.png new file mode 100644 index 0000000000000000000000000000000000000000..61658ce6f10164478ce293c05f1f0485a8fa1fc4 GIT binary patch literal 743 zcmV?P)0erzw)>{zXkhd zCViG2qouyIq;`tF{_e3*U(2`+Ovl!Y>7`>9!1cI4q4LP9T)`xnSL2dcM0_glBh$(C zJo)V>#zKCNSVCWV0L|~K5!`lrBscPavk)VwX7#rD4B4|eoh`|p<(WZxNwZVjXv8ns zuB86?K6fQI3TE}@*Wxfmw_M?$x9RK|3!I2Ir=W?)F-X;3M}Gt~3mx`->6pM=`)?YBin;;*T6(J=Db+^A#kEl|A)6WC6twgiXViw1(E|vrNhq=Enl)5O zdw^b;!)Q&OXM{b3kS+?3dfUE;;ji9Q=2XQ84sK7--_YoI2bsDJ6(e2C{=Yvbq&+a& z#)czpUIC!JFCrbu?dE34fFx>cEmy-A320qNH3gy!%Axr^EcGOBcm&N{{EtK0XtsxN zhLcnqm?quL)e(Y?#||x0xp3+blty9>aLswdf{Kx@NFS9*01ITx1k+k z#qTE-4^Em#mL?s|f0*EjVbbI7)ZjLM@c9L+^n-dgMWqNq5dlSMfW zNC{19DAGhg@Gixmw2M1CyR&!iez|k+xBKDDGw=K5o%4I<38mi+>%=K$#$Ds8!vcClYJ=>250ez{$K&dCcK`w>u{LO=%?hU`d1f1K8iPqO^|9ul5wM2GVc3(zpn|k4CNY9}6C75} zr}XtHdAo9BDB|NWk2tKP7#`A%Q!ffWi;s97^RRnwF66n_Xe0S!-(l^T)^gbvwx*w& zK*Nw`q+q3lVJL>5IrSl;v#n!pQAQ`6PQ(|m(9~QJymcT90lQ%u8fS$F)NcSJaG0J3 z5X`d)vV74;%&YKBCkW;Ngy5fa&Xfkj4s?R!;RQg)0D{40h}nQ#O5oh%=DGmRO9N-| zdmo1Z2D_UX0s)RGf*g?CBp|@%9-{|5)j?VRg@^h8B@5U+Oxsk!xHOP8w(~FoRds+s zWTCGHGz>u2Dkf4AP=)~KE@9z7@E{Yg8*JKX{BpK}Wf^*$RA#jXUPM(t+>u7wkJ`>o z=8Ocbh{a)L-hW1Hhbr*x;cQtmZUEoeJZ9_)K(z((@91?rn0MM>VrfEy!J&wA=Fik&S*{ zB7S0GX>oDfqz&%q(rp)dh;F$|usgW^Elgvdyz}AByhynG#c)H)-489j+h+NE{f}uM zxK4dcFx;=BKicOX7HTtg#iO9?3s$Ut@p@U0w&e4LV&RV^+eL?tuFTI$?NMmWDuJqN zT9A+=>7t8n6kkonSy29jc`^W-4L;59C1@xxo)L5X0Y_i74-9if0mj4lu^#}J^h9Kk z-8I^sGyv%3hC{1#dAFOnr3h4f%_pat>Gz$LAHYT0THq{jx+@sIo6eGD_u&#zeO3HW zXV`lkenoE;lT3^4YbH%!=I<^vIn5G{;k1;xT{LVif|D^2*M}(Kcp9$E$X&r^ zBTCjd5rKCx>{ddiNlHd?)(?>awnqG$nm13VMmrhQC#iP<`TP4(jfQe5;nh}}?-^a^w~<-FyAQcvc|1T93TEa4M3wL;r>ERi+Gp3%H!oHA0!8EXIwB1o%W0PfgOQ z&{90GY7rMoE;4;3R)6YS8@H>xTr|o^N_dntfepqI5`$<{5n+u*$cy6>PZ+;^fgEBT zG8npHExaOCoULedS~&UL0?EnVGD2|BE7_FiIO4gq>Mo|-@@ zK`+MAsN3O6ZDKF`Chp#WHe?*|H^ga{6z8cT6igKCYOJ?XJhZ77GW>R*_*>8}OBAMW zg*}{M{~|dr$y=akhL>}9@+wJ7PeYX&m0Fb=t~DuFtQTSnn)Dm&_rjTUJ59u$#0}92 z#FN-%n+cogLb^gub4|6K3YikGeBQhUy@0nj3O6!x-dw`unE4dW1T`&x=L>}$AP>C1 z7w#A`pr~pXM5ss%L~f0CB|jexepn~z7c0cYRvkpXOR7uy+=C?ipvLnNgP#qUA6@Nm zS`b=5W6g)73nb~mnGbSSXjz%|~8bWpX=N7*`DtT8CZmWz%yls6QfD#TkPTa@OEqFbwe z!M(#3*YQ*>jZ={-aNf937qlxEx~{#VbtAbcIkZ0X=L1b@#^?#AQho>iuv@Qgva4NC zo5>|sMR7aD&nVk;&t*7SalOuCj#HgCst zSJR@2|Bm0qx!|E4Y<5j{%X$&1azlCJ>PGa`(_Y1=k~#JYw+33f5Ff0T2DRy*rpkKF zmW5d&EW^>Y%fc`>Sdv}&SXEtqKndC93zybct(#95v=%f}X5?q=FZZet>bmNBEL(kY zE=SHH?g<}VISM`+1cew;2$~``TsPeD#NKZ3UBS2U+G-^CuhkRlx{q@4x*WO*_sj1u zHJ1x|c70AP7bGud5R-^knIg}JeHtC0cKPTM*BZtk9vK~J7o{EV8-qGMD3`7jFgS&{ zHLLesFHLVI8!cz4S}AR!1l1~$xu!9xQm1zk zz7;)>ou^+2;mUw@UGxpgBerZu7IGHLuu7?=>6pb>oJ;wKE(^4X^O5K#TYzXhT~G^u z3t9*^s5}@mj&OpWvDh?%ng>7roYbfkB+{;sFSUe!AYPoM+eyncv-dXHF^uG^(ogf)o;n|p;{YVN+@Tnq79qqn77iVR(w8e6|;iGtbB z*1CL;!t!cy#6GNGCvl~7+#8pe3S8oi_UV3`IhFFNxU>y_rQc)7W98$FbdDoaT1ooH zbfz1O6O*qPXD_^3-}$Off~EIKkQyRz2>kQ68m}AO3*Qm@)U}Z>klV=bNac;8=~|bu z-5Y}&ydjNW6+e%V92?08TJPSFY$3MhBOW8}d&YY;WbKOBl9k=GJ@1R<7T$jAofJb9 z2h_q$xH0_u5&j`fq;C^&Y#{KV!s4PGb%IM{`{n4Uf5SJXmN#1J4-&ps5W`$ zQApVw_3%%3_|g2ZYw)biEQ4&DtUX6p$9l_Nt-;aNnc#gx(of7!6gBLFOtz5ku1>Dp zA5KPZ_CLa=Vnf4ZzD+rkp5a24-H5Z-n0>y~v-r;q=^w={t2e3>oi<Svz*gmH^mQ#Jq;59;v40SmW`LUb=Gw!5Yy2k+Kz`)<6oxkT_XhKZVgTulBpsi z`VW(K5||Mu6EYKeq8Ovra?WX~s?KZQJXqN;MD${{>Yu`;lnsofXDd1*gZ4N-NC;*rU0KOd^a|M9gvH+|)1E7`x0GH3> z%k2gLP^ud1=^_IsKaa{mfGiE6N^XHoP1Gs(M1>x_vg4jTHEb96)jQn*i+IJXb( P9go0R-$Jhf?tK5Bgo^WU literal 0 HcmV?d00001 diff --git a/admin/lang/en/images/button.png b/admin/lang/en/images/button.png new file mode 100644 index 0000000000000000000000000000000000000000..098874cb1fa85852d77ba9acbb5850c91c341fb7 GIT binary patch literal 4929 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 literal 0 HcmV?d00001 diff --git a/admin/lang/en/images/deletedisable.png b/admin/lang/en/images/deletedisable.png new file mode 100644 index 0000000000000000000000000000000000000000..c8ee75094f59f0c1262806fd294d361f30f64f58 GIT binary patch literal 649 zcmV;40(Sk0P)!u-Pc3GOd!YPO+bG=gGoA_gW7h+<&i6W@>CzIUsorkT}tXKy|I-GoR_nf%RY$+yzqrWn_y0c| zycG_I116IRG@DK0sZ-E55u|Ou1fok>7zp9LsHJgReXhe;7C4$VS;)mE^wOWxM5!>w+j7B4b z!(p<+cswRyO2rY#*XuP527_xko|w>=_a0qmu_(~#bP__L5ZG)saJ${)TYOfjR7kAi zYvg9L`EQ38LQ-=rdwc{0EpJ`Z=~U9|_2kw4eh&tN0eJ55 jcWg?)n1^9d$t00000NkvXXu0mjfULPWN literal 0 HcmV?d00001 diff --git a/admin/lang/en/images/deleteenable.png b/admin/lang/en/images/deleteenable.png new file mode 100644 index 0000000000000000000000000000000000000000..26acc883567c5d7fde8de3ba052d7754a5b1c539 GIT binary patch literal 664 zcmV;J0%!e+P) zJ}!=tZjJ?ki12W-3|O&pC4EB{9c;M#7_X)PUD<(42H3!V1v!S-_ii(+t1p9ue9trn zesM_##s`mZ8s<~+N)SjHBMIGuVi<72qU|h{RzhNf!Ilm&;vCEL?;pdNbt@R&KYt45 zA6q{rB$~o2ZrM(P7rb^C?r=?wdnf%`7?uxsw$W*ub{wi z8yI4Og8U4kVq!pt^D~@hM6IMid_(MM7L+FcBNbhpXi@ziOKETxO&=@<{ohPrAzMK0p9-Z-adSWa5$fj zpSPRGO;-SdCNNeggw+bG`rh;o%s3wX(Ae9Og@Vr#mV{}zr3XP{vV^TbJ}GeMb#|Humn4CM$lawO zfX3`+heCk;Lw*)Wek$N&a*fvk?y8`o|8k-(KuQBEKy^L96Bwv# z00j+@wup}r1EitAp-Vs@2t;QCX1y&NwJ#T{7?#CPlgh49!wD+uM%YtG`jXq&Nb!mi z4B0L)D>|NW%+Zo+4bJ9}jgY7Rxcv@*{8X0Hzui6xBG6S42#U#Ay6cjwZ^%y0J2}lC zFZP%FXaO)A5I%4$0j=dktCFF;j-Lo^kh))^&i{EY$*qQ7s}AI^OxSGu{K!VP;684A zd~so6%%~k^@7QA#c8qGhj<-3w`7K=SaBuhH>p8&)*{c!yr28LR-|d(ba`!)=jCPt_ zO3^>8r#?C489Lu?=!8RxGtXNv`X=k-+}oBdJf8r2Aof;h@Wf?qM&f`(V@3f~-_U@B zrb?Dvbtd_0EW&^cz|ZXgu+`|@@1nnL*+aGwcsd=QIF9gtTh7V2;+%+9RDMU}L zW+w#zI{6Xe)!JM;E$k9_GVYeMlP%PT4vNt*!S+@d1B}WA&F$wPRuKskjqR)E5qE%o z(BhHDTe!!j`OrzVTEC)G_o4spNRihf+7v-as@+AwlY6L$3T#g6~3C%mQYiZ9#5kYEIO$=Y|o- zBEzEmBAIKJthV*j9LuSa0>n9m6gyaD0oL-lMO+D!{LeYceNn82#)Xwn(uX+R+1&R$ zo_`8xI5(BfYnJ)mX0Uff|5N5ClAS;r+E|vT&Uln4M=m=#JBlNa{dty25ywyxM<+sB zNoFl;Ih#J)+Zrj36~Duh+C!CYlrEgkB@RWDmKBvvmr+}9TlXSTO0QXkRq0vFS0@?Tt^Z|dNqcIK!JlHm8G zEsy;Sd(`%5XU&Ih$I`?T2ofHH|m%np|L5~neUf+v% z^=Xh~wKRfcL>dCS+FJ!*Z#5ohC-I8~{A!yPywEY-F>^LL6*r*vbXe~fJ^Fhd9arWB z=e;_-I-UxX3G)jZo35H}Gio}XkO;k-f``-0E=^M#b$W@mam0iwV&K=F2sdumo zvXj7;U|+c!)-2c+*=}H)ZpGLs+ZH0N?XK49RbncIMj9&{i_aC~%+k!t^F~l@)nBmP z*wT8A>cufKVind48|H{|Vnfxxt!mpyYfcMm2>azoot!pqoUWY5jwjszr604(WtHh1 z!lMn%u(vxID^L`&pP_$DZXV0jE7tCTvC19NN3o%B{!!cUNeRZ0y;7MPQn_3mQ(esq zMghCNS7$>8cQLuOxvlFZ#OE7|8y*{RlaJrYKNicgmGgh!)&>7)u{fYf{Wx9PbEYEP z9Bv+gs#_L-Izv-!Do3m93j@pc95>lCzH0bAp4XUHQ<|2Yw!QvN318n;-)r9Hop(KE z27XuI#N{O9WB?SSg&-)Bgb3{j`!fgoA$R!SBx|Y=UBA|huWR4S$7!=@r$kmpF1A$i zyLWxQU&+6>oJB|_c+kaM3jZ|np4@TCF{v$_MkFRK#wJ!X*(V;!IUtj%5I8Ui_n*=E zu9KlNor{t&SAH&Oq#&+QCUrw?La9N%L9;{3&Gy|e5`#3nY0RxGC0?a?>*nj3!}aaB zIm{gOd?;HMwCk!*Z~>upC#IOSREkkTB}2<3-t6MTziBgwm$2Rw+F}Y6N~Q{KJp)ueWJw1C@dWJ^o`o9CfDL_LZ7N8;u&HG@g1SKF*sG{IJ$pp zV1p~P>8t$bVWNH0-jPQ4Yoay8+H}}$*!95hpmtBQDxqv;KjXmbYNeT%?|LW6AjuKA z03CJ|_hFc4P#s~JGIC)}pRV(#*T`~6_@zSbH+`boD zF-t!5(`_CU5A+5sXDdf9*DB}0-pRhf{GG+p+4~^`bY9=w!uc*h;EOGmB^tq z)K>pJOgbhkTgsGk8;4iEvBg1*h>Ql|zA>Mm$ z_jYGkr^5Y2jtIStV`>o)bG-J9uAr2g%7?+qrzO-V!(&$g}x$hTeSP4&PnT6ZdZ~cCFqQ zAEa@lrJazHWNjZh%SjSX-x;h2k2mBjiNq#M!Li+S&{0E?C!H?n(oHqC){%ZIC3G<&O|C75vEBxKv53m2t z-JcZxi@U$t{WcH(bC`m^4c?#9{E_rO1`lmZ0>H@$2|)9oRmmab$evyVz);srrwZl} F`FAsl-Jbve literal 0 HcmV?d00001 diff --git a/admin/lang/en/images/localimage.png b/admin/lang/en/images/localimage.png new file mode 100644 index 0000000000000000000000000000000000000000..12c8e6aefa8fd16287ac77bbecd7d5b58c3fc837 GIT binary patch literal 3083 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 Z1^`gxH94g;riuUn002ovPDHLkV1oEm+S&jB literal 0 HcmV?d00001 diff --git a/admin/lang/en/images/music.png b/admin/lang/en/images/music.png new file mode 100644 index 0000000000000000000000000000000000000000..2f495fe92ffecdce42b74fd57dca2687414711fb GIT binary patch literal 91561 zcmcHAV{j+Y!!P(46DJcpnb>wRv2EM7F|lpiwr$(C@r!+D{?D_uwR`W2-Mh72b^6%}DcMP3J`{D@*vL?-oaxWj>*Vi>~#|&G)|BAIb+Ly+Qda`@kiF@1B5lqg7 zLkI1IbGNps*G$a>fb)Q-M<-?F;u01jpihq;|7Cgm(_Q0RkYF-w5pVv!E}MEY`2MD-#=8{-eA32hfi*u39SEqu7UtrF4blo}`s{nxD!Rn??c&-VgvzX#nU;g1q zCoAs5T(F()kjhQX!BI+Z(-p&a-2HvX$w&9(mfKT$koH(6;=ENhL8e6n9h@2S_;lyG z*>_hHUzp8`vSY=Sa6s{A?&a_@1DQU@)08@ub5v7KyGmM&vv(8-h5c9_sJic^B%6ag z)ZEjzIO!mfsWWmtXN-)v&&ajR;#C=t`2r$QwjvJ7Lg=FfYqH(s_pY$D0q^+bP&_;% z4XBerUCkx!w%m>lAP@>AVT^&_77(EH()=lZz}b42mL-)Icr_B47=A=THk%=0w=4N! zIUma*r_@uIgYI_`bGajDH`x^3Q|AR`+4Ehf>lT~zFvMhYk3uP$j%6nJJLAF$a0QWK zw+uDMvxia;(^1!Xy{MpiKb9r0wC^>&jro>8^v6lJCHjs;N$~M~tg14KnS@OQb@Zcj zyKfx>;&o3RDcm9o1=g1=BQAh8qa? zMwIA_{Co6i*l<|900}dL%!N<}8VQ&devyI)F{}0-x|VjZ;ehiTd*%geTOZd&CVL(4 zPMkf}wU78KLg>fo*-Uq!M|ULi@VyHubmhU%;czrdgRtL-SoV1r(&oSGa}IOtEH-*f z8h$_BCk>l-nknwdkn=rku$Dx`?>uHaZ^4 zGIp^)RywnaC)meICz#{jS#mC#b#hpCI-by!k{JQ9uN=@oVBHr;@{!NTQU+yUBxA`W9yo7 z!??q9k)VzOtjDLWmP_Z=fI)$mvZ6doIca*-B4r9H0W(d1rFGpUWn#%NKJ^b$!*7ts zU`&(QUSyM@T7h&_PcUQw0>V0zf%v7#XvgU;Hpcy7V&Z(thWaZzmzAl=lc<}__pA{f zq&mkId(PKJQ(PH{>yoalfw1FdPiftSjuuaLhN(ImSgR49Q|7F&b6&lv&#Po62IZx# z^=qyKjj=0hwdunAtuo~(g{u9h%1^=7$~tIKhtr&mD<>JUDB2J6<##%=@%M4Lx+GBv zK}>SGB*7t<7FSojR~EG|*ks#2fT3|=B^9pPyA)T8{ zOC9J6eQc=Y5wV0~TL{Ptmj71PGtSFD4HX2`kG!@(h+Ri_nNM zP%1d~Ok*oVsyrE7_mYr$)i6b0-LsJZCRmjt*c-!h2SVBt{K7O!Krlw3(TJc4D?|Z* z9W%GF0#-tUmyP~WgOk3-fqnyM4he38xA#qeh!v+iCW)-kCuFi$arKKG$lQ34zRFJQ zN=)c6Fs|avn#1MM;%B;Xut`#$y7BH=5isb?tVnI)A0k&h=%+HyX}=Rx zS(Y4v*Q}Z|sj?XU7mNGg83eTbRJ=+Sc$Ek$t*kVxHM7RNhSbAN-kOHOGwf#*Y9TExzCtj^JltwtA1-3y$3foJ(Cq{^Q8C@rA*= zGSvd7$XB!mfvWgyjR`Q1!7uDhI&n-qp#xK)Jylw!ms&Wt*7}HKykQzOE;$)~ekL%D zY}Yv2gE(NZy;TLdKVnz~4`LPv2(H+v)|*Z1xbs?JnH^$Ptu9=YX--ouM06un9|^^XCb z04}1XA($iX=eYbaAqEdpZlP+bX%t<+i${i3%%dlE4l54m1TB|XLz9FJ$87%*K7Cv1 z@Vf$5KBJ;y>T&7#$3$@Z%lv%-wjS`j)>Bd6J>(YN40SH!LVPx=$u_xs<(rT_6#Nr3 z6d}hw+bGtT$(()wagAe!3_g<2eJZwWE1s8Z(sP!!J)~tY9z}`F^yZ zSTG{k6?Kg8&Se3m)K!P(ACeq2vH>Vrq7_a{ zVlpy@EVt{PWNNQ7@AnHP0O#edCtfRhKmeS}lm5bG5^lW?wZmol#ykKPh0`c?9F}LV zv&y^)i=*py3WC%NqwAVP)RhN8@l)SzQUr%yI18YDi6)s4wjXE%k)lO&3(Uq(!fW7G zRG&LzLo*u^2%$AwX1JC%N)oCp-!P4=B}%Z%-WT6&?a#BEOZ67$rC+sqGl74>0zsO3 ziAWRScA&I_HaU#Sbez6p-wGY1&?e}qbcVrNp|gpRge^u6Fz?mFqECe|RVYDAa)a%u zKQE*c%bHJOq^6QsZ!2g-V>&HurQ{Ofj}g@NVo*jFAi-0)EhQompu!WFagXgNMK1s4 zsM;`mhxQ&renkIgv9>kZqxdm$ILG%WdPMCPiT~ zU%|a6>kI`2R}3|vo|t;tGmKg?eB#(fC3oEYdo8g+m1yg{2$=lWRz461Zt5B-(61g! zWo7<$%tW&o-NQoiJQm25oK8w$qnVp`PjQt$W|0S|F=m|8Ee)XQhMPaQ2j0>^9oAJZ>YqV>bi?h~X&}mHV+o8q7PH5i>KOBa}f+vURz?3OXqrJGS^`b!XBk+Ltls^br>W zgF3|0pNJbXbnnlvt{DRB#gw?`Q00gN<;(CY;!slxm_&fcQKiB5I@p;w#_Ah1;BeUE za2TYyk1`nrJ;D){-b1@tz*(ptw@jJ_9FI^{&P)NEYXzsdup;f< zt1%YNPU<(lhfHjExo6OnoH6CuYXq5+QCVpSNQuq{&Y&@MozbH@TU$$23+r<*gDRQ} zyw^__k-+O2tdWOsmiihX`*SUb{7i4Q`z}1o!g5u!*fcClDlvNs^qo)5C;vb#yQIMz zr1}#|qfQb6i3`v`WZlbvTYzMqO|azkZxSyvA+EsoN-9%6Bns=$S&i05$7kBQRV1z$i6%*Z&XV2v)(cr@;@<%UJHA$7)MX7#;M2Q+_tdoaEt2eu4S zc3p*aq=cwcQ1zU8VV6gvM-g+vsKQ`^!g$BuEcf~bqla>s+>S=Ki%5+^u$i@=?dwNQ zxa5zdUr$S8$^pg>m|LoQ$ya><6y*L&?BkgM8mb~Xfkd-BR<56jn9da9@rQ|RS27n) z^G|$+y@adO5@vXBr0}@@mMQU>IY_bZb(ZXr)-Jf#tdSd)-&b%BVC!9I*7Fy2&YG1R zy~Eb;1?Ol z^TXFo_=Z?t!MODNaew+x5w0rRYVCso4~P0RoW77E47Ps;I=_OMF#@Lt0nN}erV+@D zrg5XyiW4(=WPJYI$P9B}sfx9NACuXt0ahlKs^G)n4{IEZ)na0#voAc^z(D2+&Kz%TR_Pj{}WhDNbDX3CyYu@)Fo^aU%RpPrhx8RWAQA7VY z&)c5+q>>-`pqeUsIt6t%c5g@iMyRfQQ)W}C;7NjwjIL4JnXwf*o)1EmMZYC9C@I`v zddM|dTuhHFa$PEp#)qDaSL33Fi^@X_FiHCYS5@iM7B&13GLTokOHe>fZhuFwgsafP z_HYXM9bkcCqEUOhn(k6jTrS8{1TN{CNy0z+oC~GKmcTKP&Y;Zk(7cZZ!Mtbs_RsZn*j~L|+AKClz*dxr=x``SyB! zRZNqa*zmNOSxi52S1PSmt&+{#hrJ&Cv?+pFWBvScS!CoWtwaBv;jZH3FV&4`2Z>|n zc$neW&a0jDW*cs6j3T~OG{1^i@Hx$}+Y#HqRproUG-r3o!smx( z*Mwu9;mYHcCrj-OJWrmjrum)sR}P~*Wn*)t*{wXPb{pJ|wVMBq-CAh2gnW=Os#?K( ziIAqsZViOxZ3;H~#rOkfQa1q0P||0(hQdN`LU||o`AjDs^TW={+w=t=j_r}EB-91ipZ z&3?)uF?)B6S73!xAn~+<{O9u(&6W8aZX$7ecqxxJPfG2^ZjA~sjr{sx#Gd2C3f?kQ zgwrcb?4aB$8upRb&cv+d1A=ZaMjpQcSKggr+;P@m^o-_yutxWhedX}DXSJK>_<_bY z;2RWKHt*XyzCYD!m?32tFY^G(DTPP$foXQ^gn2(kKP_kNN&j8jg{}ev>A9QlYb@sj zyWj{mvJ=b1NSKbjZTGOvv0mNIp>GVFjLdBe4JTrUK$G5~Z`9G$C`}VagchSs&xnus z8Hj|NH@eP04n`!KjX34M>JOnrz6dUf@2|=j74&EF>Db$MPu(3Gb?lt_=Dg4>Pj;w9=}z?;G}E9o{g>L3Kt4$ENd(k_5*_xB5V9un#=$Zc4J# z=o^*n9Tg_g>KnCXC+2%0Mk)70$|4A)+2YF~!dO-bu z<=?LVYdbeFG54PY7yZ`=n+_EFKZ$PjuaQ+J?0@A4YlA&ZwBOrxLe6s{|M2jFX&&zn zt0pxUJfNJVpD4V<>^hHHs~qZ<##z{6_74_%H|oyQU)F02^d(jX5?Z@EtTH2%(5lGC zLZFD`G{0A9;e2mT?_0im2aS%~e<$O!8{-e2twfqb`znf=6|Z-m_IX za;bb4PKJzjVM^Wwe# z2r0UI<0;xLwbCB#3o6=G3Hyu61G<`}^!Sz@#JDzGIj= zuWHT6ZE2%GaP)ra!G$PNrWU!v8oxd5KB1!Xku~#@mqtFSKCzDu zc3zJbd_!0#MOtP9Jb}pY}$sn^xyE9IKEjP~?yOazh?;@}{ zNxM-lxntbnJSev5U9v~IB$f|Q_q=>WyU43_9=lL2vn*%l{AtcYAJ%_a>L>8=Ue>5w2loVoDw!JX#%P86W5dIXDCt&SJOFAv3~N@rq+%Tq0lYpB~HpJSE%V z;&t<|C1&z;?p!72^URwu==TV*Lc4coZXH%2XHz-)y7xN_)Imz1ao7=9h3PzT0Q0Qs zTjC?bYdO=R=JXh3r&*Q(e|GP$(zdH{-Q|?bQ?nOZ-v4!!R{h>A>zjV; zQ`GrpZ}mlYc3$FH)bsYjG^FhfP(Q4A#^-Z;WHYSZZa}G1&tV5U>cCU%?=V)2q zJg<*~nRj2TG*iu>yP6TLA|r=R?Lmy&3qz zzg%`b&gU)Wa+pGIHLq4DvA}EEnJ<{^SC3oH)`Cdw3`dp(dLhN;ZzFKQn z@(4!5F|e5hPyT{iIeRJHBb`D_A{PuF%{P*$trl^CFWN;se-fbg_5Fyl?e_dY2>s|c zDdWrShHeb{cEd3*parJnr+U=C+|Ci?l8Xj;-H|L^U@Gj{AM?yAbjOkB&vwo{ljNSJ z^?lXt7+<&xifXnT7X;5q0jzOEHe&TufPMn%Paw|&Ik)c^3fmDMzQ>ul7y@0S?%{~* ze?zDz1t|r1J+}<+sGYKRKyT1zHbmEH#(5s&>RSHd*z3#IJ|;P}P2&E;ICjr!JwwEl zFq|oPS&kHuT&iOx<$yoHxoMC)>L~3P|C;i>{(dH4>=RMQ6@~WUkU|w;5x>}j*J0~5 zG)ujl-hZO%rajA`tjc$<##8$s)vQ#o&J)5&PyMVwoLm$5i~78tb~X8HxA<`m z+`t#q<0utHykot5gRq}F5>-D~;p7-qlAK#WH(va`h1&8oE(h@Be-U8=q>BRy|+Xx`FR$S&V}=Lyl!sx4!LYu!p4mL}c->z?7Tx8>?V3DDvoT z2mj;oU^pU2H1a5exxTjhGA%@`{q9!(FuTT$YK5JSbHZI%|9JtNs&Ht*#}%3jrzfKN zRO5lisn6r+-d7{q3qdTsbLCc$pW+ny{dHG}%P&=dQ{T4ywYl<3+t z{8<0)FrKFW!o9E0^ia<|$9Pvy{p1G(Eyl}~;jV=RgwCLLkv!}N9)Xw8_6O8(aq0dY z-9*BO9r?*by%1{-YU!&5<=R$0CH?WxHVszi{HrNLwE*AXYri~VG<;kZeW9sfC1Ogq z%qmO`%KA@0m+;%T9S3P}Z(OsFNLh>-M5%yEornV6!leZb!6V@m%p!=w$T#k~3j-6F zdG)vSVh}>9{|QTvic89^<%^AjxgO19FgnZ)V)CJUmi}_Cgo>vWamGXJOc`fb>$b2FQT^!P&DCBcd_y8SNyd8ru;sinT}Gsh*nPEky9oEe zP*mQ$f8|-FrEXv)Z((_zV9->sx?NJp2lm_b>B?)-<5y$8{WPG=Pl-|~O)2jO$%iJX zraIA$8KJXiUWIm`P&M+?Dwzt;uj?dK=O5aD6v(0@nx7>wk+pJyYMtyhSEW;Hoy1}ocd)x;D2{kEbjSVXUkl>>U*m@ zx43Pz;Puxjz0||0&hFUY%1}=0u@muJ;Wy6sAi5spdUBfIJk(uG$slCdgjDBhlG$-} ztRB%;_Xjw=f3OkcwmsT}u%PK!b!`{wKBBRp;h4Z`Hrs_rbC;g`%y+r6Q|MdP<#<+} z?SExlSzGbe*<}DXVqco#BRq#K5&Y)T7H~l4YB6`VQy*C$DIQ9X79M4*!rinkFy9-x zdtkqFRwQ$dvno=x!bZ^Iu+H3Ou{G zXgW!?bhJe%-4>|&GJwS|ZeHOctGIRyU~OKqnX?nO!Ip}_!;~vAo}=m*Dd%A`Kyh*}eE$eH1Z+Y^0JWd5~oFV?= zLaW*^pRca6Ms{lm5cCB_Sm=zHVB>W2TKROsuD(-jj=Kn+&I34Vy$$%fWJ6Bp7IO-I z=g#o2EMkFf&0-#lv<=hK4Fok_7{I(J2$U_}0V7B8SiD(dF<*6YK8E7<=0Az>R4pvL}Sg0LaXd3=*U8I zenp88tL%`*cCLc3Wbfi{R(HssK4Txa8|8Y66s-6IYNr~$`vDg%T>yIpy3AN5uRM?C+5j%m zv6k;>(|rA=V%^+4OJ(gHPPX1Ks&%c-Y_Mfh0bO#{$Bx^Y^W>5`XZ4o8&2w8R?O2Ho zx)H~}4dKk%S8AOHDG$o054za-e_FOTx42;g#Ul2HP3uGO4k|`G)ogB?^sG^hgVpJj z8ona9dI$jCQ2z=X-5!N@n|j9T;xgN1dpV2BQVF*{N@UvHcj;R&r$41_ zk>2qEH2KHuVHARG9Za!6I$O~2uUPj=VK;B+(TWz#L~pmOio2}dsWnJX&)Gz*HZ_&# zyJ~oH;uSZU$}KFv?I=8zTNrd4e&3GG}Fl9_EJ|)Qu_L|On*W|yR4h2t>n>&1s|xu5q!|? zsj4*vp2P}5Oco*6V2ss>5-dZwf|XlWh9IHI!A|v{!A(`=NVQJSOUnZ5U|{W z*nRO3;hTR*R!h#=L9LRd!cFMQgacHe$}bVr}{$1RkKPWyXoD{IL}b#awbSHX%n4Gk3>F^%WM*O z(JGhjgFB)J8an+g(C_4_k#{6U$;_pYcn=O7q9lDIGLF_#%m#U)fU^PU0>r_v2MbzI zMHRZ4zDGm1EJL@PB@n8SZjBBC|4Gb-q>``$#Tt<_jC&fBAPo|prex@c&`-8j-FQas z(BYZT{u(WlTYcA5Aqv;7!#u}2=##-YECP=LuZ=> z3bKJILJ(Q=AL(l|PiV4G#P~ARs1xBW6TT+nqhYG;^2Ek>*mT21E-CIvh>A@ z>k=|W(n)m;n9I|@9d3(1o^b&@a z0y6otB7^!%ssy2amn)eXeF*O42Ys8`E|Q0jlE)-K%2>E$M=ci>2Dd#|eWaBwP8qqb z+$M*iKU}KcJ)F$`;73Tcu;CLlFmZMcTNcNzCDfpy52RZ?QcUI#Eq_dR;*(5AZW%Tr zdkOSWI?FBp;m3%L1LT0R!T)$PY;j-OVwo@r-at(y=NXJbiBl2mM0mW*HF?z#EGK34 zc(nZNfgHN7R8pW^SO_Y2xmeh2c*v|H-XU#yAm!NRk`}_ZSq?W}m zX6f)4orMq4*|2`H8on%k?xkLC+9Ccu_sx&mRE5bxRrmg!b3{ZeDWu>Aa)vqIC@Pt# znG*-q+)3|0^%SNxLhVbEpmJjE!oUuk^bOKLVm`{{<^E1gwPEC22aaETAK_zJWu`!T>59 zQRDY$FU07UEWfcIPyvhmn?dP#bbcOhz$tjkfn^cLroc;#)AR!%a3&UYnJqMTnryd>rPMfWhcO2( zxrFh6Kf`2tO_Stw%{Powb-cn6(`0>3C~(GbELMOiWbPWD*7p9$x;e9WCUDpsH9M=a z)*PAvmmh^!bMm2hKxwh5>8yGZiaNwZk5bx9H@U5G5Lk*D`$!J*QC3R8&U8IgU;*tq zhq+7f0A4c6le!7;b1M5*7EAGGP!Ca3*HC~P31S^dMIlmAyaKL5qfGf3*%;I!eW;+L zi_remp%`VDgFa{3eH+e4fALtkVK(mwoi;-&Oub9zu97ApPG z4iiJ2wZ?D!?S+(trac|#7G{ODEE)w^+^41pt*w=uaq|>;jx{Qy3GeQsl1I$*N<~uF zR;qx2Im{H>j-;KB2e7#?LkqbJIT$g~L>RQ7r@y3}@_%TLQJ#hK2C+NdO?1rR+a2z~ za_2)xPI^yNn^DmGX*!m=U=&0=p$_FUh-5T#U1#opPvRR><3?04g0{Alu!LO{#2k<1 zA1g5pyfhgSMwlRId^;J}rzkp$%wX65bYYRQ;GDad@v@;xrV5ulX6&RJq&bWy;hVT0 z{CaOUA#oOgNTN|X1rIJHqAd~si^JHaV}Ub^dJD8`{fj)>Ih1c6h?uoZ@{8p!K?9t{ zO||_^7B1#!JlJEzVp=d71$~wHV^2t!#aM^d2xh-|lYQdZXZH zLhfW-{-JxBd90crr2P6o)p`b6DKq7ZPQFJpK>Z*+-Sj)Hc9>&1GY4Vqq9CH?-N~pX zxqDqXM9JwJH2t|hLDQut4I~C-+Wz0xoHkn?H0uC$#fiQS;p;L0L&Veb?T{5gVG;3}rg?~B9u?N863QGR zR$~{(YDW81#3p#*wiG?GjggpgjFK`nXpFu;PFRgfM?M%gaQzZ@@Op;Dk)2aLM%Ipm zvQ>(>g-N~b9n|$lpxJHV=$&EW9@=^`kd-#jC0MPCE2|UW@2@-)^H8%PtCk|`2al4A za=OYQn=w2di&x?+;F=yfIm;sJdHDFww0v?=INUI@+RTh!dzFm$VhrY!_D9#7)K6L> z{A6yqLQ8YVGHX>5llOn0lrOXR{&z_k$WwVt3I+{NbHQdw$+@(oQSU6e;TO~^-cR5Q z6Gl@treeyFeuTN061F2ortLV&5H6KW_9R2HXu{kdA1UeFDXs64{W;PeJUcL9d{bf| z<*CNjh@BP#9rb&q7Ae0X_N!<%-qa$3jV>dDpUA1_BF_53C69_{@F5`%yq^3-sHm*7 z#z#XhiO6vHAb5wQ9Gb4kON?~L+VnDQ#o6BxqigYi5wE4*8Ntvk5g`Xg|19+-vAE9& zHO{;WN#?I%E7?mm2`F*3inD?C=`>iyRb#n~qCEYjwpwXa(^cfQbbFi#g#V@1oaHZeMEamlrOv=AQ(JTWb zGC@GLQcw)WZmW|5wOQIk%Z6tZT)+Jv_eBWa?l7E_Ng`TSdGC>@e}Z}7lk~V}8Hvjc z6CIp5%}j>XkKlv7y0I#ru{g_>4+(?E1s}qWs3VI!yLpXYHP|6LWo))F%e$u^WE$$Y z7i@86z37N|W;rCroGK^IjGma28;&bU<8QN*CgRNp0PsP0W6(eR*MC&eEKHawd(d31 z>B@C5c1@?zrDoZ<=UkI;$Y&3BSAMnITFNUrPu62@^P-*w)vW;kL5h~~P=Viak)bPu z++iw~T`8flG3MxLG{G=!&5zX;jQDpg51*O6?~>ymam)m4lgb^Y|*azqTKfK zbQS*#JYx6|ru`}Rr~hZq-iAX6rKs%70R#dC6~WVdVV9b<@9!GH8shH!4~X5H&=n-f z8dw|o&Y{bn(SdW5E11~f#QJT*AMsvbBhPU$c1h88gX)y!-`!nIouRK1wI|3f*dI%j zxg-)9ZVX;Fuj>O?`f;?r!0{NAI|c=rH=b$RCq99)YjJOz1Z7#XFLh$~G6o|jH1>it zI{+T92Z!9QBFSw{dWZiYSLCnWPL6tc zmWL~?I-bHr)3SSP<5Z#JX#ewDXpTs{twgO!0IC(YFDotTf5Gj)+T6gA5eAiiM0{^@ z_;(FX+%pu3lhVoHMc^GD8nre2tFdDfy<`70_AfI3FEsZ5M!9wm z00*bPr2DTM{~8TX^bY?g|2pws$|a_QA^uPHOhs<`6X$lnAD-|S$1(sO)JtPPG-;Bv zAbU+&h5~1xqE&g&U1XLu)K4H3sJpOMJyo(Ad^Mk#Cn+*gkn2k^PyxEqSY#3DB$TVxu><54;Jrpis0sUKJ#Y9ei_?6&|Lh-(dAJNML(PD8fs zx)cpcow^jZ?@N!AM;EPTHT9*+y9+jL)-5i{AJw|sw}7dt-0OV{0_p~%0x zg&vt15XWL}^*0Acdpg;o^$xLt)2bGfYoE7pUJYuMceKYBoFk5mv$jbTz(oQuz#7pw z)Iws;?-*$ZtZyv>qm{zOaKm@x3^ylXHIm(oSUbjCAqtOzTIU$>tC-O9op*NLH#|3{ zeQ2vX&}Q2sCTNpdvs_2}3-IOs#6WMHtaMhc6)Au%psp3gR)5aI8UxRtt;1nWi84!o zv=?vo$%-AASWd~6{W-LHiTK)0{SZsA>Y2rwB+Z*yCo)1hV=j}vvk#U6SG7W*h&@D zEO3Tc)O{`#7WE0f;dFb9UB(k*ldjx%g?LtscSGYBTEk2u)^7pc5LUX5*sv5n{{}oy zd%ow+q!{BHo|Yw6Ki4?hki$L(gc=Anb6{PB72;t^br+)xEMsyJqpqXN8Lw3j-pa5JHia5Sg zoVP$4>C6xChlN7mw=@=*LvW&RUfWPzAxny(Bb_|MKI&{CdLkQtm&esaz?f$Bi-REf zf;@H1L-q+njkNVy8{Ttyt<;If zVuV4B<~W-6#0a9J!SNlcIb=2@=8IRO*P(e^x06OUpzB~kmmL55<^C&2M59i*R!3^N zfd%Rb&==(AmfOTmvwBdnNT8KWUeiAX?{QTjXb`);xT8*WitB0^=>tNV}&F*wfJNNW7_S*exZmh03+j))te)W*yRKx!g)2b{wz@0R`o4zY7FdotprDnWk2P}jB7`MmQ*=(#_d z>3Oe!;s4OKjgHyl`OJbegj?nqWG!ZMCEPzY25{1PU#xuZ=Fo!epx$9OZ|8jlTZT3e zRnalbr}TW(Xdj*Zo#EA8W+mXOBOmD^<`{614K_W}p~7>suEzOL^Ks-G?Hjx*>b9y& z)^Q;!qPAlQn1Ns}cpI-!dIfs(4Z&dkQtU>=tcgn$0`qlwP5#ZRT;FQ^yHKjRf6u-` z{9rOKvr2^Ni6p&k1WWE=x4d!acier0WBkoOVKtBRI$=Whji|?2uo_b`?00-%858{Q zxa_`jdv5Rh>1r>*a>!)jr2t2k2Vq+RLnK#t+|hGKs>Vl>&S?a7whxil2Sb7X?9T zOJKt#|t;NN>&wg;Dn#Gu%S+W2Xb7Ji2!()m+*SUOS!=3De&{JYMEA4({nD z2FT%uxFc(1>jf3pYZlD39!vAQ#~u+&Pr`1hjC-W#ON7rv{z|HUOv9*IkXMhPim#h~J?30}(ByAnt(*F>!{9{M%Y~*rOgb6f zB5?Hu^_6ZYb#JkTgb;4prd>*eSGLY~kKYZ=isoH>S$vrdUX%n$KaLQn5=94ljO&v~ z0MTgixUkw+M86!8YVj4d89bWvyEP6iI)3J4A};K+g_?WveRkDEwcvgKGKF*b$XahO z3X{J{{csLBUShyzDCP;IhCFOjF*7Rb6p=phv4LCG%clQ7gw_9}ap+Zy3saqAr8m1A zsk1f(<(M%0qQURP>D=1&4cOu#l=wDJ z3S_@fxUF6-zn3J4G&r)`zwou-ek?tvzImrpc`|#ihm0)AgjPHot~_XX4uqXIzefpL zv92$wafP7Z`aB|#rEgp}nI-7NRBaec0khhC=h}1XllegIZY!T(M>{|N{ly99Vxqib zXrucPF}kQf#k$r1%jLpO!5(4&N!a`|;AstE-v-A?mh38v*QIOiOn>2O7S-vZmg8e} zh}P8}6|ZpPqz4#ys>+qCvhLR4;*s>Tyrr~mm)>x-K8VX|pI`Yo;ks);99lEtbJI{7 z{dvdA*6=#Q~i7K#pK!0MM8lw8S0cPb}U{8z&^C@mK&T#H%P-d6Cp z0?aLIt0mUyaP!S31u~MF&TmWW99d55-lqB66m6efwD0p9$C6l{9}yee1fg45+Nayo zHWAThE^MxI;IDHPJs6Z1dPL2xVrpAg@RoKBJ76JsKM0+I6o}!Iv|&$4g|bLvMVODg zGU7KVw_@3I6C?PmA!XP&4n1Ih3(RV^+yf16l=1o5d%L2@HtZP2lREc2gnVCeyK>N?fxB9ELakGn9g8j3Yh=0}Ak31m$zty(%+>OlK zFecq6gSo9swFIy303F8(0^Z`GeUQt0`J#(ge3B2Y86jjFvX`~D3w0s$pV|uc{Z-rO zes^v}DVN=OZbYjweCX{BaA)j92~@~a$D7`?&FbA0$mzoU>&ND?OqLBXZ0(4eD~-nH z4niN>+8yh=4(T3*btBQYM^4Mefv~75A9jYkEl^Me=ZjA`#t?6!@Tcu-Nf(q!K|9Hj z*^3PV(8V7U*3E0gcWdq40O(yiY~GAoaEqTBx)W)q#<@iG9UI<6U7y-mCz>iKZWCP_ z8^Y=5TSdilb+uJN{@A2g*{P~gB3J9L} z&Nq3zmk`ysl!Ltw)G|n&{>#UI(l*Xl`Xa4vtUSwyISkP7pwmLyUhl4%y%5N;$m3i$hCWo;G3YI)^g0n z{fUFwKKf?+eXhcm735@AVeM;{V{;0v^wq=?=5utpq;)7;xY=nYfA8`OzbeQvgtCH2 z`|r%^*1waj|4xk7mYMhwK#%zIjrbGHFl@bGSe4#9qF70iP6O&tYt(qn*EWAy@Pu*T za+0xribe^S>9-xClwjzA1cHuPs97YODwY_szUmVe_p|E(i2Id>2WYsw8seH6q3y+5 z)=k#!FIoU--(C{rh+ppiVC~C;n&_InLDc925)l=YCHSBs4+hZivbfQFcgzYyp7;L*XC`J zkZmR^yT#fCYc0-aAjLC=)-81(4NvaBdPmVBMlq|%bA`9(bghEI`s~#?ToqGR6UH$I z{Qghb;{P#tHBmg<>9nWA*4E)$87DW~^3hP7*{i&({@C|3Z$r{g8lK;T=&uvXExMF@fQV)Vg7^K29fb-++?DRsp`%h;Fy=euwG z$tfqtQ$g^vUX-P(BKtN##AA{fK?nrZ+GM+~ZPZ1ISEm^0`1$j!FtUH==6k>(g_1hu zaSl-wo{fkXEfIY7xJhI<0V6fs>beo%kSFLZbb{ALaI(2++@v&yx}ECD)-0o4k=}uU zU95`ROD?q??DCbfB}&d2Wg?M?^c-1$Ei6&2Z1sY>y1Kf-;b1Jz(NECy_U&8!^vb!R z3R%fjwl|vuU?lAs20NP?78brv)s@^3Usm7NgASy5urwXwc0>IoftT^i1a@e+UWlN{d;GobB5N``+VgJ)R$-P zLkJ@b214R57i)p#;Dza(?I%aUNUSjqpTBv}=I{I3h0N3K*k8 zq44t)uct{I4(I1`xFb8NdMbWoWMrXc88)4lG~o^u{Q*7$*%px*b{DG)(d%P4G!IAq z*PXz>O`@-`|D!Cu-@v`e1!5Qdq0)Hw0O4J~X4R+F4-{8Q+(SgW{8mbTfnp)}Smp~;W zJMtz}Jc!+W93S65$mp%Q9*En@?dbSbr8o?m8evB94CP-EqVF2Y*?*SZBn+_s+i-%k${$zWJ$Ng0PLz*@&Uu~U zuT-?Ov>ets7E~ZFlDUZ?Hjt_c*m)CJP>K<)r$>$G-@%13iXQbZdjOo=E7O0vE98+E z^R9^m<&blP%hSm>&ELh9SJV`&jx;)769&H};xgd%BiExp6A{~H6OQ?M!1kgd>tYi^ z@os*eTp7cnqobp8dvxG$$mC&%L7iH(B*M8=%&a)j2N)OLF6R2BPm;zV z*;Uo91Y8+H;fl%<7zzPF0cjs(Z?Gm$T6o9kem+jhMQ7%8e=#$RTuRq=Nq3wuB^<^9 zXzae}0@EU$Ji=@};gws0?A@@t#4>=GBy-jf=e~j*W9T5nT$O)TB+kx3mZW>e&rxkl z1p`3)#y|~r9r#})ozq_5DVQ$sf8f>iF)!P{#OnWtg7{z2xM(0(tb)d&PoF~w6%^F; z{!2??cb@%U5%?cEt!gPxKh(H27!3fBdM>9ktk&M~*udbouz3F+M*E)Lvg!6yVS-s9 zyB=0P(T5zUjQma;o-Z;TE{Bl4y)P>E*9{N63ESt4N>=>T^apUg6H&K4$BXRQm zilyKg)PA~PLGXb(Mj$fYj$-RP5noqo@cDA#hDw5#gzRqiK!)htPziWKuhZc`e3QphpkqU;to{j{9tqvF&<7nov2+ich%Zc5Hd8gY6BDX$ z>nvR-P&&wU2^wKZ6L^_poVG6DxH%9xS+opkp)CN-Wswp`*Qk6!37!AY85wXY*3*K2p{5<4YhfE-fm3Qm$5wwXz?F^#QQ9wq=Dp7P{W1 z72$CRFvMCVXxTcK!j$h0L)c2@-{gg5u(Wm6x=&Kp$s^>U&?_U*Y~G(H|9VwsM_n0p z>EJm3Ipo>+gIAEvmA6oV$LGPVFtz!)JIo$rSq3vmu}OvFAVv08)2zc+3O8`co2^j!7L5rs0<;C$#C7fI;IV#v0r0P>&SAXyni6#fOY)4G8Pntx&4V6p|2 zd|Eqr&xDft=<@Xi_;^GY3;ZB*-Ml!v-nbQX+BB{idq(N-xWXgAcS0$;iqwqwdV3~n z6LU76mum|@wFuh^R#_|WjTuGk0`F^8JXvM!HAU)_RIHg9oOP8eLs$7nQ+(eyv)pi^ zyH4gV#Z`#7TD)Zs$VHjSq*{4QY%|sk^kPvV+^&H)n;d43UtwiKMEDT+q#YAV-SGr@ zV%PfaDa<8_az(5@Dp>9&=UbAL0p)kf&SiY`!+FxS+1RUGeXfXUZuTyiC?UF@+{_+^re!mlHbnai7x-qn(XGQA$ESJ*ju(X3|@RQA=g&p272v_OsLxvw8 zJ}u()tyB!@<}tKn^=r#NI#{K+<&(L`Kk|@x@TA(x(w^V6NL{Ic3}%Y9b6gQ-bqbWe zu&$5jI>Zq5!t0Cqu`V1)(y0os2yKYXMz^>AlStz;mQzk>{@!pF$2qDL05G zmX@OzrMO<=$eCX7MY{%>B07H&H^swb5beHNaae{gpwL8vS2TxWfmKFXBmn0#dV!*4 z;O$hVSooukZju|=at#`~I#}4oT9_Kf%NDqj zB0<;J=-G7_$*xc&dm5=pQ`nzKU~M&$C&e#IH-^JJXlB97G8-mn@11(PviZynFq3@1 zslmsbl`t!JjC9fgv^rHjuHSYyuF7tdx71dPT{Bc4C6DJo3PEzF6f!G8h6rxLsVYd) zAHJ?Ajrl_Oi1E^$1&(e=rZJnuy0r|4zoqp7avNP(h80>=me9}k$JfysWo_86rZ*aI z;IMSS)_h;y`pqcG#x0{$lYDqL@PkOoDh1fc5gz)iZahRG2cDKAii<|WJXx6{AaEsf ziG&BLisXfSXr9E7=7%70mR*EcMIPp|R4{{02MngMIUqfxJuy{akO(>~!#-Y?O^EO_ zK=)3P&l1qwCD~J?2rX6>*?Z87LZ(z`!aW_>Ge8ql!-8tkUd!-V26TFqK1s;NlqwOB z&SpZ=!|n2=q~F|30bn^I{{-Of*^!Pg`)#XAWNSQ?gP+O^?Gy^ihM)Xa5Dx052%?F1^GuEv@V9VyAe2Vp--}L(~nBUj8^Fgo(N>avRHU0z_xgMQi3Qn-+}K?dL9?rAdu|GrFU zU`tqOtztWEKhK3i7KSKKtcbVMnD{6O}cLb0& z6H6}+IxQ`V7`E}`#>ts~8m-t$u@WtoQt}-S&AP_O2Jt$+R7EiqDtxh=AWMDOK^?wT zQNqYrS$Dxd@ayoly`Me}a4Ro*C-pPB^f-`afeNxarcoe_9pQkb8BuHbn8|z)9o%{W zl&sO;-^3egehR6R+`prn1GLz#&rwP{3L42KGy4(<*m`k5JtT&-lZB0g9t?5VD2>E7 zu{B`}=;JZ04Ltr@A@uL2+bCGvD~M3nt{X3-xu;va%4FYBLDcwS*3;v`uS+%+rV#c+ zx~MNj#<4gMJ*|t%?8_mjW`A=F^oJG^;-47zt%#at++Z<%L+W*v7+9 z3Vf8E5LW@7e`=-NyU`b3Rx^(`6IXVMrM`wX%n#EWSOiyw$|N(R3{{naabScZr_{#yZi z0kjkZ+>m!>fEGlG=L;oM;o>O037L0z+*W`ey7rSC>!B-+D`&i^#TX|04I= z6e^*t!})*}@Baw}V`1%}a=C`HRxw}UA-7y$S!ukm4*E7y;vZ6J0^ZC7t^a^MJ?NX9 z%D0$1ejj}z9Of+vv|XS^7a&UIQjjgIg3Il*4Lg{%a97b!`Y^*ao{cv2YGiX8tb zKPJspn6c#z@Q-^7sQ_fj_ZQ~mQoUL~wguGw|&j-0vSLn3sTSn(S5D$*Qnx z$#1v*I}m@AqoT%{v&X^ScQ3B}wCQesZ0Y%c+%sD~>71BQLsgMJ;(Wpz@(xqYMkEyQ zE6S!q*5eSY>DI8L0k&^i^rKYOrZ%1(2R##X!!DN6*{_hW^m1JK3y0t|R2BB_e8BQd zV0Mk&h(RY3@*SrMv&iKh(G10W`T#n7*Lsc5I_(hjAqIIf>cw3~F%AikzbrHLTeoIoC&aM=jnTn9 z(Zg?DB$7q>vb7d92IecJt*E(BxA{nv7toKpAs0OxnCo>7nv-({gUH)&#T%$;7v=nD z{rQ9o_%!veq-=rj5No-{xgHqIbwQijcV1@>f$n1Tn!{%*%1lp$+3prTcrJ>2AdI~# zga=BaabC3XJLg?OVWV{T;gy)1INk13h9tc_7=?v~>s}JaMCCt}D2`&wf~GVse%HKHBlbxE_dMhc=csN6Hc>*XKYC8J$Hi>YO+f_T+X}Qs51zLiDXe8^ z!Ih=7MTH^of~7qZtHMR|p|ZLH;)9EDHJL|Dw1VJ>@s$Z6`$rRcCs(pL2N1NZd&>tM zhK$xtqd%VXBGF7Tpx1zgi@2 zc1LI7PdyR#l2nltzWW9iBCz6G2@DI;3M7}lmo4Ge>Srm%tU{dIP=f;X7L zQZ_{k08N$sMzZlsT?Pi7RU53%qM86ehr(}+H925;sR=Qfm?iRpbH8H%Z z*wJqJ^h{7vkMdw!_yha}gD%!_C{9`S(3Xl{2H&fn{{{bD0PT*Hx(N8|gk6HUnO|C? z9qQ&n$e41u$mT`b!mbD??6G7EaOEf91IzKmvqid9vuh?K$;hUQLvQ*v9k#QV#kI0r z^X9eC?8k>;Z)R`<;!#UAxsTo1Ma7bs?UVJ-EjCPU@?o$4XYHn*BMvMk-bB7}m#f1z z@mg^y&@a^>RuR$52c6m^W8RA!h}Q3{vC7tjkkTiMg0q0rU7{)hI)!P6|06p_pyLGP z;(PRM=#mL#Av??Ibx;_odshEqHHCE}Fn_tvtXA(87aF)*+-WB+$F2g${%;3K2sXVu z4E*xBAG2Csy5hfmB`&KT{{Q>2>MO}hNvB(?oVs#)=b2rGyHh?q+xq;}<WfN~B(9!1zOwL2UQ<_@+J`W}mO8j>LP0Uof&RX;@_8TtD_)wR zF%S%*Ou9JPffc`7(Wt;L8vbKKnbc&ZUyyl}4pPeo5u%KUJa<1gcwgB~>RC#j+{9Xh zl}kl5^JORCK+Ox4XI6*2VXUk2wyjw-d4R@}KV=WBN_}w6q}IyZ1pLsV5I;RZHJvzy ztx!o1t=J~GK0!V*3ME=UhARB@u``|f(+(8NokWpbm1*RJ7q;kt9&NC4zpT@>oe`}t zEqR$A-qam>UZhWZe$A5&Jq;JUZa@mJKPN}j?xH6yCr`oyoBdRP%i-hl&~k`pmuqey zq!8{aF}!|##1JeFobse0_h)`94jj~rer(!4oBbcWj5?`FW@I>gr4<5vgbDZh;;>lP zW7face7Q90VaGJ*9*8>Sdpd97)e5ohm4Kfor4I1YVjd&&1>wYIW5P=*@L0~@?jc|L zev{htG4=djS>z18Nn^r)Mn8}GOuQRL@f0bYXCXc$d!)(Qi2La#9L8Wl=3*6O{1V;% zCj(;+356M=6Dj*^^t1wqbFADYjkT|w zQ8Jz@GRzu7gkX=ql9DoDXa>}tEOEs(P#CWl4Gu^ZCVJa}eFT?u7(*p)r^q0z93QA6Hd85vz9K)b7`U`dBmK%Bh39Mx&U@S7P-QitoR++ z)0Zwo+d8!QOgcV%Nis!0sV@wlcaqE#hEI%s^_l)&SOyTzHyvv2~vA%L<*VVw#ZeLI%=#XEu?;WJ4GY8Y+E}B@Xf` zM8{Qf-KK=#TI7j*b|#-XSH(Xv{bUAUxwc~q0GEh`rGi2y9W6u7-;y$)gB0zKi0h*n z11-ub0LyKW8-p3Gf$uS)uG>#p!UlW9cC^>6uz%yrK^2xJ zeAM5J*uZ)WEq~4wuEA;1hgvm+(Gxq1+J$T2@p)3RhEVEpMb1=?u`M+Oykp|hT7I%D zhzc6wQpj#zyg{DUdNd)8EO&!CB*{-{nF7@X55xMn>Pf?&1}uQXdt>) zWlf|1Lh-Etkq`FA-l}_!Mmf2Y2<+dt7sa;5%%Ax;a(>Ku?K4|V{-Ul-hyR89@iBmI zWL_s`M3m3x*k(PZZEnIRY$EzwcmgH?y*^s*H)KwOE28coG=aui%zjwJRZe&K$zZ3J zt0JCVW;_%{cj)=sB2}_&P1!X>VKQl03Ry6KyR2EUlB}NqaSZxBT6M@8NvFE^VqAHkEGe=TH3LIr!254$A0Pno`ws zEKN5+5^1X_vqL)!6Xpg_wSIc$B{qaC=fzddMW4|Lo^T+&lq%zyj&lmd{karW7wS(t z<8~WYS(5GW5}R&%XogHL!Ba!#fp;`AGoU16QlESnU0mA5Ud%1UX3 zG5MA8c|mYu0f`1e=Y8{=J%H*5`eHr7=R0;5Bst#J&`{$HD zkWBwOL@tc}s(8PIbZHu~(WS~oC-WtRL0#9~ZL~Rsh$(ADL##cx`oIlZ;ei2* zBq&zrk2rY=hpV_27ec0gX^Q0c+THvEH1F zwGlDNMN6Sl!L)qnztk0KG^!&x%cBK5@^n}-8>|z>s)QY+CDm)_14r^#1A);~)*Ttca!(2)9#4M0BZ~c_pzh*&wDS$fH!{NmLS%VomTko zpEdGb$W%;~hs{B}%7Yy|f7144*{^}3z=jv{7MQ#PqFt<`~ z7O`Hl7U%mDhT0i{TTdsMugnEDxB~9L@LBmI*)t3!)R?(tPzjma13U|iKm4cCX^6w! z7IRD&D7hugUla&USi(P`*YY3UN96Q&QX5h}EaYDMuUGy*_QZeR84uPQH(%VIi2<*L z$p7i5nA$sdjN?cXLykWeMm96&-X&Z@7)Sec%u|hbulJ!dYeVbzqKOsV8ecU=pnssb!bAWu@0kX{Tx|U$L=j;0v%x zjE%M3S=&r5ogsgFU@lC7SKIs?dEw}Y7J0_EPJUdTy3u1yazQrk`qObXGt|&v#>)}# z^}vj?4xw|*Iq2WtNmXN9!y4V8AWx@Nzsrb@msY3X`@ICr2ROKX`$YWXjV|<-e zq-7Lg-HW_!vm~_aK!3!{0K+kls=gUDrH?$iAh*K4A02K$zeF8t&DRfGkDqx>i<*DN z>?;XPb8RR2~z)K_=T0C@k6f3A4Z8a#2r^PBn5 zz2ZB0S&P2sUbELm=b7M*1_$Fj6$fWxBrHft2 zog01DwM8E#6^<;`Ev1jx^v*|e9~PCxlC3g})uY=(qg_ZZB&SPr`Ez{dgqu-jfWn&x zV!ct)p7*Pel>YxVVExbk-_2JAg;fJK`~2N&4qM5L)|8~p8`fDos17kObl&&MIeq^z zzZ3iWgO06ptSEOqx}o4$+39`T*8QkF@t1dPTch#izb;$6_1p04k?>N>*79AOw(_^` z-jpb8XUmv269*}T8bp3#l2ldN)`1obWrb2Yv&=%_1&jA@pD%Hyk9PwmHI5x;ADdy5 zR`#q&#)=7vZXR-^cxg3~e0%@?+SgRr44dtL{lUuCUL&gz@FXJv3?W7c=7;x8_kY{Q zU)CTH2!W2>BZ+#g$9;T!3@G__MJvlLfP@R==jVGp4XN=cKm`Y1Bx12L@p6(5(66_G z<1k1hqq>p&GVAvx@<>{l4|(ca4MKoM&kxm{oFDx5^5sikjE2!)^C-3DKif4Vu)TZt zZk5#6$U-XImaV+Q@4eq6dFk!`#S7($@5%NzU3xkTn~`c?&%A~UbkYQYhRiTEVKcv4 zAE3~s)#gWz^vx6Lp4`w&!_key>Jn&Q+VFwl?}kF-f1}iMQ1z|K z9g*>G{{wFYE>q-#2#a^VfJBUN48~6}z$_}x1^tm4;pxBh<$^QcAcXldQh@>Tlf;k~1+H4+7t_dN=f;+K_mX`8G>f zIQZ(zY8nU+C7AzAnQtq_cXV4K1rzNV*&wl3884ht-g^b5#kT$?DA9LF6>1jFKEf=8 zUX_)JhaBtb9DHihwe|j>#v0ebRQVHbue7|GdPn4+D~~YMvHfMf_on93*{5&H1QXM1uMmwK^{Sw$EY+foq^$B96A1xOxCiIzMhF{lW0pgr<%8Wqk zC+uDa6*#qY3>FkwyHkJ6Qs6CVeSQ9RLCJ_l3WK9%9?5;0GJoew>q;A`dV2Eb5JjDCqEW*6neubf*pBYf`T3wagMUr1VD`}w zpBvob{3qZ@0p46OQWR364DurwG!8*)tk8^3m^&)ux zs))gWitR;sWi@xF+qlK|6vsfqQpj)H#JseZJ<2l8((tk}V(ajgun4uMj10`zP!{FU zyny>xOs>XLY&Esh9q1VBPj;Hi?(+^*^U~4O6z-LH1=K|^&;E?gNni`L@yPefH|a#Q zWa%6VL+yF*V6-vX6m}0Yo83yzajy#66nMTXVNCbSr=SgjF1hR>0?xEfCNV-qLJJ@F zFZu9<6>aOVeRql&csBan>jW4nis#+w!l)&bPenb=KQkf~e|IY(j#KtDn%Rmf1E4Cj zCdTUfsa~}1Ry>ta$*4qU;1RzQA~GF6Xyv0t|1M&ZFG!8~+o~tRwt;X?ho{Q(QFhpm zccTw%jE=ykk)}pmD-jD&sht)uhC-$A>j@Y0W2~*Lt|zs5ZTIO54Pmxpjvh%n>o19tN&1B(5p^DpNw^ z@px`04hMapw+#svZ@$XhZVmJdTq`LUAXCmQ)jb<9+ZtK2QGTw{sQY|H$qwAoaCJx% z&HZhu6oP_?hr4ntl9m<+_ZPV=$>C6%o3AgqQT!*}$M<@ADWx`SeSxJGaT7t?&7~b{ zGQ7q1xOuzk45637z(*cmDZY3)(7)B-+sW|kuwv4R)`poWnY?kS^MY(S8X5Si$A~Y- zp1dv3y%Ts8cIAYrhbOnF=dPA~N6|n0i1MpbfgKrF>Dj!*nd{gNIk6oB@nNA&PMCCn z{(oqf{}qj-7QokSUAf-*Z@(23H1_|uhC}`RzZ(BPbXwJLp7aQMwW=Ke#P?>I`}KZE zoRsXT^f4#{AKkKbZQSmC^t|guF%8E8&i;Ke1Q8H>ALXS(^}Xlst#t>_4WS>RzeQWp zQ7C?df+T?Rx=f&Wih7{tRM37hb$-C+)O`A2z9ywTwNo7j%XP5^{O^p_=+str4m{Az z1^g>jbxS4ZY?mbCvb)4epK+oorbDVqsG;5|s}$Io>rQ!(%ff0ZL)Yt0g}qu>@R)i8 z4JW*Z8PiO}O1$3J7J_g+fyFMtdAm+>YL|K*%$gJ?$30>-;UKmEytluJkJ(~tD8UhC|Gl=3o=vKY7?x$%{;(UIMUnrJ}mf6bq=4 z30nb2q+Sas+y4_!-s7gi+|qxAM_kKyoAWP^YgRfwF7J+Vl8x!7njHWK!?#dBr?v35 z5<{cFA##0P)}Eozk**dX`~hSQILc0MCN_5-@`ayK?KDby2r{mCZdv*Rc_x=Oj@h^3 zW2-j?cXPTtlr}zs4<*Wdgt$8k_;!#nub%W)m^x0dXZVN9p9vWq>JRJfwIrd{v>Wh= zxV4~(xt(RQEydj3D3}3Xymj6&B>y+C2JdLQImuuZHEE3#-<7&7#P)~AI4nz#gg~8` z9yzqkS=7tW2Mz6&r!!>PJ2N*$Y(=vU)aHUZ+c`_ zQt)J)yU+uZ-xO&82inN|x7D;!i$^|X^2l4Ya7!Hj!sq$Seo`~Y%IjIwvEI_2X^ob} zV=;v*C(A>i&UNlOVpqzTUHE*q9mAFQnIgE7KX&@*`%Cp9Lxv&l4L0C|2q zauCmmjQNWTdJs7i)2Jkj(V{v$_q!*xy3lt2WMet{uGQoFzb=-Pw)a(t>METfP4`(I ziDtX?ZDXmfjiiqwk^T^NCKgQP42IZd;^1HC33IfT1&^PQtE`l@(#$!Y-#K-y1lI(0 zOCl&ZX*-M7)_!HV`o--Uy^j#hm74W$*fy0Uc%#xD-o^K@X;F;FKRVCHva~6Vi=1ME zs29QcizlOFk%rVJiSZA2!x2aS!NJ$j8%;b8Y(R1w=&Zn%y}oS zg#h|xufe_)U~8zM%0%$9lBB|Zxk5dkr}E=-SlZ6IZQQ#IC#|Qzav3D;bLoW=Y>M%P z7QzrOb2Q3Iq42ZBXqh%1@5qDgmgCn+GmEh^b?)Q<=&N1T+D~Qf_a9D0?#rA)=%r>4gCQuTE@i#eAd<;n}ZEv?t6xynOEa z-?aelx_~VDB*9>(h!9HC>a!Aoa0a|z?RYSxsXT%KVHK=pkk|y=5Ndz603$?Vf1+TY zkuUQToY`;*0ak17LSAcedcbMfDH*@4?R0|7%Mp$aR%cG(%`&-2DPxfU_e0<7=P8fM z2qc6eqsh*WDqEiR5E?*ch>#2qR*V+DVajChZDY8wph;cjxuH444EFqYj$)fYH&Dh<3fQ1J$KW1ljVf8SpkFZ87^;%{jXg7K zH2cR2)9U4Ka4n{j!3i-}8$7K>s@*zWrej~o9Xu|_K-F>sV}?FN$&YXsAN|%H=UplU zOm+R1ux$=)+~}J5(=*sFpx+WufbE_Tmx+Y<3xdK~z06gZ)(|KW9F}+7>)T$-qqcZE z*#5Mch~~kPCD>@bd%B#(gQ*u@*?F=_=l5YG)|q7#Y|;hyHD*wU!_Dc{)khc)xf&8D z2_dDI?^0Dt$Q-2gBXV&g7XZ>ALx7Nyl)stEa!cO>>b7tC=$EBl<5Jy4B%ogpEKJ!F z!EqzJ#nx1bU+q8RyKK{Dv306l6`2SFrqf4Uh7LW33#E3hrAFXbHM~%Mv2W|B=4Z6u z;Hw0uUUIuF*4LsJfKbeJCEdP>^0bgE$>81fFI$5-Wec_sblU2i5W#78yh?s(UO15O zC)DYT3^JcJ4MY&~lHq@R{b}?O^kbIfV1%3%<%c8vCLWZxmpAbvtF3pCYHQ^Q18dkA zA_@jO|7yEHKOX3#`#J;kC@16%XJ^m{>EYc7$TyP)+3YaS%og<;6g4%fF`|@;+e_g~ z6r_p#c$B3%G_4`&|M}#uM@j*qd9R73{_;a zfl=&A>WK6;I=mCyZk3zUpKKD8Cm^rp9StQ@Hx|dQE6ZQ8%smiU%?gZA z=n$Kbe|jWEmcW+CIr3TvH-l!AHc@{S(-_`T!j~I7H`u>hc67dIvLM3-h?#A;{r zZ2wr5#_<`dC&1|Nz@0IVb8jn1qS{ht>Z?$Rcfj7tVlZHal8@!T( zK`CRBoPjMZe6z71^e#mz=!ObHAmaw3H!p-K2tTK>H!}k38Q5rP2ZwJrz7&Qzh%=ay za6h8GiNHhZJT~QwoS61@cu85TAZ!`k+MmavPQOI;LPvHmqG0CCKXnn+l&0Uj%Lb|> zE4iDvcKzbnhOAh+>+ty;0i7A69VtUZTXIDdQ9f-!`niMZ^~&7^w_2auat*afx-%dU z#tF^cxy#O+Z)r}9BXNBBRaT$>Xj6RnDx+41-9wX+n6ikdJI~Y`+~QcaanMfNw9i@G zQ#U>$gtkZ}Gv-0|4c>|$Z7KkJpLS4oj$`WU&m{0r+%9D0CUG1o9nvXtN>0FhrM3!0 z<0XHprYPa-{p^L}`V2 z_DtWD6t^cdJro z>aIun^a8S5J}kjV3>e4l3?IAhil9h>kcwjZfC#YCM?PVx-38S*nvwj6M6r>YR6&T1 zZln$q94u{x(rrSA+J;yzp+nyV`k_*bUPfD0T8Q>kJ><&7kMQo}NlJ-TZ}4fVzMt#0 z`0G9;y&+~x*eCgNLQ?@dvJVRg24>e7!roaMOn>rWk7Fe|qTrEQ||Y!x)KAcNW-jWr!eZAk2{ z`PINrQB7G%Xo-(RWeRFceNDN()lZ>VN9g}&FnLGjbx;F;LCW$?`~+i(%gM7?8(CH)vaYuVxJTV!6!2&7M&~k+C*rWX5J}Yf~=PzyDQcoWaNK z3G2CcVk}h`g5~I5U9h|~Bu1hB;88F$-&z}ML5mL;bO{`JV5;1|H+nP?@d^&@LORj` zYU^}5p$^fFdt))R9q$SW7d>YxvdU7|gl>vzj(*>vVXj*k<&{K#goDYo8|X1J-Eyqw zyLn%RKHO5*vxXl>OJ{UhM=eMjhppWo%ezd$EzWp(4=beyDd;*xSFPKLSA0HYgzMjrX3x6Az7NK(skZ~V$90)NJV{QC3s;z7xY#p(Kze6Pj^$M5d0#IA)Izsl?=EAT zGM7p>&KyuPe(nXA=&ds+~y#XS{xhuTk-g;f~oGCXld$rY)i}Y z6;-105^Q`iwK<#uv6fMn9$W^PzE35tQXDCqoe~C&sxhu)FJnPR85VEE=#VgBEBm2X zxlgfoEId{dymo(JUP|SGy_s@IvdE`@WSLd13X5 z_dFaaav#C}q2@_QFK`&7d3hCfXWzi7OljH*FlC_W@Vm`!i%sQTQGpPuuB z+gos_v-MgG53gj-ViW1BPvfuc|FBa#jlENbi^lF-Q4J}EB?0N~AnXocUsM1$>K&MP z$m2}Ni|CD5k4TF~*@r}_(CR#imhyPUE2W=6@zEQV!)ky7{ zxt|(I(WrlHz*A?bpD8?zwEtPXvY{2GJh&%w!;GY=9sAD?x;LV}jI@!T*`z@_*ju(H)o6CH6QAqO%%pB$ z+~R9!tIu2+SO2O1&iIW`!}4f}AS-jc_#rixxj|PXSJHMsCd{UooF@Unx~!trOvW$z zOTp&zOfwgJ+a#=>@~0>=SawvnJ34PbvU$He5-N!(>36!hCFEtZ_wLfrL{i?jcN%wyhM0=RqD80)T4Zoxj8D0>?y8OFhy)$5Z(Sw)45bnT3NH*y$@kDsZ5=JC2Tqe+9)x4;W+FG5V%|vb zpP5mzhEV{^3az-;_vKoVbBWvk^#3 zSD}sChANMAo~VcDsWvBCZU&8?&~EdZnT68oe9zcZsd88Ry?efOew(*!=#J0N%=~fV zpr*?D`2W0&!ldG5_T*|D5*ssaE%?G34=pHGxGfa?04~jlp32Q)0J&^(HFEfG&4*${ zi<1nh@oHdc#fJOU;`Z7liNmSilJfkQ`A*BEHRe6?(iQmfC2_>dj~O%$LzL%vb+LG2 zt>;dHS3yUqFQ*;_4Zg=Jie}G2CjA-VHRTADZZ;UX?u#6cyuF+%!NIU{0c!fdFPV_X z6cC~w*M2flK4DGJoiRHh&)>WFq`pSuc9GX<4cant_KlyuiIaoQQnWOM`UM~}{)NWG z%>QLA2|a(iXHozB3#!?5oW7mlkfcuKQa*h{4w=!N^)Zo~?Cue2cXDSQ-?AKi68gbG zqwVv|)p_9?<-u=1b!b;1UwjYXcxakj+_|k-igmuz56ocm>f<`)vxrYuoFnJ7qn*(` z#^doO-Ox{%I9uoY5w-TvpSxg!ZP)T-qG!|&#twjMs!`n{pSBh2FV9aD$Y09PI^zwM z19tLL?s}_J#5^uux-^({jQ{pRmhnQBu@NV|#_Klr)^8R;dJbXa?$L5!rBKJejytjG z)`|-@f!ihChaQ%t&6>}L49j*C^}oZSyUkzC9P9nu<)_icT_M93&q*hDbXk<{Vw%l4 z!7rh^af;!~+*!m9hIY1Y){MK@F24XA=3mg3BoUr(0Mc8zyA04KO3SSYw`#lZ9}>00 z$;ZVB0QcJ`sdeV(rI}it{}dBzOF`x^wrdgb!>;vsYVRQ>UztLy1xxkfrD}7UtnF%IUjXufcr~&)D+-12S_e!Mm(=0Pnd?$KaEX1Zg4#r5= z;TF@9+g1k`SI%ew{r7w37_dSPRMA&hinPslk)p->d(f_+!w-sV^;4k#*5E#CS)(;1nZ~e}>rkcwX>hb%|iZihiQ(ta{c}P52EtMf3!9KGJ2sr^e zyewIa2$;AsPbH<%gq2E-ClkXd2E{wZFZ?GZkHy<@<(GA{T=2`BogS1?`?9gZ+b%6x z&SORo^3DRqY1s_CD_)@tX|j>)ET1Fc*7B{%eW#PK?-5E!iHQ z#6HXcab-!T^@8&PwL}%4; z+Vzhd$Wzp}fVEzf(sQiFpCWbVJ8C^9S+PBP_)uL-Xj01dWPotdjiL>W-Iu|dw~_H* z(4U+)HyzetShrIL)Vw~Spdm&aYJ{2HwOqBURhCut&OB|LBp#%sm3>YWNV3^ecG#jd z%m7Mu<_w3v?M=McULoMRU1A&W+XsPeL_GiUvVl#i939n6A`+$AnxCCY4SA!Sb#dbCaOIn&~J&D|YY;!~j09 z(sVX_F!CUqU6>A9@msMBDtTVqTU=T;@;q4VKZNJ{+MF%eQngJt=WE}jq$E3P`OuRl znneG&`dh{b>aKuu(Y{lwvt~4R|Naf>%KEVF>2U@iwP9H!P@&wC?d>rI56R~8S@XkQ z2&mT_F>~D;luMJ?v;F4tGpW^MMbvPSh93u+Z^ozcL!F{7nt^i&(xn^OLHqcSX5)k3 zGVwC@S>E@><*mAC{;G{~69vxvOOr~Ft)BYjLxx5Nu+8`rP>;))SLR#`x;J_Au#~F~ zv`Al%P)mrJ^OZn*r;WV?nfqIe$XeuqKzYY-Nj>jw(O!)-<`cJOdoOTN8X}J|4^X`` zX!6Pd)ruCq#U^gI6%ejc~e?bQ?t@$?$8aP;X16fsZ0)-@m&%zV^u#Fi{jkuEsA4o1 zq;!@roXX>_hv8l;!uXqa4>IlSn_Q|58u=Dh>Mg}@?>AknCI`lCBo?h7`m*{O-TS7K zv?<2z%^h2%&Xt2e-P0Q43BEiLiS|CYrsG5yf5KjKuZwjA*E_Acv^U5^mm&LI+V8|w zK0RAL+N)xt(Nj{nbJy*szE>jb%Qnjh-ZNV6r?rAY^@zI^|E{7J^pCT)j8vbVPgytF zYv4#pt+)(Ah$XI`I;{U>Z18*0G(5FI)QrTQ)b%4~wqtP&X$hT* zgdveipI4tcBk_7_e6y>VY@HOA~)Ew@?hbjt|d0H423~wZp zodoN}T=O5fip|G->-_>jZ6a)RS2zg=;sN=Y@NHz{A@SKgOo;4qgy&w1*qo{O^T{NK zzHI#9WJE8Ma${voT*Jle3OwLCdN6<*RhO2aeq`)OV;&OeJXunkV9GT7j^Xm{-&}Yd zKaXp~U$&05fjab+Jzt+Ft@}x+l+MbWAnY~t2iQ#mD*v;SDNWxt&f1~oTqUNr9>(~6 zZk2wKr*Btu8b3Jk7SHZ^+ddv!zOA99Yx2Dc%yPr?-z=*ToY2rD3+@HItvlx_7=OuN zTTv8S{Xt6|oolphfe~QO_JikWRwK`8UMZp@a7ubbLHs%e^=IXU4sIsri1{F|xoFie zugixH#@ToaaJ7|K%gj?-;88k-vc>SzdANm}C8ykAHn5@QG3Etqhh${Q^n(+h5% zz*Ov19x}ATz1B0M_K?)F_p{BCtskS&ecL`+jxS)FxEC)g0D<^5<>Lxm`EJ2q;l8&Q z94ecO&X#ZUjRdMxOl;QWT;Dc_#BP_ElwKwZOSjY`bV~V)>4;ee?6JBTIP{?{!+3uZ zTHy+#9|kUNMbaD}prFhV3ZN8nF6LvGKlA z#vdIdZ%xB?!1Nz3SScOew*dl=>iMHq)Nj`^iI98hbv=U)MIK_(A;U~RphIi3jEKO^ z`FyL&AbSrawDwoofj~gt^I^zY=@tqdwIUL#-yBI=UL+~(15Ju_=07ItcBC7l?$e8~ zy1mkaIA`_9(#b|b?We44N6SgFj8dN=23*wgh21Wt^{}lP%_y8QxeXn#DbH~=1dh@y z4_r2NodlrW*Dy!LJ7qPqc>{hm%Q51Wy!#F(OS@Mq zeJUG&1NEi1;_x>LT0WR+Sk_1P0!#K_`j!@sSuoKr zdiSl(#J+F5yE#vj#6N{S|55Vd2G_z@hO`Ia$v$coM!7>uX^cMvH}ig1YD$Mq0vt_D zUUcHRW=02|0xPk(g3_YHUIKA8q3;1QABpT+9=vUYy(X-?wz4+eUI+=Xo{St+DymBJ zQ0aQj6!M~35)p#|FIV2|`CHs%5zn|KG zE_sVkuvvz1`rUeQe|jBMCxd$Jxl^(m5JDP%Pn9?sH6c1*8KqC-JkTm~w_L;R_T2Du z__-fj45&_(C9kZ*UwdYQn`T5SU11A-cc~OKy5jpj%)R+NgAu?r2HNZ3-Mm=(4N@@M zCpbx}yQf~fX*m1cP(u?a27I&VK`9yA-^U;s>@yjyt{)*#YRq=UcxcVzukZ0vs=_*E zLd??d#h%jnHkR4cxBdGuEtL1>X@3jwc;hq@!$)eL+_G(pg_THQzrM*dds2@I*!$EU zEO(cftCc@z89Mq0>aFGQy_GGfu=R1%905B$%|3u6Czt(2#=A1v-{j$+nQGlwrG@5> zRG@;Y4Q3o5hGp9?CJz!kj22i+Gqyt;S!PLEU`21xOiSZdg6&Yb!SE4Z$t=c~KeLlcLtS?M zSivvbg>&0$w3>0cNQetJ9iB!Q2p`VaCxnf(VjzdtxEr#tHdm^#x zOCb zobtt<3;`v$jAS=f%3{SRYfQMyDzK>m$<}{FDc`i(x`H(8H6kl9%oZ+|?VEukuBV+9UC=?pOP^PYL~ zcCg8P0=wgF6j4f8OrW}5txXgm=?4-V-eXpTPbUsqm#p5}3&u~s(I z3*=TBw{j%A(?UYXx3(@Z+Gw0E!@mMo&j8Mv-IsPR4A{3`)?zu({##FFo2JZQ2j1Xc z$RA83Zk$Uge+m&DXmzEM#~f<*gKEIVYGdht+y;VUM*xWXMFde7P1kchU!1W=biLZA zhSQ~E6q^u<3v0p2lQJd7h%4J}11=V;h);~lIod^s3C-Qi{ohIrgW2wv$o6W^JSib+ zSIPsbt~Af8_oZ!o^ou9GoJglOnnaS-CtCES-7S%O!k;beb0qRQgD;aGrnGG5-hk(9 zr?`3MFj3Z`wJ*V~t~d8Bo9B?SYZr@&CC9)P@|!76_CVcv^7)e?!hZcVz18Nwrimic zbpZeE%wfhCK=%bm7s3R0v0~!yGe7$;XSN8(QIvo`R{YS{E!51EkVBMUv%J0Ab%yq+ z-QMzH5I?yJ?3)!7-y2$5y8}b(UV|I`(v(-6P=ww{9?qV84>ytjeO84M&n7zBdeYaO z43qTriQi2H4qz9ES4p&apy~#^$cc$+5ZBm)e)W?j5w1ZZ5Fh$9Yt1Q&P0nX)|1#9E zPrJRApJA(Sg=A5b$XDZ&B4DnB^X^jaz1h<}K+X*~QLYDSGjR=~iymxz7C&rtZ%)4q zJIR=)wWoXiPR1oY9gArANmIe@4y&*>ud(-oND4FB=xBXWelRgRsexRh_sXS3TdQ>s z@jnIf-=xy+vBs(Y}faYD~9w<|AjErZ%m#v&Mq zGOENRxrnS?IvzmFyf+RPpLG3SO{0>J{FiY52Z*8#K7LSKZ!&ZJB`cbp&%el9G|YO+ z{$DQVKLKQs*S4gpxPBB0C|^1)932zWdEv{KiZ4AqJyQ=ZosJg!lfgXd<>4;yHO+xk zRntV4cxga*qn^d=cdQnUS#K(}iNk!j&)&Vu3dmf~QGPauo2oVtG*Xf_Kjr6s`zoJQ z=oCk9z&iI~ILqe?fT%so?z2g^_uE<6&=yOykJF};j@Ul?aw_2+GK-XO{eo+gnZ%Vq zv-P6D%&FyFWrS2>olM{JY9IKnuAb)c=ylcL({1ncyLZp~ei2I!^D!!CRyA;r`Z4P< z?oh+909)tz*qx|ic`f@m+rw<47bDo@n6Dq)b2bCZ)H8Qvf5nR!mrKDR)aC*FG2w-A zWu9WpshjLpgZI`y!Zav;v%ck|Q^(t;OT~K^dO$OT)B1UWKjByC8x&Sc*50^9LY1Jn z`!AFI?c>?kGT4(sA98@&Z^`uskDmxRXo!+`m_=-O0nRrsb!q=oLrM0{(n_H1zVdq> z$dew>U^z81QOjT{{~0Oc2&W?^PAY=r(aQY|Rdw0)7#xy;=2w5gWkOU`bv>cSwqJ{T z>OOmiTjgOGSN*ShhgJ$4jEAclaF~=WnxcHe%4vv!C#P$C1Hl)Fadu zQL1n|A$jR`ymF~~Q!DvuQitK7pm6$Y^~Ub)qVZyO+&^UMdK`P4D779c!~gJGvwCx@ zs}Y;hX`Veca-dD8()%;~q7QwKl`8#}8&<}lSIO^|M+Ep^>hLNG^|h!kmk}7cGr}+L zV|pamj(^*k>}ExH6+E25$r!Pp9I(1V2@`q1)>!wP`9!=Gj$njdXn-v3&P)_E1CG*+E8^pZ&kf7y8o(SqPj>Mp@KK=i_{QZE`Y3v#&G!eTF0d7IIC&M|v051>gQW znOy&?1}e$(XNQBHBHh?u)2JmEQYPiH;8(frM-EZTI{GmX_pqe)4$| zLk=C_B%z&))NNlIaQ% C5SrH{nSTa2N+YJkm_igXTe!W&x4+6~ZQMw#`3a5LyY=Ri+s|8nH%%SS{8?_#d%e?>(FH*OrgL*_d$RXJ zz1|3Ta9p}6bCrh7$Y7(S8VY7Lr5VQUnp=g=Z+tHWAJrDhqEhJrynz!m+@wGPsNv5| zr#G7?4eREhTB{(nzgBi2W$KQ@@$kT^vk$@$EUwEeA+4~S&^*;P5Hf!UJS}H@K@*{k zl#~vx_8XT&za{>DJyx(=M4TjI1;oR_!uah%s#!`LCmYC)^mRMc`bE8}_Hk{HwrXu= z>jG0T>w$+>vqmY5-ZA9=y1d?45MPJb42S_l?>XOhz}T0^+7GO=cu`g82{G+gI&0Qv zb^g>hyMAOLw`p>l1mw+dp~$7=(F)lwm8?{wRzfCylQe|XLp0_$p#tUrw5;B46Yq9J z2`n@9c^S8-OnT05O*aYSj<5*-`=0L_)xb|5)5=Ud(iR$T3OuB~|H85KF=DyyKx^rT z8ro&8uiw*3Qt{193DAOzl^s;N76oJ?PTXnx2VfZvoJ`*zr7Ynrs}Rh*BVO+_Z=S2y zR#s#l2U6Q?gUGrZN2=LHOA58X=CQX!gao;xIK8&dkT24m)Ebw)S7^u8PB^@OhW)fV zE0(-PPn2!V`a`_&w!o;JtE)p|c~Gs4&kEW+P}h@;O-UudV!XUQ9}7UX@&y;FN*nru$yZ^8=(Gt_` z!CU+n#B-+0=cP)zM2_gC1{2$}70#uya{Oi;RAJ((>*{XBy~D;hE{ZP{<%v`OlX6VD zMH~b-wqxyX>qouYfDWFfeD*98Q=%@ zDP7y#@3^D7e>`6fMGy<#ihLsxyVaXr<%VRY1y z@IFxu@13iA(+UY+MCbVFu?J_LWaY3KihFP|QB6kDyHWXfyQO$%ldIyX;tQmVxJUmK zc*wtU@vXtw-cRP4YwsIexutdvw{<-xr9JpcU z1!({DB_G*gpS*wSHX6-VW@-6c*h^Zv$g$fXm>l4CDeRO8#@6ejzP7S599F@YrJ?8D4w=^W{5|~|y4UAp@uw95teZ^P@M#2gHI!D^^{z|qr_Y2Lwp9tt zNVxWX{_WT_Z1$lg_!w(Q<-9o|e32Fy8?eK6w2Z(>gTAS$v}C@u(W=&2emq1V-=EP5 zUVwgpUB|~9^0Ew&R*5uv?D#D%)%V5^*LJCeN{guru8f`<-@ROe13D*AX`(=Smp5Tc zl6*2o^3*6?w=Q&-?hjIXz!n>*FvHlvdWq3S&JA|yy0^A6OWxlaUzqG)kpB|4&llC; z^=!KykyUBGJyjv|DR05r6*XgjEd_qWkBr?=mA3#8H?}UU1H0M zJA1mF%2)4z+tWd}r<_0jY3?wIMcw>`i;UWwPQ;S2;OFDOE^g-nEOqDC|+i!(e)e?!E#Petvb9|e3szi1@czX2; zq&FD)GH&NeW>n`7sNSKqnd`SIkMzDPNYm-O`|z#tomA-24Hf~bnc^Y-?i_JO_PZ}{ z)i?7b*K47Cekgpcd-G5`y46@wRN=%&n5bWT+J!SN6dr(2)GvK~b9S{N@@QgHod4Y+ zsi%$tQ;$6qaqTiH2A`Bqo_kyIK4*cb0m-?W!hrV{ta<6z54P z*tu_cN14Xfz97bL$wj_i^-XV8+C%|CN>~Q3Yz4$N`g1sn_N&d#3={G`aUUDK5c_e% zq_aw_YIN)D9slhOnq*d_Y!l&?^efFvAjhu}M>5(jZ2wZ`s21KnS}@qU{Yqc(C402e zPlfdg&&xk<*gjZCv;s}vb3i`(+^RV%yW&Xz!82mHJWo-ROCQrN`@(QZRvM};X# ztoI?y3NhCZpXwHh`^Gjq&BH-+aJZ;Ypjjx}DuIL!uoe7X?*^wU#qN;ksP=o6xRX`J zW$5m#IO$oK&)!mUW?R+Z_bE*wADJTfqSq^wabvJ#+=K%P5V8F`efZUCno$16;Z01R z=Hj=q{`+^C?8^?X1MDgUeyxky9~=@qJrFU`F^Pp4Vxgiq9`KpJJS2&X7vidyj+k66 zla*bd6^lyHGp98dB^14v&W8mpFjz`x@y4VlZzFxVH+=&jK=Dbylz;#8HjH470K>nMId1 zmY8s2wrUQKyhQ!6$PeCqaRm8#gCW6R9e_7Qn-}ujjNIf%c}&T}$;1q@l=Ypwu|Uz# zfSI{VUJtwZ{Hk58;~Nn9$~+4JH+=L?sN9{9-*%7$I<7s|X|bvj*(>S&?qPaT)b1<0 zDX=jF4ErmDOE&Hvt!poFI2Q_G>U!s5tQ4?IxHD5FJXdrxc^vIrYp*#4}zI?Dho%bcS08C4!d|f;L(tQ zZaYV0Z0EJp1=!}l2NY%VlE{x)oZ*91I{!E@L9#C3Yn0M6TTLfEnTKugtkajmJ$~8w zkm9pqmzOp+zzfsmZ;$*u`_f!f#au@`o3nHCrAA{K_r+lQyrqe2#*_q(TUi_NeQ=>Q zAu5yR*{q>?;->X@N*8N4?fE6PEeci1$}NAhjs4Z4T)FC;&Ar#6woHuj^Gv~ARvSn! ze}d%Idxr$9??})l#HEk6X?w$FEJsz*8hfw73$_M6lfLwmhNxrxSKb^$YO)s8N7Yu} zHA1sExyKM%CzxB_?F`Md#5CM?S(DdecfUW4ai1}ef_u8};cI|p9_P%uf3*3}BifH} ze+BHm5tpQPV^g}}gT5wWS4-HJ=N4eYMprS-FE0HC78L^Yh2P% zJXB-ktm+T5&^(?pe%s>2?7LO#*->Dz8;>~a%R%%e}J2}TO%@2 z$F<5-Py7CgddN1Zu(!iOMssr>3fDe&^63BlpB+RPz;zRL^yb^KN?A5GiQIp!zBHKp zCkrb7t-o2TFLnnoaZ5iuFdBJCHgROcq;WL4R-0Qkv4;Khxp3`{uZNwzmA|q*%$zdV z46M7XxA51l*6qoJ+>@_0c-m;l%nR_7WHpLX<{oD7^5`>iQr7;!k%j#JhD z`RjHK5B<8GS<2p9XXi(+q+SX(hkSRpu6u$M?AFq1T8w>orgzRRff4pp$xz z%~{O!!C}v47mb`*0T@h`H!ezzi>w&G9iR_{v?K8O$@^TbumX5L1jFb*=qI&j8^gr( zxiL4QXO{jP_MH2kb$OQHy#SftLp6zc5c~!-fBPbpCo#L4ZGPcIy|_6Qy2E{XNvIuZUOP82eE3k#F<(yO#*=&D8?|(vvy$ zG4uwmmy*qrtB^!|9RWtL_#8h5E=!^r2lv=Tzh)Z`53M&uD#ig=3V3iWESCHg$WD)b z70D<-$NvRvrvOpL6We377ozeFOe;OHyO<*>fnhkd`8bTQdfaIME7pK=3GV@H0vhCf z82+C}&l=OtZtL#CGZVUnqfbbw4c5Q;_||o*A0Q% zpYTdCz$&G`<|UX)JHCWC1C&wdNNmO>g09GV*iw!x6D7r4S!3mC1vU7i?ifwZ**!Z5 zU=9RtksIccN7-;>HJ(L^XGibWHvoIHjRN8L0_e-Mb**G>cMXJJVpcKX!)(QezoS!f zg5=lRZYCK1Zua>Tr3QL%02zeyi+`qgx;h)t4G$1+=^!L5)8RS2`Q7et61kS*Y)3)W z#6cHovhI_9x=2>NDV0ULyU%?K{rtvp-2y67?vpVY#)dzPtBP_%T*jpaWHBNwXgdRt|2-}KQ z?16hTUs&f#D*OwHcPaD?X41k8nDhAn$a(96YVOOaYJ3 z{qeduQc;=swkawlp0hM!L;5u0^87~|=Wp0Z0++tYwj2ur^RJn1CDyv z_9?#Sf`>}-xb%vG9j%Kwt~e+Jy$gLkq%RGf#E?Ns=G4T&Mi;vyBqM&xi%&ngg z6Y>lD8&o&>UZ= zCZaEMeLQ1=s9ncMCkx-_dd~@DTdPV({7UUcvxk0WUpXL@ETHgKsD*Z~rMI!Xs88k`B_<txb;I~{2#*40Cxz}w=l;TE1_zs7QMBXF)=jShVN3reB6`J+wSf+bSOCTFwJyB3ev!`le= zD{2kZnUSBq^xTS1Mc2A}HyE-zp;PQhG{zJjqZ(Ggy%>BBVxT(smt#4YZ4;2CzxOvK zeV~5bMudEfGT19{zU4r+&oax?7%enJt0FB$oZBdRSWXtIA=NczQoBpwYL~xcMZiVE zv50FiHOxkGaZgNpXG=93J)!Wu)ohATy6D=Kg{v50ugR6mHQ4Vj6nq@BE?Reyc=#it zYs+-G#=ic{0C4qjc^8lOF6UXGRsS=f%FGL5v*h}=@m^mnYyxRIgeMs@XzyH9qTs#{sfT4oai8P0=bEQ)ON2{Ned*H&Zj`HDB# zlKUq~yB|`(`v3z|PvKy~m(*3z0k`tTVe71L5#S|4F7EO~+L9LM5?m zszTpTxwpAq@q~@C^+Rm*n~1&dsLMe4O+( z5}amjrD@6vlve^ZvzJ+C@6%mHM_MZVC=soJpN@APlvK&f!#3Ww4voD=r^El!jOi&0 z;GB(*rkT9OJKojPgM&`z1T438&)*+o+4Q9Ay@& z05m%MQbX$*ZX-Z`ogD%XgsNF{?SyvDsUTDLv)+4?4zwQ2WREB&RVR1f<6C|eaaQBp znKeR+TOJ>zJU<5DpQ)NhpN)o|Tym+CD!P{<)gLV%dt7b~&ahz58 z-KgNQ1heI7Q*7-FiKu(6JBDaAMJ|6-nr{zC`bqvPgYRiv<&pyhIha1G_UoATaL)Fv zO+%lEDyg~s{pHh5{R2AuoVzyP2e}6u5mTyR!|W*s16_oS>%rsBwUgz6%Wo#_S`+-u zC|Rxe=4>=DHF;BRhPw7qIT`DXM%(oHf~&wWugu4X5~-N2H^|SFm)5WMX+i6 zfn|bH)&=~!hTce%Ua8t!z3uWk7yW9|G54Y^sGR~rY_)1b>8;EXEdC;}PF=hz{tcb$ z6$DSE&95OhQi8|8o<+|HQ|r9Rz(@%3Wk@UOZN5J$NpW}rF3w5;>AT+Im=69+6hGYy z;Z+s_h=9xan(`llm{8CB$A!2WgDGZM)mJs6?*jxMB)n3mMdL z>xf*<;Xi<{`l1PoCE?KsLP%#Ve(W~wbx<93&nD%GW^kq59 z{?ikAmt}|X2fnh6@vb1$_s8r0PcP@EC^JV%fHKeLK$JH+oog;88}+Pt8)#_=Hez5V zjthdp(^ud~e<(LF@z###qQ8wh{U!B1lzWp}Vjkyftym}H%0UldCxV-BKmqUHKor5w zO6pQK@SDn(0bkvRk)EYcqhwR8==#VpV>)&jW|O7h5sj)cjYmA+xTu@a!Ej{8;%7&| zlO6>1*R{?NyEf|Q(PRBU@o|?h*JjBipbA~+y)$6azw>fDj7l3=kvaFvTAI90`mxvc z%Si(lwN?A5QHpMGz$aT9IlJ9;0fhG@*H#wt?bHbseWjpxvhDc##~8U-*k-^X8RC;r z=!Zb+26q+?ztG&XoQEuHBuEh5W=c5>WceMmX$JG z%0aOgvM}|iaYinQ75>;rw|yle*@|1)e7^_*!5oT)C))a90y)VT%JYYaMTy!;o+s`# z>p8B70eM|dq#v)CWa<{{Fh}>n2>De`tAj8}%SMEcURbO{b`Xw+ucgk6Bd~p*aVaC@ zhPp}KkG0G-ube5cvHMt~v8v#G-ZMl<%$bowv84fTFC|o9KadKU4V5XN5MsG^!>=b@40{ zPfIa7y!EzcEdhvb9dUtz*}|wZxl%R5M%fKG+*~8p$(-xVgV*h@0xdYxvZP81Sc~~R zwfz_S9Ow{Atu=!d!Bk*G+#;6X*oP-1C0$M&Yf+25oTZD{ z%QpX}M$OEy;)Z@VA8`@ztE!V*#BMwXFubp*we8e;Bt}W(q|}kN%(@msZEV3P@Pefa zUur{kRh+F-Q$M{O56`%<`q{lorK36BzOm1b?v^<5xX$cPEvVQ%7jKRnN9IG;{rSnF zsap#BcB#OVY+xkVQ4>bM8~fb}&h%r1p-|DA8LC63E`jr?fYLXjc zI~>=8FKxg{$1se#>tHx*D;Vj3YZTfHhRkR1N2DFtBAftuDE9}#${EuSlB+cKkvh)2 zA!c{{a{5L3VAnC5qTq2j!Y8wf@6*O^q4a~+EGYLeT4)E2P#hDm_s^)9k3pOnMSsT@ z)wb5g9IG3cb2bpAyC(u)(Rp;98kOI8ZZFvd$yKeoZO3!`bY^)Pxh%P+036cru1n`$ z%>*DRUzkPMxvdwZT;y^Lq%M7#-;G;oXHx6nM717eOS3i62; zS5Wm+0%tm9$2{Ty3>5Kj%3kB@3{}frdfdh%R)Fk&WE4m^5;yyFj(t=mVix&e!IS=F z4dKa2w5LMDTpojDJji9v6s7lpoQRBrc*a)QU`-*Iv0^O9hXeT)=uOR>|EV`eG>ik@ z}9m;1C<`{5kW{<5(kTE6(t^aCQd95UG_ zm2J|K^PuN|InUD(+}wAsNmbLxC}GqtLH^x@o#M>;^e^{*$`12otrO=>ee5CO9pIJ5 z0PP9W`EBT5oLzk`F|9A&w9~=I`-9rx&SvgN5zf$F_4jhf;qid2Zs^YY%2ioa2jQNb z#t6LB%B<-v%`#A3jafDFz2{bmQO;x%F4OAhx_qlWxI!vVC!vS|R=DPgQkc~eAM$1M zDv(M*^LAN1?i(QqoOE@SRio7)z8^C}sOo$$wDv<6gC-xf8v}Y)w`b2^ zn=(N-fse0w{9!VVyPmHf*nXo5Z#yuGub7PC+Oeq90>MI*mbUnRT_)=xqil#e2OSfQ z7XuBkiX>Xj*~uVn1M?ZBm2rlO!?rp2dZ{_Ans6=}zgcwDOEcCj&sFTMg1<AVvBF{mBt1#zEI@{3--gHSF|2z^yKc6uSyaaR zL(R^9VPl8ugFozLTR2?F=XVq9%uMO-&gART{Neh(Uo01Tv(tA~r5$NCb!(}_OkQdJ_T**t#o76p5K^TMSfkF(0Qs5OKA(06l+h>lRd|c|+@_l3>OIL_ zLnN1&itJZoS>-Li47H3$@}a@?2JR)BgzY>(pFe*PzHft6v&u3r#}2(VB7eMb9xE!S>c6$vA(26B3%Gzq^kuD&81152j#jVt+J zl3w6s?sEx?|AIzMAlB$VKw6(1-jrq_B&Qs{Ljj?X3C=}k`|7D=%Z-79nzmc0qdQ8X zV@If-215DD4`%d`Kl_&D^Fc<;rk$7!JSy|`h*Q0WXXs8r%WJ)$kTvR8xfahLSk~Il z2!p?SiNha_=8{%W5j0nsKIFz;fDL0XiE9-f%}~OTv!{}TK+MqZ>cfhJY@)gxo;ZHk zra#Ozy*5y<@-TCi63@`N>iK-t1w;=l{3*9T1$-+v8RvN%bf6Oj*R9T5?ec%MRQp;K z-dA)BIXf6Xn@?Z3Ch4_^D2cn?bz51Z9MOKOu}w^1H9=bF8%%X`$a^o({<;N%Mlm=g zIbjW8empXtNwQ!lshFepzT&bPm%cmu82dR_N;Hm4YQ6bY78FJ!enUq6u#2zY31={f zsl-G5HH(do9BiBHvu*d=+BPdiZl>B8bBII`>wLl*ZpA44phdjJfFK?sy7BeshJ!Au zI5%8v;VHA7Q5!c94Ds@NKC_XL{N-91LWFDdwXS(xu$N~V^>=atj+pUiOo!Gtjyf)1 z&@ygU_yb~ei|=t^pF0Eh2zb{xHj;x2=^l%e&MN%nYnA2s%F;X-UR7f`zET9iz45E6 zLlyK&f>#E3JkK!JWVgJ)Pxq*bwC%G)cS-J(H3Ic!D6!) zwBEqQt|-8+9_l{%!P!s;Utfnx3a@td?Au8!+!ix&r!KfQ>9!n<4W;a^8YC>_S)wvl zzsKMv8D8dOuKpy8d9Z@R;@MOo1E6is)gGf#I|TDuU)78&keuD&Y&8A(jc~< zl=wcZu7l~7sm7IAM%lcKr$@1J08C0Z7-8%rH`zkk&TP z36xVPQ5;zn8o|89XBeD*)HY19Y|@F_$$s?KW~|x{2ep0YEQJ%pqZ!f40lMQLF~WfS z_;FicO)(6F4%sYL;ceoD?{#Cdew_B)TmX69-BRqgn3wpsm`sIj=_tIo!Bs2be>@30@Ma=%BPw+&Odv!OUvN4$q337;PG)hGKb^k*oZ=9&ssTV;mfu_y4c@xL;oLKHH&WVslf zp;6Gc%xmN6yo|$)z~*KH@zKx-HAhvCdY;h8pbGMuu&0}2rX%mB3}`7}uu;yfQUi2Aj)e0X zSK(nh^}#R#mn1s|yofx*aW(my$T^qrSm0({JpZJxckM9yS?5h`Mm0R5VJIJOKEkmU zwY%zJc(G5!l0g+75KrYFO1UrOXfFnGSa-SiWji2M^c!EB###O$tX6Q0WA^3*=CJSK zy+f;ggE~^pinGR{nq%o(L%*3`Vq$#Q@PotHNMZ-&H_0((iR#ET#o-?gag?GTapLhl zMyaZl7GHp*QNC3|+Az02;4jJTu6}RV88qK{a97uno7pOa z+j3B{lV6VTNv`0=@3f<#TzkT6Tzk@#ll&@XH9RasK#RRiRU6SUcY{sNWO1t;Eap7; zG*s1=gDw5=WaNelMeImZ8z>d!DBtPT5c(T+evzr)%64>xyER?~3gY@6KWUxwnSxj# zDPU55($fZAG3Zwdj?3IR(pLuAAcSR}E%~Ps?N-{Zdq?UNcuz*@$bV|-YgTn*znwT8zC7MbdK;`tKCk>_tCO-D=8tg zLHsb)Hc$)uWMl@;z^K{L=NPklo}-AzfbxIbRHraqJQ<^#uuP^qHLn41N2}#A?XYJt1+WS4JlGnXL;yzp z{|%ZIvE{#iQ4+XsjP&<@ZEf^oW8-@FFVtyU|NX-Lzi+Tm&vN&jQ9l`pXGKaMa8FQf zIsBF*_u5MCI%ARQKJZ%h&yAkq5;e&|w>#nen`ydD*2mIe8h;OrWaENbWvW%jZZHQ( zQ-ss&H4BKRL8!y9GAE{CwvI|+FFuL{H444De5Z40l9nxxuEU~hd{f>YsY0dMj*Hnd zBz76LuAjCVcEH(y&H+|)VK-Pp4=-7{L*is2i4HcIkS8>)kwLrTpStmnHy%vvfH(bS z8uV`CHfJe(p|SqkCPOzV@*4+=q39hWGWWkf;s?UDVA2#x6wIAjmZ|XyD|fh{3btj< z&f4-V8@NT8B*EnFFeH&M_tLT@Nme~D-a7!R0W-Eyou5MdL19F6Ak)yUmI&LCL;=@! z#7)R9;uIAfM*KREX;z6S%*|>#bMshhR58bj+A#7hj8zq&_5m%<33xLmSJkVTDt?Gh z|Da@=GDRL0`S$PN5oF+huyNN|VX(zr_k0fI%45Zv9JhDL%r1P=s) zli=F8TX46=t#Nmq&N=6vbLXyEGb<1CmV$@s>VHdp^>3+NU3;H5Q{Bm4_;BEh`NFdv zBRnm23;6js^9auZ$Lcv1tmXJ_dK0uI{=E*h03Il3=nU)k$$v$j{wT9QpG$2M)b@yc zmw`6CtoQ3NMP9^>+59QFzmLhI84LXD@67g?@Ht^JepJB`=e2TOeZ26=`$u@ho@Kq+ z|7QRP`_4o}&t1Lf1>q{(tvhZK53Xs3Po1Lc zV_3c{?gLtYrB;IA5J;h`m3I_F3N6!oFb~(E(`lK&!|R#}yL0#n-8yEFWGwLra?&|G z$fcP*hg~Oqz8pJ+4K|-Og)Oc4@ID^4HAkK&#I)UQw|lNsEB!WrTjAxG+rTTZhw*t+ zNNFc{<$U_98_93m9jIJJFX-yt>3L5Yb)_#Zd$T4lrAS!8{Si6*II4S@wCeElG50Ye z74)|8@nffsfaUM6^d8ywpcm(=w=Zr*g1s9He;=EBgzkt(Pd+?oT;8VLnyJIs=Re~8 zc9Py*L{i%O@ncD#Ca7 zsE?P&J_8SWQ@0656yNLgpr~g@IB=)>L^m(#>zXU=g_B6!Jlo`RhoY8JzL%$GQauhs`L%5fg)Zm67mICn)Pdh*5f(qR%6 z9*;raPQfk%2+cNaK8lZEYtIz7`9Yd)J>)g##J4cdlx1(Llxu~HHXpCYZ}*<2b&$2M zYh2A#BulE7(@J_R25Au3O@wE^5Y-jc>|=A?H@l#viUnZWH;#MJrD>H&xBXoTv%8W- zst5QlH^3RTW=jv{`6Z{P!mD*>S8oQ+3rh3B;9rMO&whvJVz*v9myxgz_ybZhv*QTx z&xOY3QV$!LqQD%QNn}A%z6R*ZbTk@J4*Pv|)S6Fj1smbUX&i4#Q?zfg*twjlu*(6A%;lE1?W_pIk{g4I~=Ov6=JlqqM^%iofp&|e45 zyY>KAWDGmuoz}nwAMJK8hA%mwIeHyA@U&E~dtnEuK|UUojMqt*&eo&V*zcN>c3Tw& zUCbxo#dqgu`0}W66PgV9#Z!8Cc3Xul_ki=L2e08SGY*G&)E{45s=|aW&l+~q#g|&3 zHy(4S_7Bqy;0-WI+vC-P!mr__E6b+0HR7!`gjZ95BZ=n6w8xsq!ylI-!(O^FTo5am zPsu$1HeZSTyRLJYm1vl~99$Q>biUbi9}@qbPc;J11^2;1)w$k$2YO@lQVLArpy{;n z;GuaOX9NUzpu6#@xCF4@BFy8YLG?@lhLj@$7=XvMt4I2sN3(uyJ9F@*gWcZatdMWo zsllTU)#Jvc6{dm2)5p*Et)ITb>#}!)KBkVthbz~cpv=2|@0Lnz!Oc5PTEhp4&yQvz zk2MYMkfXz|2y-`&k{0khlDJ41H%lygD<2AvrXYnm`CWJeqLaK|!fUkNxzmO#stS~V z3yhj`>UY0O^i=(lTk|voCnoyRD~hqer}e(Y;V#MSri7xG0t7wnynI->ZK1ufn_sG&hZQrs*LMZIXqFan!$p4i zXaCNH4~W6L_4{kzp2J@R<)*Pv)o|8OQWQ3_v*9o>wlg&0aJPXs)bLGI!rk7$$jZc- z+R((z!d8s-u%U&P+QL|j_9LGXP|04(#N0v-@G(8k9dXQ`@au!(o+9J;%p^G`|@{!)EY|fsHN;2O{n=efb2#ma3V)E6`B!rAPhzy@ z&d&D2oSbfMZX9kr9CnUooLoXeLcgQo=4OX0*quCVoekXCZJp@;8OeXeBW>bji2lnNg;7d#aFk5`bF`lE%dv7MWfDChqS_n(aX zCrT4(17{O)I4C$GE_QAqRUn@*7oRYXkmi32|4-5X2(DyjY+>s0e+n)j%q#e>;QvkZ zui&DbzuEjZR{yvVzfbdj9RGhYG&cG-LVFiS>wjD+V4 ze-rs5xPNi|#q~!7{z&}SU4L=?5rIDv|8>`2Tz^F1kHml7^%vJ45%?qVUw8e*^+yE$ zNc`7be{ua0fj<)eb=O~9e?;Jq#DCrO7uO#V_#^ROcm2inM+E*z{MTK7as3g2KNA0S z*I!(JMBtCaf8F&L*B=r1Bk^B%{l)c11pY|;*Ij>c{Skpb690AAUtE7g;E%+A-SrpO z9})N?@n3iS#q~!7{z&}SU4L=?5rIDv|8>`2Tz^F1kHr61cRl^jdmkpY@RvQ@;BR&C zdP(mB0Mvjt(l1rr)ApJ?VqWxkFkbY7F5e%XbBQfD8JYs@eGyubkkMk6m2`Mtzh68r zd5+yBV;w-p@4As-Zc&_|uKOm+KH!TFSYJx@i+=0SiAThCuB4=gG}Uf6>n+&KAzXnQlTDptb#x z_%pR39x>AAv>hQWIk^wxv&0^6QZXG;&RgMcmtA@GPD;cE$K9;kjbZO!FnuyyvtRUq&h_JFJ7Ab#iCIthJVBXcTHHi&Sqm}lh^iU zaB%x9IlniXF(OTtZp@8TFnaiU!UV6y)`B9>x#Xk1;6$mBScsLbZW3mBIj@e?87Yjo zv{VG0t?}@E(-wEvP%OsFc#2$td)+*NReL}>%n#`()nL!Vm(Yol0^)@e(REraio+Ih zeo~%{kWRIJ*?wwaDLnrU-Ni3pfnG-I9al5r_|EZ6&$(7KE4Q2(8w_T92~ep1r@ zwPuUg`NJ03&f74Eip*l1QU&o%$ysQer?))CHke4*Y&SJ6Jf8$tb_q1{-kem`37pq9Dr#$2Oz3i}WdGUofVri+wqjrXYoJtf(V#jdakF~7P| zf1G-APK=CML(l|4Oj@i*jDJq~)aahZ2?H>R*QH6PEnvh*nD!DtJ7ffTO$6l0!cIMM` zZ(YCYiJFX4zt^8-#dYkzs| zqFbL_QLhi#^_OHBd;$cVWE95oA7bA;?2APQOL?Tp{1tf~R3GDG=@ZD@bm_U$-YaTm z$iBJ%aMm_(no7A_044NX1yK>5rzT@WZ}z+H&bmU;pqmZjL>{HeKcreaC1>2_c)3db zEILod;u7;~du3CCe|U?{5X;eG5TCvg$7cDsJ~qdl$-)Y%uF9>%i6j4!LV5qKBKpl5 zx8okc4&TNKx(5WKJ7PnI`kHs&alc2fh|UI@Jy$hJb7tOj;L0^~^J5tN4Lri#5feJI zBlpyKagPDx+5)X!c?{?bus^HzY>kpWuU?d1*Eb?%d#H*#w^Wo|7vRQ1QjxD@D85vX zl>@QGWTMmL=|HQwp0J*BO<2A1k}%q9!=D$STar(xB8O(YwpEe#B)o>F)~znlSHz>AR0tuK55@xfCzUMnk*>0HKNy$Yl-AD zd7!=vN)9X^)3jlL4t>G8U5*jfGv_0Vyhqor&+p}Uw=FQc^eb^s=@Rus@@_K~2eg5R zbVySt&`p!@3AzhjIq<3A*G2TXhxgrw$RuNB++yFHe2Z-yOC-Q)F|l%0{aHu^V`b%d zWCWQW=cjM{LNe2;iZ8=5_;Zkmaj}0HfmU};lD)_40|!RD6=vB&V$yjgV|lUjVhAmA zDYD;(@D*#9JL|lG7OP@pH|};D(h`~`*LdN7$XiR}kFbQQfBfn}zv-*w!w~fIQq5qR zuH>bIB1w3<@}>WXu+n}DnXAM|xvTG$rWKDdeLBpb^;h|k4}?ZRO87O%;{M8pKQ;%H zBPtq2A4pz5Uqu;~L%&LEb(@`xO1$n(#3C@c>zW)L1=zmU*h`Jo|5|;x-^s9UOWIOZ zgS0YUa)>F=9skDM!8${RCsQnZzTCNwcdJpJtEA6s*;EF(%06LQ4PB~56XUD zZHx#MD#O16@yXhiSiS~OLR1*B-nbkF805Tc%}11tp#R3mvbbRV9_Yxk5T=??5yKj*%yqUb69-AEEK6|Ou0RsTTZh3#JD7m8?h;Q z@Lk{c>#M*W7ig{+21v5=;(p)5zhzb!RDN=qxqR0QyeY!X-b3(;ilfPeQJ zT|q^W#BK5^H}hX^bHp*TaK1zwr7N-FSa-7+;a6)tL`PkR+O0mf9sO63x16i}X6nbC z8w{IdTA?^NfGwOGfJHDj^0;Ot`j62WQ=YNgm(yS47VoRSQC#pF+os7f8xh1&SY9I= z0VDHmQ%Owv%eYJp8gNg2R9nW+q$pE~dzgY=rJ#(j;=#KT+x^!$gCb}_ZQmQALvy7z zofa4QBVgt+424TvQ1Bk`@rN*=Hm(-LIX=X z$Y<^(OeS~jlrio|hg+jTJIVFzb~*kp69wIdN|?qIEXc)+eV`r_YE2Rl7L+*BmhL_A zKm*&l4SIPU?hu8ntU6a`r)tnj+43#PDly1gDy{0m=G923u4n+l>{Knd_+jR2G0dQP zq2n~^<8cSXc3DE)=ef_>jHvg$7VNl`sxiRlazM@NeBfz%?R=}35kXTMu5sVNmEFi8 zNs9E?*D6VEM0CUut{?l%Z(Lr>3hs+Q!)#S>8@ys;>Ty) zxS3j+R<6Yq`$%{p(iK>d9=&{=NU7f+R=e-1gKpNht8kN2@dDZGBv}jhDN8&MQZ>%% zHO#FIMxi<~T(-4VHJ|kw?0j-U@Z^%Rtc{2X25s|UMwqc6YYR54HTn3S3hxYtnK{aS z6-!kUXgrM)aE@tgeL8Bq@wK7q@|@og{h1fYTWrwuQ4VB;WMc+tjy$$4L%rF=ufstu z^IY3{*v{i5`mk>Pnzm-be5}jw_Hqi6$c|cT9Ocs_PH4pI4_A0mKj-+wKUD7h#aa`wEtvl5TS7K2) zH*9MuJD_z<39Ormji~Lw#gDZtNzG%DBv~iQZ2MP?G~SH8G5k|YJPaggIt10lZe7V? zexde`ig;1pn3^02p;8L^5$ouEIWPQhQ~liNx?z*$3U*1QXie8G$!4)u5uM{I^CWfQm&PF)Z%f>F zx-ExxLA$0%lMT8tp8%R)l-%;{ediD)!uAaxQ$m9Qss|v~a}VXWjIgaMbRi?V&B-}; zfjwnlvAhuekFrs;x3W(|YY4(A3g_Yqbil3W#^FP5W`~BEr1yKxiAOk)EV+`* zGu<{cqlktO?NWV;&OdA&gRe*SA-Nac>hZ#B zxRdaJ{(XH$VH12z2W0D$3Vc|Bjmz1Wi=Q2;)kzu+TLe$w$sAX%ce2u2-dN1G-> z@Xl-UuS~1HTCIK{gxs_^jiI2iW+z)LJrN^Q>cek^s~J9mDSpZAOww%1xv!#_hxY0B zdedV*e@fo`qDIJW_d(BNFPO$A$)C8A*C;=jp5aUKwEfUlLf3$Y%SC1->RPgslsF~W z;9Y43H#$LOIoGM1Th5_(S-E;0PC)kr1MQGXC*2Tqs@CY*t6G<0d#16(89Cr3PTDEO zqf!$0RckYg_dx-CrQFQ>t0b!QuEz_7o?|_*J!#90pU`|0qrcW=JaERE!n}6jr<;P<EO zAbpzTS2S7EBQFp)HR?GEzLX2$nL&kJr$)pIu_guYre@J2if?IpUDRP?c~Dhmj0@b+ zt$vya0!oSY-_=`JKzP>?U_Upq{+;e4h+WZ2p;-yp_@cLfk!T7atl7-281(9a>ip&o99)J+K1K&`;CteCy-9Ipe1{ z4N+%@?9KuW>Z*DJ+>LH_=q=7r%Dc5o<+W&^1H!vw#>+J~aR=nbZFV)UyIy2dC-6GA z;%oIP3XCy1t1K3ZM4J0kr7hV?8J@8^$Lgu)*nIkQj%l$$%&J|7xP`K7tv>NNa>S;@G>rC`Z zIg=$)9SK%WPp@rYJ9ED3idesW6S{=X9YKIW;RM(NF`l%KiE%n>g$SZbGrj&!ktz_} zvAS_qFZ~_uvoyEY`J{;#EK)7G-4mvLcY_ohxur0{V~I86O#7pRKK>M9_VIY~W71&7 zfzvS=4!JUu4H_MFLV5Jp5+gN@Gf`|%kRu55gL&D_VGHSWc7TB4G58u6@BJ61MeaP(5>1+!gIjH44paDxxBrJKuQ)) zDjGY{n*Q0t%ZM5(0{jV*V60DL-Zni96$^q`UzFE2ObUA@T4vletzW2%eOg3pqR{FR zR5W0`Q6@d4=%I6cVARPNvkH^#IceN(U`v}9z}(%ND3tf2Q8S}vfCf$AL{Hx;NB;w< z%3I-@dW(yQ>FGqHZFH*w-ssS8$um)C^*Dl0!u7x|=suoPo3rby(^P_As2#X(LpLZA z-Umy}9Ygf=+CJ*)a1(-;#EJBBD#lKNp4>Q$#&d|6gvskPv`ShVOr*YlGQOVZES9`S zo;`D7ivqQe?!a8MRc$0_2#pK`INZL#nn;x|qDC`)2{G-mCItj_^df~%<@Ph+mEJ{@ zw~%=kwT;H69(?3n<&_%=Qr)_wG4{6g4(DLp-$pBKFoF0b$7KH6h4-&%MCj50ry)rK6D>Na{sm?eL^N(j`wMw6-g{tQ+y0sf3xv#(v1?4GRtem+aDooDZlEaX z`=Q;Fclh<_N>C+_;q3Kkbx0ao3Zl+ifh--BmPG_6FM&0;&zR82jY~;$IYTslprH{7 zt-K*Ew|R)FyGh6uE2mxuWLQ%)^{=);w$Dp>l$k|VluMzd2M-Fcuky?h;;)mRd3K+?k#mV(d_5oy#=N)}_!?=J zc4MLFmY?Sl=eL)kK_GB0L5>4;dv7iQIaTIVd2nccZueF1jUzqRL+-vcSWjflk_q*(;0!8a1DLuSUvWF= zgaHMSy>t}im5a~ITXZV-MB`XfPuB`wUQOojWMXC3|Hj)L&p!vsG(g+B;zyU zt|I)AJ<8DBUif0KAaQh$!+`SSMuHv#%LbBE;&#{FQIh1bw@7OW)-B;hJJ8DRJzvxq+w2ao^EXch26f%fnSk&{`UU7Gcyfq1alL0N& zg8O9pxGQ?ex@2UehTUd@Ot(7M&`NB{%Ld)YWv*Lt=c@Q^LB-dRDJJNvpij8v-C2f{ zdx%KoG@WjjJ~O*B$}=1da%!c4;6{}TpEH8^ixQ>vZ+H`K1}|o5%S6!lW0^G?Tctfi zF#}F(B^ow#B(q~w@y7&aF%>~iIf$Xk&J9@fZ*UlzfSu>@>n)``y}WDO2ZB)%_kxI1 zvDL+m8U(17)D9GN-1xiO%(0Ce!?pYbWN{UfaWXj2&;$_4C}U*xspOqT@1#X_jESUA zWn>YOGn5?&u<3B;F3{t3NxrGkMwM)M{*9_jQV{o%@aC;Ke7ww{2U9wLcn3IxOpIxb z^h;NrpOCh1c7$K-J~xT*sCar0b6r5f!Rlo7hYXdWBk?+^KnSgmlPS8-`PgT!VN~pi zW37xvHA+SphTH&Oopm-hII<+By?}P3pLdYVzz0X@4Dk}DvZA^563T3VRJ2G z^P~P`mkw}P^qVB>?r$Mm{M0sz_W={nss;zNxV7LfxT@44dUncSObLw1JjO|rJ<%kN zFlNeo&{*e&uPts=IX}-*=tXAN4uQlaNA@0;Z5{r|SJrH7`_eS8*wgS_YquKcE6spU zJNAmu{zhm0o8YUOS!wC{L)Tb?7#|^2LAQ(QWYPM@jswC9%)TX_x8LT~z>)oe|`syowx)S;KX@6i0M!%w}P zbyFB6HhvG3*zm+yO`zbTK-Y<@v*$ad$0~41t+%ceICa_thBfw{qB0z5WeAE_h(`tx zf9mEBku54|5vmMn@j4FUT0+HET-NjA{^BCCm4Q^Sk+oLpb)R}Q&*|-LoWcup#s6YW zJ#`TgMDBzOzRP#eOq`+ZR>yBTQ=oaEQICbfDg`GIBtnSnM%7O`U_ z)&*Z>+cvVykGRjqtk?%C(#mK0Wj)Zu@LBfMn2Tu^>hS^f4R)pj^i7y7%{s3hEpKW9RUXK=LP5`qDjf1+CddR`wRJ?V9>=}S7C^Qnh)bSzLt~93)OA0{ zvJM25Oluc$>Z!nJFfM!~Bgn$7NtDJ~+?vX~xec$C&T?9Nqlux^sAt-w(M44+ecM|= z4wOEpJ8DMhIONHlEmspZp&J$>vvJJUNuhvN0o|ss7B7dzu#+?KO2002>!;z$Z7lKd`3J(gY6Qz-0&cla`B@{DeF4h0F%k@1|)0<|HM`9*I2aXWW)K2M~E zPY8R*sBHi_-l+w@*g83NFaq3m8@Ih8l0szKf`N)hP!i|jwJv~Q2W8)^d0kF2Lf8;4 zvGdAIUwNxYelo((Pf_yx=7nFL^bG+5BZS{dOHiOZn*}7W0rzZaVaOZ(p8yL=g7+Lx z+3K?=tT-0kdiI%2CfwNG+&i?>-vO>&8}N|oKbA|2EHg%}P?ROdh#DWNDo@*0HCRGjZwP^b^$GdcZ!)>6 z(i}-D#P&f59*eTK77F`}B(}I&ZFcq@MsScvELY1W<-?w*yk zVCK#@kKsO_3OvO&G?O7i!{Qe~RU(M}g_0Ft&SxkEc!tfr%=uQQTR^wmou4AD)6VB6 zAU7-EMmA$k{i>T4<0@PwDbj*UP%w1qK~eq_R!9cjQR@%mEGM7ybGy|_8rn@jUrO&< z@2Qr3;d7(&dvB^pWt^@LZ-n%Q7DvpZ>bBbm1Q* zF^wU@^bfQN0(-1%@FYWh&?YtYt$KwVO1Z?ewV;yK{4^$jDmA3YZz?Eb2hK;`f&K8+ zwxG}KSa8*$`{zd;hhQQAP)sb+^AM*yKmLh)W=XpDHm2!Ca6PR_{?pO<`x_}nhhZ>Y zf041@uUC#s9Bg*fdf(m+*+AfB#CBP^9l&19H^TYTY22Vyo4GD+da+Yez@N<^3d(-D z_B3ixLB2$Y=eEJYYpHBaRjXee*S1|8Yn-%YDFT-s*oX3Ez-z2qr2Kh~DfNo7bGELa zsvVb<$ZEqg(9x3}dW+5AyK07a}I$p#%{s@5#eM{KqMpg_K7u780A4(Go4yN+N|4mqZX7kLL zLIL9x|M~+oDCT28!X#f&QHge9QI);bx(JA zc2??CI9Fy>I1R2rXUqW>kO&OBZxE2dc8yZ~od!pOJFn{Azzd*8KyuAy8my>KV#QD#Y-9R`-iD5>c;{Pi)1~ z8TI18_uYLbV^RGsn&KBR!NJp(Yq`@yD-F@2p*%1SIj!M&X9}|E&F9YIvC(}xjgHT8 z(!H>kt{ysm$Kt+HTfaf8PQ=m64R~iD_R02P2fz8YH|}bPj`4W?l(Wsw&A6@$!z{s3 zqGSfa_vh~C?vfBITi=*14^#2s_PeS^UAsva1Z>qpgT4A?087msU-g5wxLp&ozmt<^ zO>*RrSweV@6Mnz9+Cpb;jiNhU7AOW}ur8Rn;MXiZ;3v-~pHJikfp$qnXLRn`=}MNU z%79I=lL)gRq;Hj!SLf@Tm;yJ#uK}~xyrhEH15Ul`CxTw<#HKjp?d>0&3BE!_`~z7( z=4caC|7;|&&7ZV1df4GR3nF)GJ_N^lyYuR8d71iF>4l77avB3>1VjiT!$;hh zYj>-l6xO_{Oln!EWW^GC?{mw&*NGX;>NC|W28c${h* zpMk+npsXkvBdHV!?K(!_ve%%RwI~ti@LDFLa@Gpu{m-eg#ktPDInX=!s(Ys9jU^KU z)4`4lNHg>bDs|e}2_FywG0XCGe^=dmIpMDe3nsOham+?t=nrscpFMqYWWVSL*!YPt zMAP#!z*11c)Y8P`U{K-o>cQyk+MFg*;2h;ZDa66XM65_4db5wus_szif|qbSKD9u8 zszrBI-aOzX7Rs0GuotQT=WgK zcf3bm3)mFNhd#Q?4_KRPxi~16CPUlf$9+K<@(xId=};VN=!%b zq<#M}6euDPtSugWAB=5Oy|OYe>r~4t5pC74V2-xgPRF|R%PbugMvmjPM=%4ilQ4yC z0>vtcv@*LYv^fkOXkY3DR6sOsL~mCuR0}!0FJRsXZi^m7%4xMo1THQfeq769J<&#w z5BGk}&W93NveXBG)iuo=qX(Jyw?{WAA2+=67C$C!mVQ@d>mn!jQfO+1k&%?6rP72G zSUu1hSALoY4>uLWvnGE{mjN5%4=NMo>k0W6PAA$Qw?8ogFBJPSSA(fO8CH7i{mOSZ zTBb>>J>?)50$~!IqsQ;6RA`sS^qic07=S+++KfB=U{zgiZ}W+pj+8sfpA9Jt``s{t z8owlD;R`6{G}&3BxA>5V%zR63=1J#R61-+uKh5V75)1S^d_>DLGqqn{rm+^n8!Tve zu3c|0u6_^-Q#Nw6e0n*5iKjR?px=^94v0@P7ng88@xT=936{7)A2@(Ur_2gXTB{?Rv#r2d2=5N!UIYrvS@ynjtV0tj zEiL_ZB1NgV{^J+A*J{TljS7=tuiw{QLjbj&!>F73JLlbGwuFr911|IzVyjI5DEljX<3nQbwPk4Ga z9Sg#)wOzQVvkssQsLj*Tlf?$DNC0lW_dQFu*KZACp2)ipH5t6K#gLq4Hi+pr%;RS_ z!P|iMl9nr}T5$ZW@tP1~Tozijik7p)wEa{{jDoa1?LO{VmTSDgb5c2OCpBX%iu8!6 zpdn6?c?w0Wm1LX0N&4y+VFU#hyj>qh`NiqX*O!=K_NHG*@WE;Ni~t;!eMWVYhdW0rx}d8?9uEfl{(84>2uYe z(X*&YVvF6Umr^t=0#Kh;H#%_@rhq#iUUAS{*N9|d4fWXf8esx|VPF8}ycHZG=S9TO zOJ@U)91#)eTdEo(kWjI^V#@VJK~3zdd@rm&ocS$oJFg3lejJHcc)d;YaS-7J<5Bz9 zl$5S=t*GoBW#4jN3n0=LB911&h^1YY1`D%d!N#pV0CbNK)dUlaB5!ztibMWo>DZiK z%zkKvFBM>B&aZXi-dcC(t&sbn&GYbq`XrZSs)?Uc=$fthzC-qC+34+R`$n&eSVn*5 z9%gxCZ2{05uclthQ36fsNPTheAd#E%$(&kKtEl4PY_>Ni3e5>;JeQCg0J3oIJ;A{6 zJZRb+l>BwkNP0SJ{7b)pI^IfGNz>;k3A?{BfCvx!=WZT+_BjFktu0es6{gjw@#yD0zQH!i@(ax^-V*BxJ&Y?W<9AqG)3d)`S?dZ$p}lIX#!$7hH7y|&>d77kBLc&r5OUtL#npmX3nkiOdv~P@OGU^-&IauW)$caRybm27E z2N^0mzfAm5E|t{FMi1Iu3iX!@YJbY=G`~aJv=gdNwc#aAPG2O@eyir7qlU!r9-{>M z$uQ`&QMqyBD0Znl*h$Mk1G>sv#ve6g{={%$?yz@RdFr+Faj0}@ zrnMtlBJ}Y7h(`3T^NrVGFwWXa&)d}o2`^%t*sDDX7w&5A(EemfTlKyXgVJ*(K+iVIZi zMg$|XqAA%AwR^yes}?b~AJ%XW@Gff^7jrO=sB9QB#!QNhgRRfw?QMBob?EG@&|V5O zS}E&iu`*feH&^Slh6Q$@^kM4>7$>R&P;!ub3Vv%4R&7aA4H5%E2$^xDmxwH`DMJ>h z&MisKHFXTw$~q^|O2`^9!jq zAu!^Zl_?+xjcgERzGL(CgWm-MF;hr`>!$`ZVh(^&DZjqoDal4Hx2|;9CnJ^4cFxVQ z5b6p>5(rSWtxHn`zM`~Z?H6>uLfcx!Ho{C@5LceR7T-|nmqK>M_lt+rfb>(?r z;Z4vMPOV`>)+v)Yy*@5E=7#+9`z7`Qi`Vpk7LEE%h-)AKmKr|)2fQ30sfI#4}yp{m~xDPVGTL6cRiT>LC z8Kva30=kUhYy#azj&c`(Wb->r{^i&v(G5p*fxD;)Dc~@xJzy{O=|*}%<~RoG95Ik&&-^vn#_?ru}%OCEkO#X(B!3eb|FL7K?ZuJUYMm-TlzZ(<-+|LE|r z)9?Q1Y1=*lC+$TUnP4^Ja}>jd1dzpEq9=(xlj!-UglX7mAo%y^myjg zDS3Ci_=Yd4n2xz6GIXYS7`W%6awwg&zpaRbVrn=WZD^uNsl$UEoq2!^le=iovKr5B z_QxNOt|^s7)&jX%u}Ygae`a_lO_3*p=9XsWYxR-CsB%H3VIy0;)ZlP$aXB+4k{{?Y zN1@%sjnnOG+iT9ixKmK4wtniNsH{wrI-D&o7U?A(J-huzQC&W{D83Bd;Hu~Q=N4j?%F_EaGql~dHsrehi2p$y#6cF)5GG^92)bHLm`5_xyPv6 ztG+oDxwdyV9p*m0ZD1$jv--Yf-e81T177T5iA(aK#%Hy!!ySV!2Q!!UW#FCo?_1;_ z`cO{{HQM;7+JCt~Q{&1&eh z@5pa)4-;cki3QyYPz0)kbXPBI>#y{g2>P-?D%?rFxso*>X6{S@`FQ*<=Z|$U)3l4o zf#MzCT^YL(bw=*kPizS9$vDnt@IpvKO0RpOR7yrwkc)X@G`ypdv0g($EVUeQnrD zd@-!}E43l{vfA=_?kjs)8;Ho3wGB;De^_63?W&6qZ5%ew8etN%W^tef1j|AgFXQC=8fs3$en0Vy%_s3T>(QC5U-&HyKz!uk- zz)#rSnUe?0JJm1tM9QeJec34!8rEhI;uX5SFWR?sJHKEN@Nq$h-%LQVm{0+38MRLW zNBZB*zujcexo$m$QZ!zG%IY}dqPx#~=i|MMe3=A3IlX5!HK{v~WPoqar%uy5ZbuHU zo~rZ;wV}LgA}@wM!$^J2_U#Fb0=XX7Iyw;c$^6o>T`0x?A-o^>opLh{Q@Z;ZdK{R_ zP$z=hzw=N&q}q)A+uYOm)3g~mwq8#wCmsW;-ViW>v(kKPd@TbNZgG>!rhzbjQ-5KM z%NHB!s->U{r3h&=+u!|r0RaT@0M5n)QY8Q>5{ctgdh~;@Q3uZ5-RZSx6h)d8Iyj!2 z+=O3}kEr;m=>0qf6QP2>RMbl!-)b_Yd2^KANBH3Gz!WQ!2vYnkfWU*{{up6-G;Uab zgeq%OS>Gu8ho~foX55

      (=G1hR&ys7^LDvPP{#Mt0eIl8m-Sw#T`jwpFP^C-#Ti| z&$VnQ9(-;eRa_i`jwuujt43tl=1bu7q^@n#)za*KxJTU({eJVbG48X&ocR_0Mq>Yq zdC(O=eh4>V;9WDmjP-Y9YPVB?RLVIm@Q+=(+smvkB;VJO4+k7i6?bkX`b&fQ75K7~ zC@^4`>QrNd+&p4|+wzniXYYqzjy_^=wjd7qHC0y9#OaT^D1QWKv~GccvQu0jwYP)-*F_oWB<4e)ZYk-R@bm~9e##A z>6qMy!<9f~_*E2|;ePQxnVD#VMnk&|FhUNLY^bi9w(|R8XhHl z{1QMOr!qcsBx)U?$HKaPT6=%A*m}w$&}z->UYg+EDte*xc&Q z7hyKoDnAS>aDsEyD>KGi`t6tK^tW@-_*&yHPPP>3x^a>H3+nYV&B7D>jtZ6%eojSo z%NaUoDC1223}1;+knqNc$Bj}}b5g8+k@YU>hpOX$gfUIT}o z*q33GSeN9pr8Y`+Fn!71}Xp z1a^FO06(0u&X~*8<70Lj_}Tp68DIkUn~|?e?Mzv^9nGi=uiVTDE6;nFmC;f9+2qd- z>!%AcJgbbVs)kqgqRuBmY{eyOH3V+*yt>8pGkxkuQwc9T*q=F(#GjIQ&|N|)ykN0$ z8cXJ@9aOhDJCehkRoct(1xnB{BUd{b`v+ zS@YEiF1gyI&>(%CfiE1JfTqjv$)|0I+w*`|0=mPO%j!B+UN~ygfrlROaoMWI<=PF8 zf~n7^w#mADo$0X5)%v5Q3m-3;#3{!=aA zX!&Z=?J2|Q3eaydD zUH?Jk>rIt{*|FY<%+JriT>Tl0M-Zn{dmkkN6oF8A_sb5tz$=FMpB!mf;VO38(nkBj z@S&Q|TqwhK2K(J8bE&Dz5cD0Q)Ee*Vt+`(P_7k&ll0@Y=W_%o=Vk4vl)(C!$-xfg!-ys zwb{aj8|%1q;XL|-A*vHo;0REb>(;R1ZQ}eJXW@BGY<4y=IT;vzh2GbiEzDoOgw^F` zFo(hSTBy2Jc+DVve(^e%uD*5;)PXpT_9J) z%jYiQ#>#cnYAy=-9JabWEG;jivlXzh58nGBl*^TX0s9`9>*9@bZ(?Rtc&#=rUs*t{UdNu985}=xCpI^`C|7du zeIJ#Yi&nb>f5`FJQ_o^*qKjjx807tvvbk)Ev{Fd$D_}`g68@v=E8DKzl}=^3z(Rk z!mYR6j+xmxcz$$USF0}i`3jzS?IN1%*Rgkc3Jwcgg4fn>pw$WXrrmS@0}30cR$Xjm zig^09i}2R3W5RV&Eab4c)x+ZQby@EHAN&wzX6IxX-}g|h&)}iwPa!+(BkKT@6BD?x zv4Li*gT1YA-;rSA;Sj`Meeo^)+0$dZ_-zZ{e{CNB_YTg8VWd?#B2!O6a9V<4uGlYX(gR;jv;`J8|&z_0$0p@DR70X zP1L}`@pBl*a1h8l;DOf)4?p&>zP5&DV*}k@4{mJ&rBYeGeO2@k2;S=1@AuI38ej-e zdbv~$ytsxO!%!2$u!D>NH^ROn>^l?63@71m7`$YYGeCUxrrmC1Gt^13SVFlX)~gv9 z2U=be{Xq`^N8POKRsHsx~E)bzBJkCDmJ*l42JY+!SqLw#}z8Ha&84lv~4hRR~EeE!`Jv3>#S{;*O{%GZBMI6DL^BN8G`aRTYb(G3w zR9*GW%cgK+eJvcXHcF+y4f*XX2Wa;W!@We#KXUJ(_g;Ozi9EEJY6CIYK1{Lk+ub~F z3rO7G!NYg$aMi0x-&aA8H#d{N2cqvc8ENZCvf&txV>T7TZcQ#@yPUo7dmtvSF)Ej` zuf!t9^wc!+xxgz#Pag~hL3%!qY(59i^WiuQ?N&?XtJP|Ox742LSh^Q_Z50Xy96Edm z`wkq$;X{Xl{RIf$k;Hje4rsSq$T$q1-wx-4kEy9?Oi$0?mRoN_rCfpQ*5ul{u(^3n z4+9Q#HoKUfoIx&EK&e=U@B0{Xz;Csrmz$VpoCDcx=nWITl0|sMMLz5;zzGnxSnn;B z%RzsqrZE@{Lhmgf3_L(*wJLJCET$%>u+?q@U}*U*4EjAZn?5SF8uIx9rlzN*O{vvt zh5LwteH4r_96WRg`}Xa}+`c*Vwl;$YGIKCBJ&j_a7?ks)oz#5D;rl)&_e`T+pTaH2 zZ$rI4iCV1|vqg&e&>svi6?(U2b2;Pu$mMd#=khpu^DUU3nn8Vf5BydO0}gnNrt%hC zJ#P5seO$ihV+er3!Tv)xVRmK?M{m9r`}ZBdkz>c;I2rK45N*E=I2p8CtzdqH^NC)c zZmouTeFC?<=Qt|mO29^Z54Cy?`CJ~;)6>y)p~^*Cx1 z6H2+HvblU7`wt$HJI}|qc^LX2V&Q$o5a0iiq(ge1%No#j001BWNklZ$Yif1f^UtpDDd_Tu+{@k5r@5knU- zxrr<~a}rNoie!eC{)_PaGnervkH2C}yZffS_}$NbNM(7XLH&tO$3QYBL_gA`iw{uI zKBP(KLynBYvqCA8~{8-&4a-JP9_t1o`8c70p^7IV@x^%aL(m>!RWZ~kZN-t zup`Hb^uj}33O1l$6F~gay0L2#v@M}84i?JBwLJ0~X9zikRv(Ygzi3}i$nL;G*@s{m z7O+J=1OtQP1h$b33;LDB*jdOJgWpW)x9p47Z@s*&e%rOHU+cEAwtL-ALeTHuN%_S6 z$YJWStt<=g)AHNIru`V=SYaB?(TH9k2EDw9C9?<-BS#qX2uX_X1T;g0n#e$qjMQ}` zWkOcA{U;_SBJ~!^?Qiw)=xZ18|2%mHzw?zx@%WnyBfYRpdI2}RX!{HEqvl)zQqX{rZc0!YR#iMy3(NHsNzv)Y_ zB0db3Ii%j1`VDk?9C@`h0Uo>~ivegghz%G0a=$Mc|`ky5z)2Fuf2F4fBw|##=7r4GAkK~T(8yg&?l)4Q7ASJ zt(?jJ@zB{T_};6RaQ^y+rN(%;`=(j^?&m%f=^Jq*9bjN1-f*$qxMs-f- zyLn7F9Bq&oi}DQngCLI+cwZUWk*JB#gu##lVSa&*LF5-~N|7xAQBplcuF=ezCpe)E z1XP^?(b~AkM#oaoD-YNPMZOLbF3>Do${U4;cR%R!fie(!J=6U1_fI$j(dW66ZoBV~ zU>_nxHV~fhw6QS`ir{IiujNzbfe0x!3G)DrB{B}8bKJU~xC^!GCeH@i+1=ooALU@I0eikk{hC5h{jWqmyvm4Ij_fQ%Io7PuXCujSEauOlum7G zKdB7F)(6Tkq#atD`$=|S#t?X6DNi4P{t*R=+Dz+=X`jyelipU2J_RWQ`RfJ_# zEPhTNYx7;q`N-a957GuA5RQ&$Wz6lik5TJnvDn5u#9Fp*wykV!Ziche^atzCcioG_ zCya@nZ)!{=#<+YB|JP$L<4+zv9elIEDogU8*ohnSl%RUzalI>R!305#n@*YHsB|9A zkL{+5{zwGPBScHrStTN*<$To(P4~izz5O{nPZ6uq4q5lr=ex2N?pdw}ouP{Uw|s!H z0L2Z5f&3Ok9N7@G@v>Y`Qf|VSq&&Vl-c+y3{2~lcIUaGHdY%W))O>OrSzP}r6N&QC z`eZ!`j3G@tPI;4UP{tg_Z(WGk>YcTV@!MJVs6Kd>)u%+Ak(ga;a{(BQ2#X^^7UKqr zIt0R_Pk&Q-AeD*=Mflna=kVuGoiVm`&yhL&;TJv}mw}Ym*8+tsvVYtl6Uq0bXV2m< zpE28D#t9#L&mnyA=kAemI4oLU)^)9ni$LR~Z#se(=?q%mNu8##G^I-fspUG*MypzD>+FKTbo*MbEK(@`7)B6~&{InpaD+($v`*5wqj z^lam!k#^Fxs@Dye>l=rOaM<^Q2zhKw1O^$C%pV3*3?)`0gN=pIYn)#5wlZ9cFwYyNjc=NH7I|S2q+misNj3yqtRPaulb(}UuANhaMW2e{`J`{61Mx2s z3dAVC?M!So^vi*IJDw(=?|XRh(lY+y>DR`xb=dyqss*Jz>3tT;skg7&Y-Fr6IYT;t zm^YoTjibri&Xg~0y6$zA+6#;H!{N~yx@pbZbR4s}2*jMi3yUL~pRycbNYoZ1khn(} z5_Gx9yfQH*8dDpO-ai16G3!jgX44ym$j4@>(OI zaQg7S{_4--&{TYPvD6DENPwwm05ID?C=)PQW*9-qCUslWDH`YL(kWV{K}UN!^8g|r zbWzQyxu<(!ajhI3Q{5(F^G-3LFC!8&%q54Z<3Y3NeV}NVG9a49$Uuv_^snVn#zoIj zq-_eLmAZcKUz!9@~e> z@M8&-VGK2WNJMNvvh+)Rbo_Ki;SppTV-DPqt}`EfeY7SC|7g%dcDyWL&r&3q5iey|5h8o`Tpd^1+f{ACH(m zE&28RAdN0ztjQu`lcmSYyzt!ZzdX)dwlcKAFsAuJ>?5Cbxjd9Y=^W!=Ijf z1>b%7ErTS<;hv-W@CRS`Xe19)QCJK)b6ESVhc7+*I{y5m`Mp--gj%V9|LMQ@Sxi?; zu{4t$CKe(y6SQp|J5ol`0grT}AS*;V(h&>O(!~#v?f|hpDs;?a!_C$9X+C<6vNPE% zw<9Bpf`3$ASP0WN`3(T{>mj<{#7_<=b`&8u%}U2!VND70m{7SbBq3`3dX*lUWNy-Q zU4PK>C$$kP13R0v%FE5?m2+HW=}P~}wIyw0no#=qaB`41zqS!qXyB zCCfL}@r|KAKhn3XpCzvV(ET7gVIoY6IYu)P-KL@IyXC2js_n(o#d(lpd0nJnAXdGI zdZ2#eLVjhB>Vw9l-L`gp##jJlGJt&F)VK_UmR0K1+M+Vh?|8^-l+>&2JSTl_Yr09h z3MFkIChrLGWR*xsLja~H5)5T%0j8bf0KW3vS^U|PFUJKKBiwUzAAbJ}ACq#?byt(@ zy8KDu(X;dTAHVzbwq+~kviP0PeFS$OnX~56btzG&4QVHwqo_$DaMFK0POArFJ`JrW z$)`*Og7k*mke}$lhTcr`*4TGI>AxsTk)u*x)BiYLShTD|>P!lzy&yE0*p~d$6{N{C zF7h=YczyoR_H`yg#YjZQdK(lG>oS>sn^*wM`b(NWdKe;nN1s+d?T28SoCkll-C%Ss z3fa<*hptn-E*c~|Cihp{H7-0pP5V2>(UZbJOvr~KBO9}z$kpUEMb{E#y zpFVMV#|S^4$*5jbTt(2j{4!sP_{3}t6J`6ytdjorPgL>Weg1yjePqsxG9-%75R85zywzIA}8Iomc{aoAhlQUy|S2FUm*=dKUUN**qAL z$H*`k?Cbh^OqhhD$)|snPw9t&xx`okRCWN6d95*FHX;u!bu$>)6OobjUF5UcnG7tE z_T8piWgmzUDnfm_(>(|>5Y(ktp(9}WG<)D_+8k1Ai!+iv)W_np8$df>gW^SXD- zcEhU+*YO8mdlcRNV02~#Um*JjA3A~m?B3g>H?zWy;+d9a8H(7tw+)$4_Gjw534Mob@$1o?7g3dfdy$Zs&wQtBT=9*HDtMk`}%JupfG+9jjF?3KLM?Ki4y5cPhHE>`w6eCNTv_@lq~ zF?{BZqlt3dv}XeU=p!faXaD4v@r!pJMmFOZy*Xse%;$&D7@kPyh^@8Tyn1ZjZ?Szh zBN$m4n@#LIk23;_Ty^H5uirA*%j;|R`hJQeFD#SXiv9_LAJ+>@*nUR6^;u_XicN~Y^*pGa*ZIet+D0_yfeNuEF+8IM< zRL5+wmAnr`1p2fW=$1YiMKB>7T3&=F&RxMDee;Qg7So6OZa#qD|K*P>?T_-t*hyGv zwsHE(5-zO-uQ5NicLHv)fIAQEMZHuoma*zK1ya}RF@Sxg63RTJcZ?yOhO|0j!Fj(#WBK{buORy06 zZ6lgr)T_&^T?-sRJz^fx>q)u(NQdZHQ2D70`dArNtBt$qe(wOJ^1LcSv>Hb zL&yxeiFz{DNA#Q);pXM}h|CQL8?bv} znHV%1At$4;hK!RCxs3_X*w4dtpROHh z%V45i2DwkiWXq!M=?v85l|}2f?ng;rK%nJ(bzV_#GdjQ8dV9LO9^&h+#*wV@*&8K*>VBV{B%#Bbp{E?9*rf9!k$niukN zEkCVKFRSDY|5I#Vblz&^tvU@8^e?oDGHI^^MhfU-GY+$e)wzw3R8E)8R@TTg5SLSD zA-1v8=em?ZL-{7zw#&A->9;nHl$new7n2L>y;3p=Lp?Omboyomef}x=4f<1l+w?!8 zT$}0}wL`s|bfm1jqe^R+qN9<>Ut=PoeMal^HKa%w zn^I21CWKGrwa6p)O&AzKDuzI8BO(I7=pRCYjP2?n`n{S4-Qi@qwT zURQ?30BoK?x;|~l&lD7y^oq2OS$EPK#7+t}G@mN3C76bh>fWTgQK)tt6s*W$xzAX2 zZ3rg&pHh#7L74IzM2Z#EWfXIq&LvwNlG$oyM4F6Kj&stO(Yo|;8D%pSA^IXABBV&Y zTPT9uDblCqj_sYqe}3<6cF8Q^XYafj|MRbW3U?md8`?ZLJg;euhr=P7&BnH3Q9h}D z8jpj_$6+SAO@rE=1ag8vq?EB(;yN}r=ui4KF>hT`@Y>4qM)iU zKYbH{Zu7D2M-Z_e?=zY*`o(vMC1vTSh-84IQY#P@NH(GQx>=1pZ} zQU+9OV}zzR55!_d=EV+}hE;xUuUBVIHhm~I7-q097#KG#ugfHKr?6#OCsXHYl59E) z99IXa7)bC-_9b`$Isk$2zMQv!HKyk{OpM%_`+RB@q7QtefVGg{zveu_uPt7zlFxe4J=;0f{h#N zSh#W->ual6xN;e5t1Fnld=abHmvQ;x1*|MD;qryIaDC|-E?zi~rE810@Yb7HTD*$4 z&Y#25;#FL*#bLe+Z@r17Ym2z_)_GiCx`s<{oe%20cmb=|mvLqO64q8%aAp1yZmh3i z;mT!f+*rreg?Tg@8(3UiK+|htY55vjEgvh_m(gjru(rB_t<6o`SX)JR>;G@>T)W%U zl`#AYaP0Wj+isff|NqnW`Ow%-+W77mbUqk~(J&)~-Ja96SG86m1JYpFxtLrRL1j&0C>M%Rn5<9ya6q;}}K zE~^tpFvfy*oFw9K@iUUW9t1$i}R{N^U_6V+OyH5ejAqaIB6v7l6cI> z^ry8I^Re??EYh`GUu!XH_hTS5+4`3;?fZ~{3LyWQS`=Wd|JPMjmCqe9RJMYxDpcf$ zZkJ_wDOZ-LY`woMgYvwNw`(mdY0LRTx4Hi=wFrR`MV4iNG002?V+?Y)onI2BOWj=FSp-S?aB+{p(R7e@Bx;pJbrW8r>@EK~70uz-I zE6d4=`!BUgedW}{W6UWmD1>(Gc+ub(BQ1^0C=seQTq9!OB%_Kwglbhw5`nn7Vp+j8 z?HY=a0&hbbtCh~B+Fp+@kY?XgNJ8xB-(UV6(_$4%8uhf!Z^XV9(~Pbt4Q5RV`x^xr z-t%vb3B3M*ttz~(e|RN*KA-X9$9J617p47nI^pHz8K>hB&#NVlhXYotB@X*NR?7wU z`yE!xC+v1xET6t%yV+o|c*17A#^UK4wwpDUi*ML$)>tl|u-$I3Ts&d7* zmlA|k$Q12aRh$@Nv$m|Xe=XY)3Cl*>=c-N_qwyr9JdIaeKSkp~_mg^JeHt%e9Y|%H z*<317q~sRjlP7|BNTepH;*>EPu4?I+NHAM1VoxIx{)Wov{r-rb((|9F{no6#E;`sS zN>GSaj2)vNYD=TOV7&;xi`3D_)L1zp@dWapt!*H~HX?;8zV?57D{co0-`bEksw$uk zYwd+HYT9tr;fTY3uJ^mLo=~bXu;uoHkOu$J{O3uc5c=8wWDO}$ipWezA$guR#Nj@h zhC*n$z)qIIpdk@QKVbfFpQY`-DWx`7@gbec23snVsWRz$bM^d8FQ(#Rb=(K4tXitw zH2zzgCej7CXpMhJ$(47j=y}Yz5_Dx+DjQAw`3yCYKDg5z4oXT?n#tq)YlSx@cBt)` z%I%wIe6$&XE!s#a)1zI<4n22L(b(7srM52eNQs?BlyqlT86MlqN_3}4BKML(^6hp5 zV+^+2jo)^8mSvZ1W3b=vkmot}haHNd!0~v%U~q@i>4dwxAJC29+j;y zo=jk^#bh#t$qXjb8BCU8HlHKQb4=%RL9QqI( zkDp5_T`4yE=AC^}=%_2!%`7amRaMG=U|(1HSFDbcC}R_zT3~%SM;J8c;~e}Lm|bV@ zsxc4{#b46^fYum=BLq5rLCb*H%a|Q+|MEd53q@w!LK~VGz2zRO3V4FDrXQlBm{AIM zyz5%!)WOwp*ELU-q_dTxKBe&mN(;OW^~F;W$ejV=KS)2gLe;*@hVB&FjO|Z3&(WDy zis2TCC^mWOGd2Mz6lwJ`w-5-e&k0hzJ`~DGp$}KCD@Ex-pv9EG0l_+uTi)&KlrPUS zqL_EP?S)A8JLE-y{b7${Fu?J2#NBX+SR z_wGH4y8+&R_=v&q4j(>#!tj2Czdk=;G``2D&kwktOz`>3<0XH1#AG_dm&d;`oz3y^ z_!ZOH9ACcv9pn#>UwygBbcW9lkAa=PK0o+&?nXm=`1lEf;T_(8_=tQ^;Qjj#$nzZY z*&N0gj3-l6*5ZCVL0Og<-;Yt2XAFl!oK8m!heI5W2NZ(=_J=*PqQGvyLsrKr%Q9?h z@{r+ zXj{_kr&Lw{D?Po2OSp2S#!~EYRVUi(K@XG`=(X8(kDJ@@pShxAB#|=1$hT)3IuMUb zj>W!Qk+!|hlsFWMqD|7~Jh>sH8BRrA=R+$)eUyCC>T@beRl>J?cieR<+30uYC1PJ` zi{~zJ(&#$JLERo-cB!b;R!YjevLj0JcYCH(DgjAjG`}jB+U*-ZT83*A#wC`9~GLgbR)$ROj!!g?$ebiOM4cjiGH0j$F6}`SIYK!{h zC?Xh3NF^>pA)*@XgY!MrrV+|;2>QeN0006=Nklz1p$NQ9c9mP^W3lT%9V|`-m*x%M9TCRVk5?S(CB+|}HN@~VHdMcwo`Sl9= zw<0_PKgQ8ne%<)r%5A93DG~fEvXZXTKJj$V4vUR3IKTP24G6h=R#P8;qvwH;i$sv? zO*4B7R#t~VTS;rmzqQV#i@0b!h)U)6?*nCT<@Q?fwDI;NHLT6@>YYcP01))+RqmG< zpN^cyw=3qUZ3MBF-j&1p(n%T#c`yqL_(LH7mXxe23{#yqUI4thA}qx^8lg$`u60vV z$Cfz2DI`|kRSVXCT;W((JG4EzZos`IQ7Xr6RHU9e)}Ig$;3AP_97!jF5*~6%K5O2JOn@K zx*Sb8I|A}{5Zd+SY-lftldz5^up>OnOC=JX*Y;I{Alt9&=9y_R;z%K*6rzwwwN+1x zd!5uiM{K6XPU?d=t`s2>EvDw5&HrM~(x2p#c8~f0m6GoB|HO8vI&R&wCC9oh%3FPk z_FEVy(dtt_s1mkHU5z%R_|RloTU^;Y(&MZ0IZd?4L+Wb>D*C=j<2zD=2;1PX5yy0x zZIOh)=&%0OilIPOeNq=WtNUn2Z$)MnG?m`EeCm-b`w+ynzHa^tE3E=uz0u!y00000 LNkvXXu0mjf3l)h% literal 0 HcmV?d00001 diff --git a/admin/lang/en/images/rotateleftdisable.png b/admin/lang/en/images/rotateleftdisable.png new file mode 100644 index 0000000000000000000000000000000000000000..741526e0d5e6eb5c30eb0a62c9b1d6d558ed9cdf GIT binary patch literal 719 zcmV;=0xVLm}k=YQ<2%m+GNILKMZ4Wj)Eo{6dA(i=1OgO`#k70DYI-BmRjYes)SkU2cI0GZBR;y4N3I~Hh!d`9*7LUg-fQ!ZA17DgvC%W<{o)0F! zU*`EmuKGZYN~Kcs0v3uoolcs~W&&`zTnccgjDVT|^mshtI#kAIIINifC7$1T{?yd~ z`f398$nzJ^&xXUj%I~;@1tb~>YHqh%0jWR{cz-&b2!6()Y&M(t%#{JqZzlB@o&~uo zRdFYN7<*g3d>y0SFTSsu}||KmrzxrzXV}0f4+Nl`U`wo^<=3%s|h|0ur}Z0m~6a z)9IA5+3a~Uyo=N{O{`Z26ni!(U6x=a31615Uq6I}2cZ-|0a2}1X+EF7+lbqaCbL*9 zVjpaCBO8zeF31Bljb43c1B|5gdMy+K1i&JZ2&owiAH&aRFjxU~zu$k$sq`Wh)qB?* z7JdW}ya?6MP#9CN2390Mab0C5lljw}edEbwzR6l%S5ujn*P2rK!bg5RKf!pHvr45x zq@5Lg56Rlp|dF?<); zZnrB`Ycv`HPI*-K+S{`L4RzyPXZYcl&002ovPDHLkV1lL= BGwT2V literal 0 HcmV?d00001 diff --git a/admin/lang/en/images/rotateleftenable.png b/admin/lang/en/images/rotateleftenable.png new file mode 100644 index 0000000000000000000000000000000000000000..e164ddbd62a232f3a89826158c9795f6c082cc89 GIT binary patch literal 952 zcmV;p14sOcP)B{+A~4pJXZ}t_3ogEQ=EtDt@NW=ovC^1YY3D0f#y*iY)MG5<8F z!|f{@kKz7^5#8k3NZf?c9K_t5iFB?APcn|7{XXn#Ybhtak0o(qW)4fuAr!0vET4{< zSc+h47GQ*Qo%FCG#zDtxKn;d}ii3LDciA+S|Xdhl! zB4Tth6pKaVi#F1YAvCEHTFJM^bUHnP0sSYFPoVrcDQm)w^;g8!)bGBFx|JW?%CGA- z&{PEjJ5@v`9|31h11Z`(8l4W74acX!rYt{M#7D#XGmFrJ8p1{(Q)@sv8@F2OUzvR1 zx9$d0kvWXM{tBEwN0$R4YNDW*#-^%Df&-Q6zoW#Uu@ZDmhS%$@-$mxZRD^B@1aSM_ zhL@++3|_o?ixNDPXhWAA>})fj>w5hzGPAR@B4aE>&p+Mbf*>$imMuk5EW2c0000?hzPCHlRk++nh`E3!rKF3htnTQ@ z$gI|MU8lEVHuFTg-PR|Q2`!gP+H5wYX&N~k4)SU74-bY78_Ii7=yw!+~9z)9EC?-%tI1pNtpOgTWwx zYc~hmYPIxUug9z{77N<%_sk-|f_a_y+;xqv4+oe^KHq!n0!Sli2@LjQ?eJI-PQw!5kz2kP;{i1#vW)J3m7@ilvOQx*+0gD21yWM29TG_#>*)V5x3eEte0rs!7XTfq- zNpDVBe^HqJA^?xgte(JHEEaB201ADoR;^a);o$)-i`fNGNCD$l*jUkV&ZOJ#g6-=H z48;P#aDbi7X5{nvH~?d$9K9Fo01LT5x392A!Cv-)3}9cydREAx^dDF>`_*d2002m8 z7y1N?u~>`?4DAa45ev4jw7ek*Sw2XA4L&zdS z9A4&}t`&psbm3W({))<)8k1Mzq-LMgHh4P0I-QOV5C8-H!ohO6T&8$D&Va$Z(UY0s zOeS;lL%|{kl3A%;S#MlC&Amg&cpiN1r-rvC| zuQ1Fer=aUPn>g6re+%A~4HxgfoyFs_jfT}hvT2|~buTAFG7cgsM5)fELnz*RfYsA+ z%+JjZfW5eCXjGl)8+s)4P|lCQu*F>n-SXLP{rpv`@{BNE{IcsI8B@_npSvh)X*hNpW_TLgr2`Ju@0bJqvCruO={o6E(Z3`5{jw@Hv`M-m z=H><1m4WE;;`c%mkz)x|ObZEnAD_J*B%s8ej2PcmwhgRZado>%)jtid7zm=SE zQ*F%`{_{RP6wdfheSj59}E|h^E{{P*E_)R6H^3NW^13gC8C>dV0CgKv@POF4dxfvY6kSFwxaNHki&!>3-Y^~4kn%F>oC=IgN4BfYTUZZWo z4NgH0Fff*Y6!1`OQEtkV%qBhmGZEnCEqwT{hG--_gp%$=?(C?C;zb^jm66PHQ4|^R zkb*cmi1NcmKm&YfVi#crNDyF;_V&?5G literal 0 HcmV?d00001 diff --git a/admin/lang/en/images/upload.png b/admin/lang/en/images/upload.png new file mode 100644 index 0000000000000000000000000000000000000000..7bb15b3d6d6799504cf7093a1600bd7ece0d9ef5 GIT binary patch literal 3941 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 literal 0 HcmV?d00001 diff --git a/admin/lang/zh-cn/images/copy.png b/admin/lang/zh-cn/images/copy.png new file mode 100644 index 0000000000000000000000000000000000000000..b2536aac72e763b9a872b507462458ecb96990f0 GIT binary patch literal 4319 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 N002ovPDHLkV1nv#UQ7T0 literal 0 HcmV?d00001 diff --git a/admin/lang/zh-cn/images/localimage.png b/admin/lang/zh-cn/images/localimage.png new file mode 100644 index 0000000000000000000000000000000000000000..7303c364318b6ac27dc4a8ae6717124d8dafaff9 GIT binary patch literal 6979 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 O0000字数超出最大允许值,服务器可能拒绝保存!', + 'ok': "确认", + 'cancel': "取消", + 'closeDialog': "关闭对话框", + 'tableDrag': "表格拖动必须引入uiUtils.js文件!", + 'autofloatMsg': "工具栏浮动依赖编辑器UI,您首先需要引入UI文件!", + 'loadconfigError': '获取后台配置项请求出错,上传功能将不能正常使用!', + 'loadconfigFormatError': '后台配置项返回格式出错,上传功能将不能正常使用!', + 'loadconfigHttpError': '请求后台配置项http错误,上传功能将不能正常使用!', + 'snapScreen_plugin': { + 'browserMsg': "仅支持IE浏览器!", + 'callBackErrorMsg': "服务器返回数据有误,请检查配置项之后重试。", + 'uploadErrorMsg': "截图上传失败,请检查服务器端环境! " + }, + 'insertcode': { + 'as3': 'ActionScript 3', + 'bash': 'Bash/Shell', + 'cpp': 'C/C++', + 'css': 'CSS', + 'cf': 'ColdFusion', + 'c#': 'C#', + 'delphi': 'Delphi', + 'diff': 'Diff', + 'erlang': 'Erlang', + 'groovy': 'Groovy', + 'html': 'HTML', + 'java': 'Java', + 'jfx': 'JavaFX', + 'js': 'JavaScript', + 'pl': 'Perl', + 'php': 'PHP', + 'plain': 'Plain Text', + 'ps': 'PowerShell', + 'python': 'Python', + 'ruby': 'Ruby', + 'scala': 'Scala', + 'sql': 'SQL', + 'vb': 'Visual Basic', + 'xml': 'XML' + }, + 'confirmClear': "确定清空当前文档么?", + 'contextMenu': { + 'delete': "删除", + 'selectall': "全选", + 'deletecode': "删除代码", + 'cleardoc': "清空文档", + 'confirmclear': "确定清空当前文档么?", + 'unlink': "删除超链接", + 'paragraph': "段落格式", + 'edittable': "表格属性", + 'aligntd': "单元格对齐方式", + 'aligntable': '表格对齐方式', + 'tableleft': '左浮动', + 'tablecenter': '居中显示', + 'tableright': '右浮动', + 'edittd': "单元格属性", + 'setbordervisible': '设置表格边线可见', + 'justifyleft': '左对齐', + 'justifyright': '右对齐', + 'justifycenter': '居中对齐', + 'justifyjustify': '两端对齐', + 'table': "表格", + 'inserttable': '插入表格', + 'deletetable': "删除表格", + 'insertparagraphbefore': "前插入段落", + 'insertparagraphafter': '后插入段落', + 'deleterow': "删除当前行", + 'deletecol': "删除当前列", + 'insertrow': "前插入行", + 'insertcol': "左插入列", + 'insertrownext': '后插入行', + 'insertcolnext': '右插入列', + 'insertcaption': '插入表格名称', + 'deletecaption': '删除表格名称', + 'inserttitle': '插入表格标题行', + 'deletetitle': '删除表格标题行', + 'inserttitlecol': '插入表格标题列', + 'deletetitlecol': '删除表格标题列', + 'averageDiseRow': '平均分布各行', + 'averageDisCol': '平均分布各列', + 'mergeright': "向右合并", + 'mergeleft': "向左合并", + 'mergedown': "向下合并", + 'mergecells': "合并单元格", + 'splittocells': "完全拆分单元格", + 'splittocols': "拆分成列", + 'splittorows': "拆分成行", + 'tablesort': '表格排序', + 'enablesort': '设置表格可排序', + 'disablesort': '取消表格可排序', + 'reversecurrent': '逆序当前', + 'orderbyasc': '按ASCII字符升序', + 'reversebyasc': '按ASCII字符降序', + 'orderbynum': '按数值大小升序', + 'reversebynum': '按数值大小降序', + 'borderbk': '边框底纹', + 'setcolor': '表格隔行变色', + 'unsetcolor': '取消表格隔行变色', + 'setbackground': '选区背景隔行', + 'unsetbackground': '取消选区背景', + 'redandblue': '红蓝相间', + 'threecolorgradient': '三色渐变', + 'copy': "复制(Ctrl + c)", + 'copymsg': "浏览器不支持,请使用 'Ctrl + c'", + 'paste': "粘贴(Ctrl + v)", + 'pastemsg': "浏览器不支持,请使用 'Ctrl + v'" + }, + 'copymsg': "浏览器不支持,请使用 'Ctrl + c'", + 'pastemsg': "浏览器不支持,请使用 'Ctrl + v'", + 'anthorMsg': "链接", + 'clearColor': '清空颜色', + 'standardColor': '标准颜色', + 'themeColor': '主题颜色', + 'property': '属性', + 'default': '默认', + 'modify': '修改', + 'justifyleft': '左对齐', + 'justifyright': '右对齐', + 'justifycenter': '居中', + 'justify': '默认', + 'clear': '清除', + 'anchorMsg': '锚点', + 'delete': '删除', + 'clickToUpload': "点击上传", + 'unset': '尚未设置语言文件', + 't_row': '行', + 't_col': '列', + 'more': '更多', + 'pasteOpt': '粘贴选项', + 'pasteSourceFormat': "保留源格式", + 'tagFormat': '只保留标签', + 'pasteTextFormat': '只保留文本', + 'autoTypeSet': { + 'mergeLine': "合并空行", + 'delLine': "清除空行", + 'removeFormat': "清除格式", + 'indent': "首行缩进", + 'alignment': "对齐方式", + 'imageFloat': "图片浮动", + 'removeFontsize': "清除字号", + 'removeFontFamily': "清除字体", + 'removeHtml': "清除冗余HTML代码", + 'pasteFilter': "粘贴过滤", + 'run': "执行", + 'symbol': '符号转换', + 'bdc2sb': '全角转半角', + 'tobdc': '半角转全角' + }, + + 'background': { + 'static': { + 'lang_background_normal': '背景设置', + 'lang_background_local': '在线图片', + 'lang_background_set': '选项', + 'lang_background_none': '无背景色', + 'lang_background_colored': '有背景色', + 'lang_background_color': '颜色设置', + 'lang_background_netimg': '网络图片', + 'lang_background_align': '对齐方式', + 'lang_background_position': '精确定位', + 'repeatType': {'options': ["居中", "横向重复", "纵向重复", "平铺", "自定义"]} + + }, + 'noUploadImage': "当前未上传过任何图片!", + 'toggleSelect': "单击可切换选中状态\n原图尺寸: " + }, + //===============dialog i18N======================= + 'insertimage': { + 'static': { + 'lang_tab_remote': "插入图片", //节点 + 'lang_tab_upload': "本地上传", + 'lang_tab_online': "在线管理", + 'lang_tab_search': "图片搜索", + 'lang_input_url': "地 址:", + 'lang_input_size': "大 小:", + 'lang_input_width': "宽度", + 'lang_input_height': "高度", + 'lang_input_border': "边 框:", + 'lang_input_vhspace': "边 距:", + 'lang_input_title': "描 述:", + 'lang_input_align': '图片浮动方式:', + 'lang_imgLoading': " 图片加载中……", + 'lang_start_upload': "开始上传", + 'lock': {'title': "锁定宽高比例"}, //属性 + 'searchType': {'title': "图片类型", 'options': ["新闻", "壁纸", "表情", "头像"]}, //select的option + 'searchTxt': {'value': "请输入搜索关键词"}, + 'searchBtn': {'value': "百度一下"}, + 'searchReset': {'value': "清空搜索"}, + 'noneAlign': {'title': '无浮动'}, + 'leftAlign': {'title': '左浮动'}, + 'rightAlign': {'title': '右浮动'}, + 'centerAlign': {'title': '居中独占一行'} + }, + 'uploadSelectFile': '点击选择图片', + 'uploadAddFile': '继续添加', + 'uploadStart': '开始上传', + 'uploadPause': '暂停上传', + 'uploadContinue': '继续上传', + 'uploadRetry': '重试上传', + 'uploadDelete': '删除', + 'uploadTurnLeft': '向左旋转', + 'uploadTurnRight': '向右旋转', + 'uploadPreview': '预览中', + 'uploadNoPreview': '不能预览', + 'updateStatusReady': '选中_张图片,共_KB。', + 'updateStatusConfirm': '已成功上传_张照片,_张照片上传失败', + 'updateStatusFinish': '共_张(_KB),_张上传成功', + 'updateStatusError': ',_张上传失败。', + 'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。', + 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!', + 'errorExceedSize': '文件大小超出', + 'errorFileType': '文件格式不允许', + 'errorInterrupt': '文件传输中断', + 'errorUploadRetry': '上传失败,请重试', + 'errorHttp': 'http请求错误', + 'errorServerUpload': '服务器返回出错', + 'remoteLockError': "宽高不正确,不能所定比例", + 'numError': "请输入正确的长度或者宽度值!例如:123,400", + 'imageUrlError': "不允许的图片格式或者图片域!", + 'imageLoadError': "图片加载失败!请检查链接地址或网络状态!", + 'searchRemind': "请输入搜索关键词", + 'searchLoading': "图片加载中,请稍后……", + 'searchRetry': " :( ,抱歉,没有找到图片!请重试一次!" + }, + 'attachment': { + 'static': { + 'lang_tab_upload': '上传附件', + 'lang_tab_online': '在线附件', + 'lang_start_upload': "开始上传", + 'lang_drop_remind': "可以将文件拖到这里,单次最多可选100个文件" + }, + 'uploadSelectFile': '点击选择文件', + 'uploadAddFile': '继续添加', + 'uploadStart': '开始上传', + 'uploadPause': '暂停上传', + 'uploadContinue': '继续上传', + 'uploadRetry': '重试上传', + 'uploadDelete': '删除', + 'uploadTurnLeft': '向左旋转', + 'uploadTurnRight': '向右旋转', + 'uploadPreview': '预览中', + 'updateStatusReady': '选中_个文件,共_KB。', + 'updateStatusConfirm': '已成功上传_个文件,_个文件上传失败', + 'updateStatusFinish': '共_个(_KB),_个上传成功', + 'updateStatusError': ',_张上传失败。', + 'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。', + 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!', + 'errorExceedSize': '文件大小超出', + 'errorFileType': '文件格式不允许', + 'errorInterrupt': '文件传输中断', + 'errorUploadRetry': '上传失败,请重试', + 'errorHttp': 'http请求错误', + 'errorServerUpload': '服务器返回出错' + }, + 'insertvideo': { + 'static': { + 'lang_tab_insertV': "插入视频", + 'lang_tab_searchV': "搜索视频", + 'lang_tab_uploadV': "上传视频", + 'lang_video_url': "视频网址", + 'lang_video_size': "视频尺寸", + 'lang_videoW': "宽度", + 'lang_videoH': "高度", + 'lang_alignment': "对齐方式", + 'videoSearchTxt': {'value': "请输入搜索关键字!"}, + 'videoType': {'options': ["全部", "热门", "娱乐", "搞笑", "体育", "科技", "综艺"]}, + 'videoSearchBtn': {'value': "百度一下"}, + 'videoSearchReset': {'value': "清空结果"}, + + 'lang_input_fileStatus': ' 当前未上传文件', + 'startUpload': {'style': "background:url(upload.png) no-repeat;"}, + + 'lang_upload_size': "视频尺寸", + 'lang_upload_width': "宽度", + 'lang_upload_height': "高度", + 'lang_upload_alignment': "对齐方式", + 'lang_format_advice': "建议使用mp4格式." + + }, + 'numError': "请输入正确的数值,如123,400", + 'floatLeft': "左浮动", + 'floatRight': "右浮动", + '"default"': "默认", + 'block': "独占一行", + 'urlError': "输入的视频地址有误,请检查后再试!", + 'loading': "  视频加载中,请等待……", + 'clickToSelect': "点击选中", + 'goToSource': '访问源视频', + 'noVideo': "    抱歉,找不到对应的视频,请重试!", + + 'browseFiles': '浏览文件', + 'uploadSuccess': '上传成功!', + 'delSuccessFile': '从成功队列中移除', + 'delFailSaveFile': '移除保存失败文件', + 'statusPrompt': ' 个文件已上传! ', + 'flashVersionError': '当前Flash版本过低,请更新FlashPlayer后重试!', + 'flashLoadingError': 'Flash加载失败!请检查路径或网络状态', + 'fileUploadReady': '等待上传……', + 'delUploadQueue': '从上传队列中移除', + 'limitPrompt1': '单次不能选择超过', + 'limitPrompt2': '个文件!请重新选择!', + 'delFailFile': '移除失败文件', + 'fileSizeLimit': '文件大小超出限制!', + 'emptyFile': '空文件无法上传!', + 'fileTypeError': '文件类型不允许!', + 'unknownError': '未知错误!', + 'fileUploading': '上传中,请等待……', + 'cancelUpload': '取消上传', + 'netError': '网络错误', + 'failUpload': '上传失败!', + 'serverIOError': '服务器IO错误!', + 'noAuthority': '无权限!', + 'fileNumLimit': '上传个数限制', + 'failCheck': '验证失败,本次上传被跳过!', + 'fileCanceling': '取消中,请等待……', + 'stopUploading': '上传已停止……', + + 'uploadSelectFile': '点击选择文件', + 'uploadAddFile': '继续添加', + 'uploadStart': '开始上传', + 'uploadPause': '暂停上传', + 'uploadContinue': '继续上传', + 'uploadRetry': '重试上传', + 'uploadDelete': '删除', + 'uploadTurnLeft': '向左旋转', + 'uploadTurnRight': '向右旋转', + 'uploadPreview': '预览中', + 'updateStatusReady': '选中_个文件,共_KB。', + 'updateStatusConfirm': '成功上传_个,_个失败', + 'updateStatusFinish': '共_个(_KB),_个成功上传', + 'updateStatusError': ',_张上传失败。', + 'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。', + 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!', + 'errorExceedSize': '文件大小超出', + 'errorFileType': '文件格式不允许', + 'errorInterrupt': '文件传输中断', + 'errorUploadRetry': '上传失败,请重试', + 'errorHttp': 'http请求错误', + 'errorServerUpload': '服务器返回出错' + }, + 'webapp': { + 'tip1': "本功能由百度APP提供,如看到此页面,请各位站长首先申请百度APPKey!", + 'tip2': "申请完成之后请至ueditor.config.js中配置获得的appkey! ", + 'applyFor': "点此申请", + 'anthorApi': "百度API" + }, + 'template': { + 'static': { + 'lang_template_bkcolor': '背景颜色', + 'lang_template_clear': '保留原有内容', + 'lang_template_select': '选择模板' + }, + 'blank': "空白文档", + 'blog': "博客文章", + 'resume': "个人简历", + 'richText': "图文混排", + 'sciPapers': "科技论文" + + + }, + 'scrawl': { + 'static': { + 'lang_input_previousStep': "上一步", + 'lang_input_nextsStep': "下一步", + 'lang_input_clear': '清空', + 'lang_input_addPic': '添加背景', + 'lang_input_ScalePic': '缩放背景', + 'lang_input_removePic': '删除背景', + 'J_imgTxt': {title: '添加背景图片'} + }, + 'noScarwl': "尚未作画,白纸一张~", + 'scrawlUpLoading': "涂鸦上传中,别急哦~", + 'continueBtn': "继续", + 'imageError': "糟糕,图片读取失败了!", + 'backgroundUploading': '背景图片上传中,别急哦~' + }, + 'music': { + 'static': { + 'lang_input_tips': "输入歌手/歌曲/专辑,搜索您感兴趣的音乐!", + 'J_searchBtn': {value: '搜索歌曲'} + }, + 'emptyTxt': '未搜索到相关音乐结果,请换一个关键词试试。', + 'chapter': '歌曲', + 'singer': '歌手', + 'special': '专辑', + 'listenTest': '试听' + }, + 'anchor': { + 'static': { + 'lang_input_anchorName': '锚点名字:' + } + }, + 'charts': { + 'static': { + 'lang_data_source': '数据源:', + 'lang_chart_format': '图表格式:', + 'lang_data_align': '数据对齐方式', + 'lang_chart_align_same': '数据源与图表X轴Y轴一致', + 'lang_chart_align_reverse': '数据源与图表X轴Y轴相反', + 'lang_chart_title': '图表标题', + 'lang_chart_main_title': '主标题:', + 'lang_chart_sub_title': '子标题:', + 'lang_chart_x_title': 'X轴标题:', + 'lang_chart_y_title': 'Y轴标题:', + 'lang_chart_tip': '提示文字', + 'lang_cahrt_tip_prefix': '提示文字前缀:', + 'lang_cahrt_tip_description': '仅饼图有效, 当鼠标移动到饼图中相应的块上时,提示框内的文字的前缀', + 'lang_chart_data_unit': '数据单位', + 'lang_chart_data_unit_title': '单位:', + 'lang_chart_data_unit_description': '显示在每个数据点上的数据的单位, 比如: 温度的单位 ℃', + 'lang_chart_type': '图表类型:', + 'lang_prev_btn': '上一个', + 'lang_next_btn': '下一个' + } + }, + 'emotion': { + 'static': { + 'lang_input_choice': '精选', + 'lang_input_Tuzki': '兔斯基', + 'lang_input_BOBO': 'BOBO', + 'lang_input_lvdouwa': '绿豆蛙', + 'lang_input_babyCat': 'baby猫', + 'lang_input_bubble': '泡泡', + 'lang_input_youa': '有啊' + } + }, + 'gmap': { + 'static': { + 'lang_input_address': '地址', + 'lang_input_search': '搜索', + 'address': {value: "北京"} + }, + searchError: '无法定位到该地址!' + }, + 'help': { + 'static': { + 'lang_input_about': '关于UEditor', + 'lang_input_shortcuts': '快捷键', + 'lang_input_introduction': 'UEditor是由百度web前端研发部开发的所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点。开源基于BSD协议,允许自由使用和修改代码。', + 'lang_Txt_shortcuts': '快捷键', + 'lang_Txt_func': '功能', + 'lang_Txt_bold': '给选中字设置为加粗', + 'lang_Txt_copy': '复制选中内容', + 'lang_Txt_cut': '剪切选中内容', + 'lang_Txt_Paste': '粘贴', + 'lang_Txt_undo': '重新执行上次操作', + 'lang_Txt_redo': '撤销上一次操作', + 'lang_Txt_italic': '给选中字设置为斜体', + 'lang_Txt_underline': '给选中字加下划线', + 'lang_Txt_selectAll': '全部选中', + 'lang_Txt_visualEnter': '软回车', + 'lang_Txt_fullscreen': '全屏' + } + }, + 'insertframe': { + 'static': { + 'lang_input_address': '地址:', + 'lang_input_width': '宽度:', + 'lang_input_height': '高度:', + 'lang_input_isScroll': '允许滚动条:', + 'lang_input_frameborder': '显示框架边框:', + 'lang_input_alignMode': '对齐方式:', + 'align': {title: "对齐方式", options: ["默认", "左对齐", "右对齐", "居中"]} + }, + 'enterAddress': '请输入地址!' + }, + 'link': { + 'static': { + 'lang_input_text': '文本内容:', + 'lang_input_url': '链接地址:', + 'lang_input_title': '标题:', + 'lang_input_target': '是否在新窗口打开:' + }, + 'validLink': '只支持选中一个链接时生效', + 'httpPrompt': '您输入的超链接中不包含http等协议名称,默认将为您添加http://前缀' + }, + 'map': { + 'static': { + lang_city: "城市", + lang_address: "地址", + city: {value: "北京"}, + lang_search: "搜索", + lang_dynamicmap: "插入动态地图" + }, + cityMsg: "请选择城市", + errorMsg: "抱歉,找不到该位置!" + }, + 'searchreplace': { + 'static': { + lang_tab_search: "查找", + lang_tab_replace: "替换", + lang_search1: "查找", + lang_search2: "查找", + lang_replace: "替换", + lang_searchReg: '支持正则表达式,添加前后斜杠标示为正则表达式,例如“/表达式/”', + lang_searchReg1: '支持正则表达式,添加前后斜杠标示为正则表达式,例如“/表达式/”', + lang_case_sensitive1: "区分大小写", + lang_case_sensitive2: "区分大小写", + nextFindBtn: {value: "下一个"}, + preFindBtn: {value: "上一个"}, + nextReplaceBtn: {value: "下一个"}, + preReplaceBtn: {value: "上一个"}, + repalceBtn: {value: "替换"}, + repalceAllBtn: {value: "全部替换"} + }, + getEnd: "已经搜索到文章末尾!", + getStart: "已经搜索到文章头部", + countMsg: "总共替换了{#count}处!" + }, + 'snapscreen': { + 'static': { + lang_showMsg: "截图功能需要首先安装UEditor截图插件! ", + lang_download: "点此下载", + lang_step1: "第一步,下载UEditor截图插件并运行安装。", + lang_step2: "第二步,插件安装完成后即可使用,如不生效,请重启浏览器后再试!" + } + }, + 'spechars': { + 'static': {}, + tsfh: "特殊字符", + lmsz: "罗马字符", + szfh: "数学字符", + rwfh: "日文字符", + xlzm: "希腊字母", + ewzm: "俄文字符", + pyzm: "拼音字母", + yyyb: "英语音标", + zyzf: "其他" + }, + 'edittable': { + 'static': { + 'lang_tableStyle': '表格样式', + 'lang_insertCaption': '添加表格名称行', + 'lang_insertTitle': '添加表格标题行', + 'lang_insertTitleCol': '添加表格标题列', + 'lang_orderbycontent': "使表格内容可排序", + 'lang_tableSize': '自动调整表格尺寸', + 'lang_autoSizeContent': '按表格文字自适应', + 'lang_autoSizePage': '按页面宽度自适应', + 'lang_example': '示例', + 'lang_borderStyle': '表格边框', + 'lang_color': '颜色:' + }, + captionName: '表格名称', + titleName: '标题', + cellsName: '内容', + errorMsg: '有合并单元格,不可排序' + }, + 'edittip': { + 'static': { + lang_delRow: '删除整行', + lang_delCol: '删除整列' + } + }, + 'edittd': { + 'static': { + lang_tdBkColor: '背景颜色:' + } + }, + 'formula': { + 'static': {} + }, + 'wordimage': { + 'static': { + lang_resave: "转存步骤", + uploadBtn: {src: "upload.png", alt: "上传"}, + clipboard: {style: "background: url(copy.png) -153px -1px no-repeat;"}, + lang_step: "1、点击顶部复制按钮,将地址复制到剪贴板;2、点击添加照片按钮,在弹出的对话框中使用Ctrl+V粘贴地址;3、点击打开后选择图片上传流程。" + }, + 'fileType': "图片", + 'flashError': "FLASH初始化失败,请检查FLASH插件是否正确安装!", + 'netError': "网络连接错误,请重试!", + 'copySuccess': "图片地址已经复制!", + 'flashI18n': {} //留空默认中文 + }, + 'autosave': { + 'saving': '保存中...', + 'success': '本地保存成功' + } +}; diff --git a/admin/login.html b/admin/login.html new file mode 100644 index 0000000..18558f1 --- /dev/null +++ b/admin/login.html @@ -0,0 +1,141 @@ + + + + + + + + 登录 + + + + + + + + + + +

      + + + + + + + \ No newline at end of file diff --git a/admin/php/Uploader.class.php b/admin/php/Uploader.class.php new file mode 100644 index 0000000..a6cb14e --- /dev/null +++ b/admin/php/Uploader.class.php @@ -0,0 +1,375 @@ + "临时文件错误", + "ERROR_TMP_FILE_NOT_FOUND" => "找不到临时文件", + "ERROR_SIZE_EXCEED" => "文件大小超出网站限制", + "ERROR_TYPE_NOT_ALLOWED" => "文件类型不允许", + "ERROR_CREATE_DIR" => "目录创建失败", + "ERROR_DIR_NOT_WRITEABLE" => "目录没有写权限", + "ERROR_FILE_MOVE" => "文件保存时出错", + "ERROR_FILE_NOT_FOUND" => "找不到上传文件", + "ERROR_WRITE_CONTENT" => "写入文件内容错误", + "ERROR_UNKNOWN" => "未知错误", + "ERROR_DEAD_LINK" => "链接不可用", + "ERROR_HTTP_LINK" => "链接不是http链接", + "ERROR_HTTP_CONTENTTYPE" => "链接contentType不正确", + "INVALID_URL" => "非法 URL", + "INVALID_IP" => "非法 IP" + ); + + /** + * 构造函数 + * @param string $fileField 表单名称 + * @param array $config 配置项 + * @param bool $base64 是否解析base64编码,可省略。若开启,则$fileField代表的是base64编码的字符串表单名 + */ + public function __construct($fileField, $config, $type = "upload") + { + $this->fileField = $fileField; + $this->config = $config; + $this->type = $type; + if ($type == "remote") { + $this->saveRemote(); + } else if ($type == "base64") { + $this->upBase64(); + } else { + $this->upFile(); + } + + $this->stateMap['ERROR_TYPE_NOT_ALLOWED'] = iconv('unicode', 'utf-8', $this->stateMap['ERROR_TYPE_NOT_ALLOWED']); + } + + /** + * 拉取远程图片 + * @return mixed + */ + private function saveRemote() + { + $imgUrl = htmlspecialchars($this->fileField); + $imgUrl = str_replace("&", "&", $imgUrl); + + //http开头验证 + if (strpos($imgUrl, "http") !== 0) { + $this->stateInfo = $this->getStateInfo("ERROR_HTTP_LINK"); + return; + } + + preg_match('/(^https*:\/\/[^:\/]+)/', $imgUrl, $matches); + $host_with_protocol = count($matches) > 1 ? $matches[1] : ''; + + // 判断是否是合法 url + if (!filter_var($host_with_protocol, FILTER_VALIDATE_URL)) { + $this->stateInfo = $this->getStateInfo("INVALID_URL"); + return; + } + + preg_match('/^https*:\/\/(.+)/', $host_with_protocol, $matches); + $host_without_protocol = count($matches) > 1 ? $matches[1] : ''; + + // 此时提取出来的可能是 ip 也有可能是域名,先获取 ip + $ip = gethostbyname($host_without_protocol); + // 判断是否是私有 ip + if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE)) { + $this->stateInfo = $this->getStateInfo("INVALID_IP"); + return; + } + + //获取请求头并检测死链 + $heads = get_headers($imgUrl, 1); + if (!(stristr($heads[0], "200") && stristr($heads[0], "OK"))) { + $this->stateInfo = $this->getStateInfo("ERROR_DEAD_LINK"); + return; + } + //格式验证(扩展名验证和Content-Type验证) + $fileType = strtolower(strrchr($imgUrl, '.')); + if (!in_array($fileType, $this->config['allowFiles']) || !isset($heads['Content-Type']) || !stristr($heads['Content-Type'], "image")) { + $this->stateInfo = $this->getStateInfo("ERROR_HTTP_CONTENTTYPE"); + return; + } + + //打开输出缓冲区并获取远程图片 + ob_start(); + $context = stream_context_create( + array('http' => array( + 'follow_location' => false // don't follow redirects + )) + ); + readfile($imgUrl, false, $context); + $img = ob_get_contents(); + ob_end_clean(); + preg_match("/[\/]([^\/]*)[\.]?[^\.\/]*$/", $imgUrl, $m); + + $this->oriName = $m ? $m[1] : ""; + $this->fileSize = strlen($img); + $this->fileType = $this->getFileExt(); + $this->fullName = $this->getFullName(); + $this->filePath = $this->getFilePath(); + $this->fileName = $this->getFileName(); + $dirname = dirname($this->filePath); + + //检查文件大小是否超出限制 + if (!$this->checkSize()) { + $this->stateInfo = $this->getStateInfo("ERROR_SIZE_EXCEED"); + return; + } + + //创建目录失败 + if (!file_exists($dirname) && !mkdir($dirname, 0777, true)) { + $this->stateInfo = $this->getStateInfo("ERROR_CREATE_DIR"); + return; + } else if (!is_writeable($dirname)) { + $this->stateInfo = $this->getStateInfo("ERROR_DIR_NOT_WRITEABLE"); + return; + } + + //移动文件 + if (!(file_put_contents($this->filePath, $img) && file_exists($this->filePath))) { //移动失败 + $this->stateInfo = $this->getStateInfo("ERROR_WRITE_CONTENT"); + } else { //移动成功 + $this->stateInfo = $this->stateMap[0]; + } + + } + + /** + * 上传错误检查 + * @param $errCode + * @return string + */ + private function getStateInfo($errCode) + { + return !$this->stateMap[$errCode] ? $this->stateMap["ERROR_UNKNOWN"] : $this->stateMap[$errCode]; + } + + /** + * 获取文件扩展名 + * @return string + */ + private function getFileExt() + { + return strtolower(strrchr($this->oriName, '.')); + } + + /** + * 重命名文件 + * @return string + */ + private function getFullName() + { + //替换日期事件 + $t = time(); + $d = explode('-', date("Y-y-m-d-H-i-s")); + $format = $this->config["pathFormat"]; + $format = str_replace("{yyyy}", $d[0], $format); + $format = str_replace("{yy}", $d[1], $format); + $format = str_replace("{mm}", $d[2], $format); + $format = str_replace("{dd}", $d[3], $format); + $format = str_replace("{hh}", $d[4], $format); + $format = str_replace("{ii}", $d[5], $format); + $format = str_replace("{ss}", $d[6], $format); + $format = str_replace("{time}", $t, $format); + + //过滤文件名的非法自负,并替换文件名 + $oriName = substr($this->oriName, 0, strrpos($this->oriName, '.')); + $oriName = preg_replace("/[\|\?\"\<\>\/\*\\\\]+/", '', $oriName); + $format = str_replace("{filename}", $oriName, $format); + + //替换随机字符串 + $randNum = rand(1, 10000000000) . rand(1, 10000000000); + if (preg_match("/\{rand\:([\d]*)\}/i", $format, $matches)) { + $format = preg_replace("/\{rand\:[\d]*\}/i", substr($randNum, 0, $matches[1]), $format); + } + + $ext = $this->getFileExt(); + return $format . $ext; + } + + /** + * 获取文件完整路径 + * @return string + */ + private function getFilePath() + { + global $G; + $fullname = $this->fullName; + $rootPath = $G['sys']['rootdir'] . '/'; + + if (substr($fullname, 0, 1) != '/') { + $fullname = '/' . $fullname; + } + + return $rootPath . $fullname; + } + + /** + * 获取文件名 + * @return string + */ + private function getFileName() + { + return substr($this->filePath, strrpos($this->filePath, '/') + 1); + } + + /** + * 文件大小检测 + * @return bool + */ + private function checkSize() + { + return $this->fileSize <= ($this->config["maxSize"]); + } + + /** + * 处理base64编码的图片上传 + * @return mixed + */ + private function upBase64() + { + $base64Data = $_POST[$this->fileField]; + $img = base64_decode($base64Data); + + $this->oriName = $this->config['oriName']; + $this->fileSize = strlen($img); + $this->fileType = $this->getFileExt(); + $this->fullName = $this->getFullName(); + $this->filePath = $this->getFilePath(); + $this->fileName = $this->getFileName(); + $dirname = dirname($this->filePath); + + //检查文件大小是否超出限制 + if (!$this->checkSize()) { + $this->stateInfo = $this->getStateInfo("ERROR_SIZE_EXCEED"); + return; + } + + //创建目录失败 + if (!file_exists($dirname) && !mkdir($dirname, 0777, true)) { + $this->stateInfo = $this->getStateInfo("ERROR_CREATE_DIR"); + return; + } else if (!is_writeable($dirname)) { + $this->stateInfo = $this->getStateInfo("ERROR_DIR_NOT_WRITEABLE"); + return; + } + + //移动文件 + if (!(file_put_contents($this->filePath, $img) && file_exists($this->filePath))) { //移动失败 + $this->stateInfo = $this->getStateInfo("ERROR_WRITE_CONTENT"); + } else { //移动成功 + $this->stateInfo = $this->stateMap[0]; + } + + } + + /** + * 上传文件的主处理方法 + * @return mixed + */ + private function upFile() + { + $file = $this->file = $_FILES[$this->fileField]; + if (!$file) { + $this->stateInfo = $this->getStateInfo("ERROR_FILE_NOT_FOUND"); + return; + } + if ($this->file['error']) { + $this->stateInfo = $this->getStateInfo($file['error']); + return; + } else if (!file_exists($file['tmp_name'])) { + $this->stateInfo = $this->getStateInfo("ERROR_TMP_FILE_NOT_FOUND"); + return; + } else if (!is_uploaded_file($file['tmp_name'])) { + $this->stateInfo = $this->getStateInfo("ERROR_TMPFILE"); + return; + } + + $this->oriName = $file['name']; + $this->fileSize = $file['size']; + $this->fileType = $this->getFileExt(); + $this->fullName = $this->getFullName(); + $this->filePath = $this->getFilePath(); + $this->fileName = $this->getFileName(); + $dirname = dirname($this->filePath); + + //检查文件大小是否超出限制 + if (!$this->checkSize()) { + $this->stateInfo = $this->getStateInfo("ERROR_SIZE_EXCEED"); + return; + } + + //检查是否不允许的文件格式 + if (!$this->checkType()) { + $this->stateInfo = $this->getStateInfo("ERROR_TYPE_NOT_ALLOWED"); + return; + } + + //创建目录失败 + //echo $dirname; + if (!file_exists($dirname) && !mkdir($dirname, 0777, true)) { + $this->stateInfo = $this->getStateInfo("ERROR_CREATE_DIR"); + return; + } else if (!is_writeable($dirname)) { + $this->stateInfo = $this->getStateInfo("ERROR_DIR_NOT_WRITEABLE"); + return; + } + + //移动文件 + if (!(move_uploaded_file($file["tmp_name"], $this->filePath) && file_exists($this->filePath))) { //移动失败 + $this->stateInfo = $this->getStateInfo("ERROR_FILE_MOVE"); + } else { //移动成功 + $this->stateInfo = $this->stateMap[0]; + } + } + + /** + * 文件类型检测 + * @return bool + */ + private function checkType() + { + return in_array($this->getFileExt(), $this->config["allowFiles"]); + } + + /** + * 获取当前上传成功文件的各项信息 + * @return array + */ + public function getFileInfo() + { + return array( + "state" => $this->stateInfo, + "url" => $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['SERVER_NAME'] . ':' . $_SERVER['SERVER_PORT'] . dirname(dirname(dirname($_SERVER['REQUEST_URI']))) . $this->fullName, + "title" => $this->fileName, + "original" => $this->oriName, + "type" => $this->fileType, + "size" => $this->fileSize + ); + } + +} \ No newline at end of file diff --git a/admin/php/action_crawler.php b/admin/php/action_crawler.php new file mode 100644 index 0000000..e83f71a --- /dev/null +++ b/admin/php/action_crawler.php @@ -0,0 +1,44 @@ + $CONFIG['catcherPathFormat'], + "maxSize" => $CONFIG['catcherMaxSize'], + "allowFiles" => $CONFIG['catcherAllowFiles'], + "oriName" => "remote.png" +); +$fieldName = $CONFIG['catcherFieldName']; + +/* 抓取远程图片 */ +$list = array(); +if (isset($_POST[$fieldName])) { + $source = $_POST[$fieldName]; +} else { + $source = $_GET[$fieldName]; +} +foreach ($source as $imgUrl) { + $item = new Uploader($imgUrl, $config, "remote"); + $info = $item->getFileInfo(); + array_push($list, array( + "state" => $info["state"], + "url" => $info["url"], + "size" => $info["size"], + "title" => htmlspecialchars($info["title"]), + "original" => htmlspecialchars($info["original"]), + "source" => htmlspecialchars($imgUrl) + )); +} + +/* 返回抓取数据 */ +return json_encode(array( + 'state' => count($list) ? 'SUCCESS' : 'ERROR', + 'list' => $list +)); \ No newline at end of file diff --git a/admin/php/action_list.php b/admin/php/action_list.php new file mode 100644 index 0000000..b7be007 --- /dev/null +++ b/admin/php/action_list.php @@ -0,0 +1,97 @@ + "no match file", + "list" => array(), + "start" => $start, + "total" => count($files) + )); +} + +/* 获取指定范围的列表 */ +$len = count($files); +for ($i = min($end, $len) - 1, $list = array(); $i < $len && $i >= 0 && $i >= $start; $i--) { + $list[] = $files[$i]; +} +//倒序 +//for ($i = $end, $list = array(); $i < $len && $i < $end; $i++){ +// $list[] = $files[$i]; +//} + +/* 返回数据 */ +$result = json_encode(array( + "state" => "SUCCESS", + "list" => $list, + "start" => $start, + "total" => count($files) +)); +//print_r($list); + +return $result; + + +/** + * 遍历获取目录下的指定类型的文件 + * @param $path + * @param array $files + * @return array + */ +function getfiles($path, $allowFiles, &$files = array()) +{ + global $G; + if (!is_dir($path)) return null; + if (substr($path, strlen($path) - 1) != '/') $path .= '/'; + $handle = opendir($path); + while (false !== ($file = readdir($handle))) { + if ($file != '.' && $file != '..') { + $path2 = $path . $file; + if (is_dir($path2)) { + getfiles($path2, $allowFiles, $files); + } else { + if (preg_match("/\.(" . $allowFiles . ")$/i", $file)) { + //echo $path2; + $files[] = array( + + 'url' => $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['SERVER_NAME'] . ':' . $_SERVER['SERVER_PORT'] . dirname(dirname(dirname($_SERVER['REQUEST_URI']))) . substr($path2, strlen($G['sys']['rootdir'])), + 'mtime' => filemtime($path2) + ); + } + } + } + } + return $files; +} \ No newline at end of file diff --git a/admin/php/action_upload.php b/admin/php/action_upload.php new file mode 100644 index 0000000..d55b659 --- /dev/null +++ b/admin/php/action_upload.php @@ -0,0 +1,66 @@ + $CONFIG['imagePathFormat'], + "maxSize" => $CONFIG['imageMaxSize'], + "allowFiles" => $CONFIG['imageAllowFiles'] + ); + $fieldName = $CONFIG['imageFieldName']; + break; + case 'uploadscrawl': + $config = array( + "pathFormat" => $CONFIG['scrawlPathFormat'], + "maxSize" => $CONFIG['scrawlMaxSize'], + "allowFiles" => $CONFIG['scrawlAllowFiles'], + "oriName" => "scrawl.png" + ); + $fieldName = $CONFIG['scrawlFieldName']; + $base64 = "base64"; + break; + case 'uploadvideo': + $config = array( + "pathFormat" => $CONFIG['videoPathFormat'], + "maxSize" => $CONFIG['videoMaxSize'], + "allowFiles" => $CONFIG['videoAllowFiles'] + ); + $fieldName = $CONFIG['videoFieldName']; + break; + case 'uploadfile': + default: + $config = array( + "pathFormat" => $CONFIG['filePathFormat'], + "maxSize" => $CONFIG['fileMaxSize'], + "allowFiles" => $CONFIG['fileAllowFiles'] + ); + $fieldName = $CONFIG['fileFieldName']; + break; +} + +/* 生成上传实例对象并完成上传 */ +$up = new Uploader($fieldName, $config, $base64); + +/** + * 得到上传文件所对应的各个参数,数组结构 + * array( + * "state" => "", //上传状态,上传成功时必须返回"SUCCESS" + * "url" => "", //返回的地址 + * "title" => "", //新文件名 + * "original" => "", //原始文件名 + * "type" => "" //文件类型 + * "size" => "", //文件大小 + * ) + */ + +/* 返回数据 */ +return json_encode($up->getFileInfo()); diff --git a/admin/php/config.json b/admin/php/config.json new file mode 100644 index 0000000..078e7a0 --- /dev/null +++ b/admin/php/config.json @@ -0,0 +1,251 @@ +/* 前后端通信相关的配置,注释只允许使用多行方式 */ +{ + /* 上传图片配置项 */ + "imageActionName": "uploadimage", + /* 执行上传图片的action名称 */ + "imageFieldName": "upfile", + /* 提交的图片表单名称 */ + "imageMaxSize": 2048000, + /* 上传大小限制,单位B */ + "imageAllowFiles": [ + ".png", + ".jpg", + ".jpeg", + ".gif", + ".bmp" + ], + /* 上传图片格式显示 */ + "imageCompressEnable": true, + /* 是否压缩图片,默认是true */ + "imageCompressBorder": 1600, + /* 图片压缩最长边限制 */ + "imageInsertAlign": "none", + /* 插入的图片浮动方式 */ + "imageUrlPrefix": "", + /* 图片访问路径前缀 */ + "imagePathFormat": "/admin/dialogs/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", + /* 上传保存路径,可以自定义保存路径和文件名格式 */ + /* {filename} 会替换成原文件名,配置这项需要注意中文乱码问题 */ + /* {rand:6} 会替换成随机数,后面的数字是随机数的位数 */ + /* {time} 会替换成时间戳 */ + /* {yyyy} 会替换成四位年份 */ + /* {yy} 会替换成两位年份 */ + /* {mm} 会替换成两位月份 */ + /* {dd} 会替换成两位日期 */ + /* {hh} 会替换成两位小时 */ + /* {ii} 会替换成两位分钟 */ + /* {ss} 会替换成两位秒 */ + /* 非法字符 \ : * ? " < > | */ + /* 具请体看线上文档: fex.baidu.com/ueditor/#use-format_upload_filename */ + + /* 涂鸦图片上传配置项 */ + "scrawlActionName": "uploadscrawl", + /* 执行上传涂鸦的action名称 */ + "scrawlFieldName": "upfile", + /* 提交的图片表单名称 */ + "scrawlPathFormat": "/admin/dialogs/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", + /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "scrawlMaxSize": 2048000, + /* 上传大小限制,单位B */ + "scrawlUrlPrefix": "", + /* 图片访问路径前缀 */ + "scrawlInsertAlign": "none", + /* 截图工具上传 */ + "snapscreenActionName": "uploadimage", + /* 执行上传截图的action名称 */ + "snapscreenPathFormat": "/admin/dialogs/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", + /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "snapscreenUrlPrefix": "", + /* 图片访问路径前缀 */ + "snapscreenInsertAlign": "none", + /* 插入的图片浮动方式 */ + + /* 抓取远程图片配置 */ + "catcherLocalDomain": [ + "127.0.0.1", + "localhost", + "img.baidu.com" + ], + "catcherActionName": "catchimage", + /* 执行抓取远程图片的action名称 */ + "catcherFieldName": "source", + /* 提交的图片列表表单名称 */ + "catcherPathFormat": "/admin/dialogs/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", + /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "catcherUrlPrefix": "", + /* 图片访问路径前缀 */ + "catcherMaxSize": 2048000, + /* 上传大小限制,单位B */ + "catcherAllowFiles": [ + ".png", + ".jpg", + ".jpeg", + ".gif", + ".bmp" + ], + /* 抓取图片格式显示 */ + + /* 上传视频配置 */ + "videoActionName": "uploadvideo", + /* 执行上传视频的action名称 */ + "videoFieldName": "upfile", + /* 提交的视频表单名称 */ + "videoPathFormat": "/admin/dialogs/upload/video/{yyyy}{mm}{dd}/{time}{rand:6}", + /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "videoUrlPrefix": "", + /* 视频访问路径前缀 */ + "videoMaxSize": 102400000, + /* 上传大小限制,单位B,默认100MB */ + "videoAllowFiles": [ + ".flv", + ".swf", + ".mkv", + ".avi", + ".rm", + ".rmvb", + ".mpeg", + ".mpg", + ".ogg", + ".ogv", + ".mov", + ".wmv", + ".mp4", + ".webm", + ".mp3", + ".wav", + ".mid" + ], + /* 上传视频格式显示 */ + + /* 上传文件配置 */ + "fileActionName": "uploadfile", + /* controller里,执行上传视频的action名称 */ + "fileFieldName": "upfile", + /* 提交的文件表单名称 */ + "filePathFormat": "/admin/dialogs/upload/file/{yyyy}{mm}{dd}/{time}{rand:6}", + /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "fileUrlPrefix": "", + /* 文件访问路径前缀 */ + "fileMaxSize": 51200000, + /* 上传大小限制,单位B,默认50MB */ + "fileAllowFiles": [ + ".png", + ".jpg", + ".jpeg", + ".gif", + ".bmp", + ".flv", + ".swf", + ".mkv", + ".avi", + ".rm", + ".rmvb", + ".mpeg", + ".mpg", + ".ogg", + ".ogv", + ".mov", + ".wmv", + ".mp4", + ".webm", + ".mp3", + ".wav", + ".mid", + ".rar", + ".zip", + ".tar", + ".gz", + ".7z", + ".bz2", + ".cab", + ".iso", + ".doc", + ".docx", + ".xls", + ".xlsx", + ".ppt", + ".pptx", + ".pdf", + ".txt", + ".md", + ".xml", + ".exe", + ".dll" + ], + /* 上传文件格式显示 */ + + /* 列出指定目录下的图片 */ + "imageManagerActionName": "listimage", + /* 执行图片管理的action名称 */ + "imageManagerListPath": "/admin/dialogs/upload/image/", + /* 指定要列出图片的目录 */ + "imageManagerListSize": 20, + /* 每次列出文件数量 */ + "imageManagerUrlPrefix": "", + /* 图片访问路径前缀 */ + "imageManagerInsertAlign": "none", + /* 插入的图片浮动方式 */ + "imageManagerAllowFiles": [ + ".png", + ".jpg", + ".jpeg", + ".gif", + ".bmp" + ], + /* 列出的文件类型 */ + + /* 列出指定目录下的文件 */ + "fileManagerActionName": "listfile", + /* 执行文件管理的action名称 */ + "fileManagerListPath": "/admin/dialogs/upload/file/", + /* 指定要列出文件的目录 */ + "fileManagerUrlPrefix": "", + /* 文件访问路径前缀 */ + "fileManagerListSize": 20, + /* 每次列出文件数量 */ + "fileManagerAllowFiles": [ + ".png", + ".jpg", + ".jpeg", + ".gif", + ".bmp", + ".flv", + ".swf", + ".mkv", + ".avi", + ".rm", + ".rmvb", + ".mpeg", + ".mpg", + ".ogg", + ".ogv", + ".mov", + ".wmv", + ".mp4", + ".webm", + ".mp3", + ".wav", + ".mid", + ".rar", + ".zip", + ".tar", + ".gz", + ".7z", + ".bz2", + ".cab", + ".iso", + ".doc", + ".docx", + ".xls", + ".xlsx", + ".ppt", + ".pptx", + ".pdf", + ".txt", + ".md", + ".xml", + ".exe", + ".dll" + ] + /* 列出的文件类型 */ +} \ No newline at end of file diff --git a/admin/php/controller.php b/admin/php/controller.php new file mode 100644 index 0000000..63e786d --- /dev/null +++ b/admin/php/controller.php @@ -0,0 +1,61 @@ + '请求地址出错' + )); + break; +} + +/* 输出结果 */ +if (isset($_GET["callback"])) { + if (preg_match("/^[\w_]+$/", $_GET["callback"])) { + echo htmlspecialchars($_GET["callback"]) . '(' . $result . ')'; + } else { + echo json_encode(array( + 'state' => 'callback参数不合法' + )); + } +} else { + echo $result; +} \ No newline at end of file diff --git a/admin/themes/default/css/ueditor.css b/admin/themes/default/css/ueditor.css new file mode 100644 index 0000000..18a1153 --- /dev/null +++ b/admin/themes/default/css/ueditor.css @@ -0,0 +1,1957 @@ +/*基础UI构建 +*/ +/* common layer */ +.edui-default .edui-box { + border: none; + padding: 0; + margin: 0; + overflow: hidden; +} + +.edui-default a.edui-box { + display: block; + text-decoration: none; + color: black; +} + +.edui-default a.edui-box:hover { + text-decoration: none; +} + +.edui-default a.edui-box:active { + text-decoration: none; +} + +.edui-default table.edui-box { + border-collapse: collapse; +} + +.edui-default ul.edui-box { + list-style-type: none; +} + +div.edui-box { + position: relative; + display: -moz-inline-box !important; + display: inline-block !important; + vertical-align: top; +} + +.edui-default .edui-clearfix { + zoom: 1 +} + +.edui-default .edui-clearfix:after { + content: '\20'; + display: block; + clear: both; +} + +* html div.edui-box { + display: inline !important; +} + +*:first-child + html div.edui-box { + display: inline !important; +} + +/* control layout */ +.edui-default .edui-button-body, .edui-splitbutton-body, .edui-menubutton-body, .edui-combox-body { + position: relative; +} + +.edui-default .edui-popup { + position: absolute; + -webkit-user-select: none; + -moz-user-select: none; +} + +.edui-default .edui-popup .edui-shadow { + position: absolute; + z-index: -1; +} + +.edui-default .edui-popup .edui-bordereraser { + position: absolute; + overflow: hidden; +} + +.edui-default .edui-tablepicker .edui-canvas { + position: relative; +} + +.edui-default .edui-tablepicker .edui-canvas .edui-overlay { + position: absolute; +} + +.edui-default .edui-dialog-modalmask, .edui-dialog-dragmask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} + +.edui-default .edui-toolbar { + position: relative; +} + +/* + * default theme + */ +.edui-default .edui-label { + cursor: default; +} + +.edui-default span.edui-clickable { + color: blue; + cursor: pointer; + text-decoration: underline; +} + +.edui-default span.edui-unclickable { + color: gray; + cursor: default; +} + +/* 工具栏 */ +.edui-default .edui-toolbar { + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + padding: 1px; + overflow: hidden; /*全屏下单独一行不占位*/ + zoom: 1; + width: auto; + height: auto; +} + +.edui-default .edui-toolbar .edui-button, +.edui-default .edui-toolbar .edui-splitbutton, +.edui-default .edui-toolbar .edui-menubutton, +.edui-default .edui-toolbar .edui-combox { + margin: 1px; +} + +/*UI工具栏、编辑区域、底部*/ +.edui-default .edui-editor { + border: 1px solid #d4d4d4; + background-color: white; + position: relative; + overflow: visible; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.edui-editor div { + width: auto; + height: auto; +} + +.edui-default .edui-editor-toolbarbox { + position: relative; + zoom: 1; + -webkit-box-shadow: 0 1px 4px rgba(204, 204, 204, 0.6); + -moz-box-shadow: 0 1px 4px rgba(204, 204, 204, 0.6); + box-shadow: 0 1px 4px rgba(204, 204, 204, 0.6); + border-top-left-radius: 2px; + border-top-right-radius: 2px; +} + +.edui-default .edui-editor-toolbarboxouter { + border-bottom: 1px solid #d4d4d4; + background-color: #fafafa; + background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); + background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); + background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); + background-repeat: repeat-x; + /*border: 1px solid #d4d4d4;*/ + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); + *zoom: 1; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); +} + +.edui-default .edui-editor-toolbarboxinner { + padding: 2px; +} + +.edui-default .edui-editor-iframeholder { + position: relative; + /*for fix ie6 toolbarmsg under iframe bug. relative -> static */ + /*_position: static !important;* +} + +.edui-default .edui-editor-iframeholder textarea { + font-family: consolas, "Courier New", "lucida console", monospace; + font-size: 12px; + line-height: 18px; +} + +.edui-default .edui-editor-bottombar { + /*border-top: 1px solid #ccc;*/ + /*height: 20px;*/ + /*width: 40%;*/ + /*float: left;*/ + /*overflow: hidden;*/ +} + +.edui-default .edui-editor-bottomContainer { + overflow: hidden; +} + +.edui-default .edui-editor-bottomContainer table { + width: 100%; + height: 0; + overflow: hidden; + border-spacing: 0; +} + +.edui-default .edui-editor-bottomContainer td { + white-space: nowrap; + border-top: 1px solid #ccc; + line-height: 20px; + font-size: 12px; + font-family: Arial, Helvetica, Tahoma, Verdana, Sans-Serif; +} + +.edui-default .edui-editor-wordcount { + text-align: right; + margin-right: 5px; + color: #aaa; +} + +.edui-default .edui-editor-scale { + width: 12px; +} + +.edui-default .edui-editor-scale .edui-editor-icon { + float: right; + width: 100%; + height: 12px; + margin-top: 10px; + background: url(../images/scale.png) no-repeat; + cursor: se-resize; +} + +.edui-default .edui-editor-breadcrumb { + margin: 2px 0 0 3px; +} + +.edui-default .edui-editor-breadcrumb span { + cursor: pointer; + text-decoration: underline; + color: blue; +} + +.edui-default .edui-toolbar .edui-for-fullscreen { + float: right; +} + +.edui-default .edui-bubble .edui-popup-content { + border: 1px solid #DCAC6C; + background-color: #fff6d9; + padding: 5px; + font-size: 10pt; + font-family: "宋体"; +} + +.edui-default .edui-bubble .edui-shadow { + /*box-shadow: 1px 1px 3px #818181;*/ + /*-webkit-box-shadow: 2px 2px 3px #818181;*/ + /*-moz-box-shadow: 2px 2px 3px #818181;*/ + /*filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius = '2', MakeShadow = 'true', ShadowOpacity = '0.5');*/ +} + +.edui-default .edui-editor-toolbarmsg { + background-color: #FFF6D9; + border-bottom: 1px solid #ccc; + position: absolute; + bottom: -25px; + left: 0; + z-index: 1009; + width: 99.9%; +} + +.edui-default .edui-editor-toolbarmsg-upload { + font-size: 14px; + color: blue; + width: 100px; + height: 16px; + line-height: 16px; + cursor: pointer; + position: absolute; + top: 5px; + left: 350px; +} + +.edui-default .edui-editor-toolbarmsg-label { + font-size: 12px; + line-height: 16px; + padding: 4px; +} + +.edui-default .edui-editor-toolbarmsg-close { + float: right; + width: 20px; + height: 16px; + line-height: 16px; + cursor: pointer; + color: red; +} + +/*可选中菜单按钮*/ +.edui-default .edui-list .edui-bordereraser { + display: none; +} + +.edui-default .edui-listitem { + padding: 1px; + white-space: nowrap; +} + +.edui-default .edui-list .edui-state-hover { + position: relative; + background-color: #fff5d4; + border: 1px solid #dcac6c; + padding: 0; +} + +.edui-default .edui-for-fontfamily .edui-listitem-label { + min-width: 130px; + _width: 120px; + font-size: 12px; + height: 22px; + line-height: 22px; + padding-left: 5px; +} + +.edui-default .edui-for-insertcode .edui-listitem-label { + min-width: 120px; + _width: 120px; + font-size: 12px; + height: 22px; + line-height: 22px; + padding-left: 5px; +} + +.edui-default .edui-for-underline .edui-listitem-label { + min-width: 120px; + _width: 120px; + padding: 3px 5px; + font-size: 12px; +} + +.edui-default .edui-for-fontsize .edui-listitem-label { + min-width: 120px; + _width: 120px; + padding: 3px 5px; + +} + +.edui-default .edui-for-paragraph .edui-listitem-label { + min-width: 200px; + _width: 200px; + padding: 2px 5px; +} + +.edui-default .edui-for-rowspacingtop .edui-listitem-label, +.edui-default .edui-for-rowspacingbottom .edui-listitem-label { + min-width: 53px; + _width: 53px; + padding: 2px 5px; +} + +.edui-default .edui-for-lineheight .edui-listitem-label { + min-width: 53px; + _width: 53px; + padding: 2px 5px; +} + +.edui-default .edui-for-customstyle .edui-listitem-label { + min-width: 200px; + _width: 200px; + width: 200px !important; + padding: 2px 5px; +} + +/* 可选中按钮弹出菜单*/ +.edui-default .edui-menu { + z-index: 3000; +} + +.edui-default .edui-menu .edui-popup-content { + padding: 3px; +} + +.edui-default .edui-menu-body { + _width: 150px; + min-width: 170px; + background: url("../images/sparator_v.png") repeat-y 25px; +} + +.edui-default .edui-menuitem-body { +} + +.edui-default .edui-menuitem { + height: 20px; + cursor: default; + vertical-align: top; +} + +.edui-default .edui-menuitem .edui-icon { + width: 20px !important; + height: 20px !important; + background: url(../images/icons.png) 0 -4000px; + background: url(../images/icons.gif) 0 -4000px \9; +} + +.edui-default .edui-menuitem .edui-label { + font-size: 12px; + line-height: 20px; + height: 20px; + padding-left: 10px; +} + +.edui-default .edui-state-checked .edui-menuitem-body { + background: url("../images/icons-all.gif") no-repeat 6px -205px; +} + +.edui-default .edui-state-disabled .edui-menuitem-label { + color: gray; +} + +/*不可选中菜单按钮 */ +.edui-default .edui-toolbar .edui-combox-body .edui-button-body { + width: 60px; + font-size: 12px; + height: 20px; + line-height: 20px; + padding-left: 5px; + white-space: nowrap; + margin: 0 3px 0 0; +} + +.edui-default .edui-toolbar .edui-combox-body .edui-arrow { + background: url(../images/icons.png) -741px 0; + _background: url(../images/icons.gif) -741px 0; + height: 20px; + width: 9px; +} + +.edui-default .edui-toolbar .edui-combox .edui-combox-body { + border: 1px solid #CCC; + background-color: white; + border-radius: 2px; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; +} + +.edui-default .edui-toolbar .edui-combox-body .edui-splitborder { + display: none; +} + +.edui-default .edui-toolbar .edui-combox-body .edui-arrow { + border-left: 1px solid #CCC; +} + +.edui-default .edui-toolbar .edui-state-hover .edui-combox-body { + background-color: #fff5d4; + border: 1px solid #dcac6c; +} + +.edui-default .edui-toolbar .edui-state-hover .edui-combox-body .edui-arrow { + border-left: 1px solid #dcac6c; +} + +.edui-default .edui-toolbar .edui-state-checked .edui-combox-body { + background-color: #FFE69F; + border: 1px solid #DCAC6C; +} + +.edui-toolbar .edui-state-checked .edui-combox-body .edui-arrow { + border-left: 1px solid #DCAC6C; +} + +.edui-toolbar .edui-state-disabled .edui-combox-body { + background-color: #F0F0EE; + opacity: 0.3; + filter: alpha(opacity=30); +} + +.edui-toolbar .edui-state-opened .edui-combox-body { + background-color: white; + border: 1px solid gray; +} + +/*普通按钮样式及状态*/ +.edui-default .edui-toolbar .edui-button .edui-icon, +.edui-default .edui-toolbar .edui-menubutton .edui-icon, +.edui-default .edui-toolbar .edui-splitbutton .edui-icon { + height: 20px !important; + width: 20px !important; + background-image: url(../images/icons.png); + background-image: url(../images/icons.gif) \9; +} + +.edui-default .edui-toolbar .edui-button .edui-button-wrap { + padding: 1px; + position: relative; +} + +.edui-default .edui-toolbar .edui-button .edui-state-hover .edui-button-wrap { + background-color: #fff5d4; + padding: 0; + border: 1px solid #dcac6c; +} + +.edui-default .edui-toolbar .edui-button .edui-state-checked .edui-button-wrap { + background-color: #ffe69f; + padding: 0; + border: 1px solid #dcac6c; + border-radius: 2px; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; +} + +.edui-default .edui-toolbar .edui-button .edui-state-active .edui-button-wrap { + background-color: #ffffff; + padding: 0; + border: 1px solid gray; +} + +.edui-default .edui-toolbar .edui-state-disabled .edui-label { + color: #ccc; +} + +.edui-default .edui-toolbar .edui-state-disabled .edui-icon { + opacity: 0.3; + filter: alpha(opacity=30); +} + +/* toolbar icons */ +.edui-default .edui-for-undo .edui-icon { + background-position: -160px 0; +} + +.edui-default .edui-for-redo .edui-icon { + background-position: -100px 0; +} + +.edui-default .edui-for-bold .edui-icon { + background-position: 0 0; +} + +.edui-default .edui-for-italic .edui-icon { + background-position: -60px 0; +} + +.edui-default .edui-for-fontborder .edui-icon { + background-position: -160px -40px; +} + +.edui-default .edui-for-underline .edui-icon { + background-position: -140px 0; +} + +.edui-default .edui-for-strikethrough .edui-icon { + background-position: -120px 0; +} + +.edui-default .edui-for-subscript .edui-icon { + background-position: -600px 0; +} + +.edui-default .edui-for-superscript .edui-icon { + background-position: -620px 0; +} + +.edui-default .edui-for-blockquote .edui-icon { + background-position: -220px 0; +} + +.edui-default .edui-for-forecolor .edui-icon { + background-position: -720px 0; +} + +.edui-default .edui-for-backcolor .edui-icon { + background-position: -760px 0; +} + +.edui-default .edui-for-inserttable .edui-icon { + background-position: -580px -20px; +} + +.edui-default .edui-for-autotypeset .edui-icon { + background-position: -640px -40px; +} + +.edui-default .edui-for-justifyleft .edui-icon { + background-position: -460px 0; +} + +.edui-default .edui-for-justifycenter .edui-icon { + background-position: -420px 0; +} + +.edui-default .edui-for-justifyright .edui-icon { + background-position: -480px 0; +} + +.edui-default .edui-for-justifyjustify .edui-icon { + background-position: -440px 0; +} + +.edui-default .edui-for-insertorderedlist .edui-icon { + background-position: -80px 0; +} + +.edui-default .edui-for-insertunorderedlist .edui-icon { + background-position: -20px 0; +} + +.edui-default .edui-for-lineheight .edui-icon { + background-position: -725px -40px; +} + +.edui-default .edui-for-rowspacingbottom .edui-icon { + background-position: -745px -40px; +} + +.edui-default .edui-for-rowspacingtop .edui-icon { + background-position: -765px -40px; +} + +.edui-default .edui-for-horizontal .edui-icon { + background-position: -360px 0; +} + +.edui-default .edui-for-link .edui-icon { + background-position: -500px 0; +} + +.edui-default .edui-for-code .edui-icon { + background-position: -440px -40px; +} + +.edui-default .edui-for-insertimage .edui-icon { + background-position: -726px -77px; +} + +.edui-default .edui-for-insertframe .edui-icon { + background-position: -240px -40px; +} + +.edui-default .edui-for-emoticon .edui-icon { + background-position: -60px -20px; +} + +.edui-default .edui-for-spechars .edui-icon { + background-position: -240px 0; +} + +.edui-default .edui-for-help .edui-icon { + background-position: -340px 0; +} + +.edui-default .edui-for-print .edui-icon { + background-position: -440px -20px; +} + +.edui-default .edui-for-preview .edui-icon { + background-position: -420px -20px; +} + +.edui-default .edui-for-selectall .edui-icon { + background-position: -400px -20px; +} + +.edui-default .edui-for-searchreplace .edui-icon { + background-position: -520px -20px; +} + +.edui-default .edui-for-map .edui-icon { + background-position: -40px -40px; +} + +.edui-default .edui-for-gmap .edui-icon { + background-position: -260px -40px; +} + +.edui-default .edui-for-insertvideo .edui-icon { + background-position: -320px -20px; +} + +.edui-default .edui-for-time .edui-icon { + background-position: -160px -20px; +} + +.edui-default .edui-for-date .edui-icon { + background-position: -140px -20px; +} + +.edui-default .edui-for-cut .edui-icon { + background-position: -680px 0; +} + +.edui-default .edui-for-copy .edui-icon { + background-position: -700px 0; +} + +.edui-default .edui-for-paste .edui-icon { + background-position: -560px 0; +} + +.edui-default .edui-for-formatmatch .edui-icon { + background-position: -40px 0; +} + +.edui-default .edui-for-pasteplain .edui-icon { + background-position: -360px -20px; +} + +.edui-default .edui-for-directionalityltr .edui-icon { + background-position: -20px -20px; +} + +.edui-default .edui-for-directionalityrtl .edui-icon { + background-position: -40px -20px; +} + +.edui-default .edui-for-source .edui-icon { + background-position: -261px -0px; +} + +.edui-default .edui-for-removeformat .edui-icon { + background-position: -580px 0; +} + +.edui-default .edui-for-unlink .edui-icon { + background-position: -640px 0; +} + +.edui-default .edui-for-touppercase .edui-icon { + background-position: -786px 0; +} + +.edui-default .edui-for-tolowercase .edui-icon { + background-position: -806px 0; +} + +.edui-default .edui-for-insertrow .edui-icon { + background-position: -478px -76px; +} + +.edui-default .edui-for-insertrownext .edui-icon { + background-position: -498px -76px; +} + +.edui-default .edui-for-insertcol .edui-icon { + background-position: -455px -76px; +} + +.edui-default .edui-for-insertcolnext .edui-icon { + background-position: -429px -76px; +} + +.edui-default .edui-for-mergeright .edui-icon { + background-position: -60px -40px; +} + +.edui-default .edui-for-mergedown .edui-icon { + background-position: -80px -40px; +} + +.edui-default .edui-for-splittorows .edui-icon { + background-position: -100px -40px; +} + +.edui-default .edui-for-splittocols .edui-icon { + background-position: -120px -40px; +} + +.edui-default .edui-for-insertparagraphbeforetable .edui-icon { + background-position: -140px -40px; +} + +.edui-default .edui-for-deleterow .edui-icon { + background-position: -660px -20px; +} + +.edui-default .edui-for-deletecol .edui-icon { + background-position: -640px -20px; +} + +.edui-default .edui-for-splittocells .edui-icon { + background-position: -800px -20px; +} + +.edui-default .edui-for-mergecells .edui-icon { + background-position: -760px -20px; +} + +.edui-default .edui-for-deletetable .edui-icon { + background-position: -620px -20px; +} + +.edui-default .edui-for-cleardoc .edui-icon { + background-position: -520px 0; +} + +.edui-default .edui-for-fullscreen .edui-icon { + background-position: -100px -20px; +} + +.edui-default .edui-for-anchor .edui-icon { + background-position: -200px 0; +} + +.edui-default .edui-for-pagebreak .edui-icon { + background-position: -460px -40px; +} + +.edui-default .edui-for-imagenone .edui-icon { + background-position: -480px -40px; +} + +.edui-default .edui-for-imageleft .edui-icon { + background-position: -500px -40px; +} + +.edui-default .edui-for-wordimage .edui-icon { + background-position: -660px -40px; +} + +.edui-default .edui-for-imageright .edui-icon { + background-position: -520px -40px; +} + +.edui-default .edui-for-imagecenter .edui-icon { + background-position: -540px -40px; +} + +.edui-default .edui-for-indent .edui-icon { + background-position: -400px 0; +} + +.edui-default .edui-for-outdent .edui-icon { + background-position: -540px 0; +} + +.edui-default .edui-for-webapp .edui-icon { + background-position: -601px -40px +} + +.edui-default .edui-for-table .edui-icon { + background-position: -580px -20px; +} + +.edui-default .edui-for-edittable .edui-icon { + background-position: -420px -40px; +} + +.edui-default .edui-for-template .edui-icon { + background-position: -339px -40px; +} + +.edui-default .edui-for-delete .edui-icon { + background-position: -360px -40px; +} + +.edui-default .edui-for-attachment .edui-icon { + background-position: -620px -40px; +} + +.edui-default .edui-for-edittd .edui-icon { + background-position: -700px -40px; +} + +.edui-default .edui-for-snapscreen .edui-icon { + background-position: -581px -40px +} + +.edui-default .edui-for-scrawl .edui-icon { + background-position: -801px -41px +} + +.edui-default .edui-for-background .edui-icon { + background-position: -680px -40px; +} + +.edui-default .edui-for-music .edui-icon { + background-position: -18px -40px +} + +.edui-default .edui-for-formula .edui-icon { + background-position: -200px -40px +} + +.edui-default .edui-for-aligntd .edui-icon { + background-position: -236px -76px; +} + +.edui-default .edui-for-insertparagraphtrue .edui-icon { + background-position: -625px -76px; +} + +.edui-default .edui-for-insertparagraph .edui-icon { + background-position: -602px -76px; +} + +.edui-default .edui-for-insertcaption .edui-icon { + background-position: -336px -76px; +} + +.edui-default .edui-for-deletecaption .edui-icon { + background-position: -362px -76px; +} + +.edui-default .edui-for-inserttitle .edui-icon { + background-position: -286px -76px; +} + +.edui-default .edui-for-deletetitle .edui-icon { + background-position: -311px -76px; +} + +.edui-default .edui-for-aligntable .edui-icon { + background-position: -440px 0; +} + +.edui-default .edui-for-tablealignment-left .edui-icon { + background-position: -460px 0; +} + +.edui-default .edui-for-tablealignment-center .edui-icon { + background-position: -420px 0; +} + +.edui-default .edui-for-tablealignment-right .edui-icon { + background-position: -480px 0; +} + +.edui-default .edui-for-drafts .edui-icon { + background-position: -560px 0; +} + +.edui-default .edui-for-charts .edui-icon { + background: url(../images/charts.png) no-repeat 2px 3px !important; +} + +.edui-default .edui-for-inserttitlecol .edui-icon { + background-position: -673px -76px; +} + +.edui-default .edui-for-deletetitlecol .edui-icon { + background-position: -698px -76px; +} + +.edui-default .edui-for-simpleupload .edui-icon { + background-position: -380px 0px; +} + +/*splitbutton*/ +.edui-default .edui-toolbar .edui-splitbutton-body .edui-arrow, +.edui-default .edui-toolbar .edui-menubutton-body .edui-arrow { + background: url(../images/icons.png) -741px 0; + _background: url(../images/icons.gif) -741px 0; + height: 20px; + width: 9px; +} + +.edui-default .edui-toolbar .edui-splitbutton .edui-splitbutton-body, +.edui-default .edui-toolbar .edui-menubutton .edui-menubutton-body { + padding: 1px; +} + +.edui-default .edui-toolbar .edui-splitborder { + width: 1px; + height: 20px; +} + +.edui-default .edui-toolbar .edui-state-hover .edui-splitborder { + width: 1px; + border-left: 0px solid #dcac6c; +} + +.edui-default .edui-toolbar .edui-state-active .edui-splitborder { + width: 0; + border-left: 1px solid gray; +} + +.edui-default .edui-toolbar .edui-state-opened .edui-splitborder { + width: 1px; + border: 0; +} + +.edui-default .edui-toolbar .edui-splitbutton .edui-state-hover .edui-splitbutton-body, +.edui-default .edui-toolbar .edui-menubutton .edui-state-hover .edui-menubutton-body { + background-color: #fff5d4; + border: 1px solid #dcac6c; + padding: 0; +} + +.edui-default .edui-toolbar .edui-splitbutton .edui-state-checked .edui-splitbutton-body, +.edui-default .edui-toolbar .edui-menubutton .edui-state-checked .edui-menubutton-body { + background-color: #FFE69F; + border: 1px solid #DCAC6C; + padding: 0; +} + +.edui-default .edui-toolbar .edui-splitbutton .edui-state-active .edui-splitbutton-body, +.edui-default .edui-toolbar .edui-menubutton .edui-state-active .edui-menubutton-body { + background-color: #ffffff; + border: 1px solid gray; + padding: 0; +} + +.edui-default .edui-state-disabled .edui-arrow { + opacity: 0.3; + _filter: alpha(opacity=30); +} + +.edui-default .edui-toolbar .edui-splitbutton .edui-state-opened .edui-splitbutton-body, +.edui-default .edui-toolbar .edui-menubutton .edui-state-opened .edui-menubutton-body { + background-color: white; + border: 1px solid gray; + padding: 0; +} + +.edui-default .edui-for-insertorderedlist .edui-bordereraser, +.edui-default .edui-for-lineheight .edui-bordereraser, +.edui-default .edui-for-rowspacingtop .edui-bordereraser, +.edui-default .edui-for-rowspacingbottom .edui-bordereraser, +.edui-default .edui-for-insertunorderedlist .edui-bordereraser { + background-color: white; +} + +/* 解决嵌套导致的图标问题 */ +.edui-default .edui-for-insertorderedlist .edui-popup-body .edui-icon, +.edui-default .edui-for-lineheight .edui-popup-body .edui-icon, +.edui-default .edui-for-rowspacingtop .edui-popup-body .edui-icon, +.edui-default .edui-for-rowspacingbottom .edui-popup-body .edui-icon, +.edui-default .edui-for-insertunorderedlist .edui-popup-body .edui-icon { + /*background-position: 0 -40px;*/ + background-image: none; +} + +/* 弹出菜单 */ +.edui-default .edui-popup { + z-index: 3000; + background-color: #ffffff; + width: auto; + height: auto; + +} + +.edui-default .edui-popup .edui-shadow { + left: 0; + top: 0; + width: 100%; + height: 100%; +} + +.edui-default .edui-popup-content { + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); + box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + padding: 5px; + background: #ffffff; +} + +.edui-default .edui-popup .edui-bordereraser { + background-color: white; + height: 3px; +} + +.edui-default .edui-menu .edui-bordereraser { + height: 3px; +} + +.edui-default .edui-anchor-topleft .edui-bordereraser { + left: 1px; + top: -2px; +} + +.edui-default .edui-anchor-topright .edui-bordereraser { + right: 1px; + top: -2px; +} + +.edui-default .edui-anchor-bottomleft .edui-bordereraser { + left: 0; + bottom: -6px; + height: 7px; + border-left: 1px solid gray; + border-right: 1px solid gray; +} + +.edui-default .edui-anchor-bottomright .edui-bordereraser { + right: 0; + bottom: -6px; + height: 7px; + border-left: 1px solid gray; + border-right: 1px solid gray; +} + +.edui-popup div { + width: auto; + height: auto; +} + +.edui-default .edui-editor-messageholder { + display: block; + width: 150px; + height: auto; + border: 0; + margin: 0; + padding: 0; + position: absolute; + top: 28px; + right: 3px; +} + +.edui-default .edui-message { + min-height: 10px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + padding: 0; + margin-bottom: 3px; + position: relative; +} + +.edui-default .edui-message-body { + border-radius: 3px; + padding: 8px 15px 8px 8px; + color: #c09853; + background-color: #fcf8e3; + border: 1px solid #fbeed5; +} + +.edui-default .edui-message-type-info { + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1 +} + +.edui-default .edui-message-type-success { + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6 +} + +.edui-default .edui-message-type-danger, +.edui-default .edui-message-type-error { + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7 +} + +.edui-default .edui-message .edui-message-closer { + display: block; + width: 16px; + height: 16px; + line-height: 16px; + position: absolute; + top: 0; + right: 0; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + float: right; + font-size: 20px; + font-weight: bold; + color: #999; + text-shadow: 0 1px 0 #fff; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +.edui-default .edui-message .edui-message-content { + font-size: 10pt; + word-wrap: break-word; + word-break: normal; +} + +/* 弹出对话框按钮和对话框大小 */ +.edui-default .edui-dialog { + z-index: 2000; + position: absolute; + +} + +.edui-dialog div { + width: auto; +} + +.edui-default .edui-dialog-wrap { + margin-right: 6px; + margin-bottom: 6px; +} + +.edui-default .edui-dialog-fullscreen-flag { + margin-right: 0; + margin-bottom: 0; +} + +.edui-default .edui-dialog-body { + position: relative; + padding: 2px 0 0 2px; + _zoom: 1; +} + +.edui-default .edui-dialog-fullscreen-flag .edui-dialog-body { + padding: 0; +} + +.edui-default .edui-dialog-shadow { + position: absolute; + z-index: -1; + left: 0; + top: 0; + width: 100%; + height: 100%; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.edui-default .edui-dialog-foot { + background-color: white; +} + +.edui-default .edui-dialog-titlebar { + height: 26px; + border-bottom: 1px solid #c6c6c6; + background: url(../images/dialog-title-bg.png) repeat-x bottom; + position: relative; + cursor: move; +} + +.edui-default .edui-dialog-caption { + font-weight: bold; + font-size: 12px; + line-height: 26px; + padding-left: 5px; +} + +.edui-default .edui-dialog-draghandle { + height: 26px; +} + +.edui-default .edui-dialog-closebutton { + position: absolute !important; + right: 5px; + top: 3px; +} + +.edui-default .edui-dialog-closebutton .edui-button-body { + height: 20px; + width: 20px; + cursor: pointer; + background: url("../images/icons-all.gif") no-repeat 0 -59px; +} + +.edui-default .edui-dialog-closebutton .edui-state-hover .edui-button-body { + background: url("../images/icons-all.gif") no-repeat 0 -89px; +} + +.edui-default .edui-dialog-foot { + height: 40px; +} + +.edui-default .edui-dialog-buttons { + position: absolute; + right: 0; +} + +.edui-default .edui-dialog-buttons .edui-button { + margin-right: 10px; +} + +.edui-default .edui-dialog-buttons .edui-button .edui-button-body { + background: url("../images/icons-all.gif") no-repeat; + height: 24px; + width: 96px; + font-size: 12px; + line-height: 24px; + text-align: center; + cursor: default; +} + +.edui-default .edui-dialog-buttons .edui-button .edui-state-hover .edui-button-body { + background: url("../images/icons-all.gif") no-repeat 0 -30px; +} + +.edui-default .edui-dialog iframe { + border: 0; + padding: 0; + margin: 0; + vertical-align: top; +} + +.edui-default .edui-dialog-modalmask { + opacity: 0.3; + filter: alpha(opacity=30); + background-color: #ccc; + position: absolute; + /*z-index: 1999;*/ +} + +.edui-default .edui-dialog-dragmask { + position: absolute; + /*z-index: 2001;*/ + background-color: transparent; + cursor: move; +} + +.edui-default .edui-dialog-content { + position: relative; +} + +.edui-default .dialogcontmask { + cursor: move; + visibility: hidden; + display: block; + position: absolute; + width: 100%; + height: 100%; + opacity: 0; + filter: alpha(opacity=0); +} + +/*link-dialog*/ +.edui-default .edui-for-link .edui-dialog-content { + width: 420px; + height: 200px; + overflow: hidden; +} + +/*background-dialog*/ +.edui-default .edui-for-background .edui-dialog-content { + width: 440px; + height: 280px; + overflow: hidden; +} + +/*template-dialog*/ +.edui-default .edui-for-template .edui-dialog-content { + width: 630px; + height: 390px; + overflow: hidden; +} + +/*scrawl-dialog*/ +.edui-default .edui-for-scrawl .edui-dialog-content { + width: 515px; + *width: 506px; + height: 360px; +} + +/*spechars-dialog*/ +.edui-default .edui-for-spechars .edui-dialog-content { + width: 620px; + height: 500px; + *width: 630px; + *height: 570px; +} + +/*image-dialog*/ +.edui-default .edui-for-insertimage .edui-dialog-content { + width: 650px; + height: 400px; + overflow: hidden; +} + +/*webapp-dialog*/ +.edui-default .edui-for-webapp .edui-dialog-content { + width: 560px; + _width: 565px; + height: 450px; + overflow: hidden; +} + +/*image-insertframe*/ +.edui-default .edui-for-insertframe .edui-dialog-content { + width: 350px; + height: 200px; + overflow: hidden; +} + +/*wordImage-dialog*/ +.edui-default .edui-for-wordimage .edui-dialog-content { + width: 620px; + height: 380px; + overflow: hidden; +} + +/*attachment-dialog*/ +.edui-default .edui-for-attachment .edui-dialog-content { + width: 650px; + height: 400px; + overflow: hidden; +} + +/*map-dialog*/ +.edui-default .edui-for-map .edui-dialog-content { + width: 550px; + height: 400px; +} + +/*gmap-dialog*/ +.edui-default .edui-for-gmap .edui-dialog-content { + width: 550px; + height: 400px; +} + +/*video-dialog*/ +.edui-default .edui-for-insertvideo .edui-dialog-content { + width: 590px; + height: 390px; +} + +/*anchor-dialog*/ +.edui-default .edui-for-anchor .edui-dialog-content { + width: 320px; + height: 60px; + overflow: hidden; +} + +/*searchreplace-dialog*/ +.edui-default .edui-for-searchreplace .edui-dialog-content { + width: 400px; + height: 220px; +} + +/*help-dialog*/ +.edui-default .edui-for-help .edui-dialog-content { + width: 400px; + height: 420px; +} + +/*edittable-dialog*/ +.edui-default .edui-for-edittable .edui-dialog-content { + width: 540px; + _width: 590px; + height: 335px; +} + +/*edittip-dialog*/ +.edui-default .edui-for-edittip .edui-dialog-content { + width: 225px; + height: 60px; +} + +/*edittd-dialog*/ +.edui-default .edui-for-edittd .edui-dialog-content { + width: 240px; + height: 50px; +} + +/*snapscreen-dialog*/ +.edui-default .edui-for-snapscreen .edui-dialog-content { + width: 400px; + height: 220px; +} + +/*music-dialog*/ +.edui-default .edui-for-music .edui-dialog-content { + width: 515px; + height: 360px; +} + +/*段落弹出菜单*/ +.edui-default .edui-for-paragraph .edui-listitem-label { + font-family: Tahoma, Verdana, Arial, Helvetica; +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-p { + font-size: 22px; + line-height: 27px; +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h1 { + font-weight: bolder; + font-size: 32px; + line-height: 36px; +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h2 { + font-weight: bolder; + font-size: 27px; + line-height: 29px; +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h3 { + font-weight: bolder; + font-size: 19px; + line-height: 23px; +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h4 { + font-weight: bolder; + font-size: 16px; + line-height: 19px +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h5 { + font-weight: bolder; + font-size: 13px; + line-height: 16px; +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h6 { + font-weight: bolder; + font-size: 12px; + line-height: 14px; +} + +/* 表格弹出菜单 */ +.edui-default .edui-for-inserttable .edui-splitborder { + display: none +} + +.edui-default .edui-for-inserttable .edui-splitbutton-body .edui-arrow { + width: 0 +} + +.edui-default .edui-toolbar .edui-for-inserttable .edui-state-active .edui-splitborder { + border-left: 1px solid transparent; +} + +.edui-default .edui-tablepicker .edui-infoarea { + height: 14px; + line-height: 14px; + font-size: 12px; + width: 220px; + margin-bottom: 3px; + clear: both; +} + +.edui-default .edui-tablepicker .edui-infoarea .edui-label { + float: left; +} + +.edui-default .edui-dialog-buttons .edui-label { + line-height: 24px; +} + +.edui-default .edui-tablepicker .edui-infoarea .edui-clickable { + float: right; +} + +.edui-default .edui-tablepicker .edui-pickarea { + background: url("../images/unhighlighted.gif") repeat; + height: 220px; + width: 220px; +} + +.edui-default .edui-tablepicker .edui-pickarea .edui-overlay { + background: url("../images/highlighted.gif") repeat; +} + +/* 颜色弹出菜单 */ +.edui-default .edui-colorpicker-topbar { + height: 27px; + width: 200px; + /*border-bottom: 1px gray dashed;*/ +} + +.edui-default .edui-colorpicker-preview { + height: 20px; + border: 1px inset black; + margin-left: 1px; + width: 128px; + float: left; +} + +.edui-default .edui-colorpicker-nocolor { + float: right; + margin-right: 1px; + font-size: 12px; + line-height: 14px; + height: 14px; + border: 1px solid #333; + padding: 3px 5px; + cursor: pointer; +} + +.edui-default .edui-colorpicker-tablefirstrow { + height: 30px; +} + +.edui-default .edui-colorpicker-colorcell { + width: 14px; + height: 14px; + display: block; + margin: 0; + cursor: pointer; +} + +.edui-default .edui-colorpicker-colorcell:hover { + width: 14px; + height: 14px; + margin: 0; +} + +.edui-default .edui-colorpicker-advbtn { + display: block; + text-align: center; + cursor: pointer; + height: 20px; +} + +.arrow_down { + background: white url('../images/arrow_down.png') no-repeat center; +} + +.arrow_up { + background: white url('../images/arrow_up.png') no-repeat center; +} + +/*高级的样式*/ +.edui-colorpicker-adv { + position: relative; + overflow: hidden; + height: 180px; + display: none; +} + +.edui-colorpicker-plant, .edui-colorpicker-hue { + border: solid 1px #666; +} + +.edui-colorpicker-pad { + width: 150px; + height: 150px; + left: 14px; + top: 13px; + position: absolute; + background: red; + overflow: hidden; + cursor: crosshair; +} + +.edui-colorpicker-cover { + position: absolute; + top: 0; + left: 0; + width: 150px; + height: 150px; + background: url("../images/tangram-colorpicker.png") -160px -200px; +} + +.edui-colorpicker-padDot { + position: absolute; + top: 0; + left: 0; + width: 11px; + height: 11px; + overflow: hidden; + background: url(../images/tangram-colorpicker.png) 0px -200px repeat-x; + z-index: 1000; + +} + +.edui-colorpicker-sliderMain { + position: absolute; + left: 171px; + top: 13px; + width: 19px; + height: 152px; + background: url(../images/tangram-colorpicker.png) -179px -12px no-repeat; + +} + +.edui-colorpicker-slider { + width: 100%; + height: 100%; + cursor: pointer; +} + +.edui-colorpicker-thumb { + position: absolute; + top: 0; + cursor: pointer; + height: 3px; + left: -1px; + right: -1px; + border: 1px solid black; + background: white; + opacity: .8; +} + +/*自动排版弹出菜单*/ +.edui-default .edui-autotypesetpicker .edui-autotypesetpicker-body { + font-size: 12px; + margin-bottom: 3px; + clear: both; +} + +.edui-default .edui-autotypesetpicker-body table { + border-collapse: separate; + border-spacing: 2px; +} + +.edui-default .edui-autotypesetpicker-body td { + font-size: 12px; + word-wrap: break-word; +} + +.edui-default .edui-autotypesetpicker-body td input { + margin: 3px 3px 3px 4px; + *margin: 1px 0 0 0; +} + +/*自动排版弹出菜单*/ +.edui-default .edui-cellalignpicker .edui-cellalignpicker-body { + width: 70px; + font-size: 12px; + cursor: default; +} + +.edui-default .edui-cellalignpicker-body table { + border-collapse: separate; + border-spacing: 0; +} + +.edui-default .edui-cellalignpicker-body td { + padding: 1px; +} + +.edui-default .edui-cellalignpicker-body .edui-icon { + height: 20px; + width: 20px; + padding: 1px; + background-image: url(../images/table-cell-align.png); +} + +.edui-default .edui-cellalignpicker-body .edui-left { + background-position: 0 0; +} + +.edui-default .edui-cellalignpicker-body .edui-center { + background-position: -25px 0; +} + +.edui-default .edui-cellalignpicker-body .edui-right { + background-position: -51px 0; +} + +.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-left { + background-position: -73px 0; +} + +.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-center { + background-position: -98px 0; +} + +.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-right { + background-position: -124px 0; +} + +.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-left { + background-position: -146px 0; + background-color: #f1f4f5; +} + +.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-center { + background-position: -245px 0; +} + +.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-right { + background-position: -271px 0; +} + +/*分隔线*/ +.edui-default .edui-toolbar .edui-separator { + width: 2px; + height: 20px; + margin: 2px 4px 2px 3px; + background: url(../images/icons.png) -181px 0; + background: url(../images/icons.gif) -181px 0 \9; +} + +/*颜色按钮 */ +.edui-default .edui-toolbar .edui-colorbutton .edui-colorlump { + position: absolute; + overflow: hidden; + bottom: 1px; + left: 1px; + width: 18px; + height: 4px; +} + +/*表情按钮及弹出菜单*/ +/*去除了表情的下拉箭头*/ +.edui-default .edui-for-emotion .edui-icon { + background-position: -60px -20px; +} + +.edui-default .edui-for-emotion .edui-popup-content iframe { + width: 514px; + height: 380px; + overflow: hidden; +} + +.edui-default .edui-for-emotion .edui-popup-content { + position: relative; + z-index: 555 +} + +.edui-default .edui-for-emotion .edui-splitborder { + display: none +} + +.edui-default .edui-for-emotion .edui-splitbutton-body .edui-arrow { + width: 0 +} + +.edui-default .edui-toolbar .edui-for-emotion .edui-state-active .edui-splitborder { + border-left: 1px solid transparent; +} + +/*contextmenu*/ +.edui-default .edui-hassubmenu .edui-arrow { + height: 20px; + width: 20px; + float: right; + background: url("../images/icons-all.gif") no-repeat 10px -233px; +} + +.edui-default .edui-menu-body .edui-menuitem { + padding: 1px; +} + +.edui-default .edui-menuseparator { + margin: 2px 0; + height: 1px; + overflow: hidden; +} + +.edui-default .edui-menuseparator-inner { + border-bottom: 1px solid #e2e3e3; + margin-left: 29px; + margin-right: 1px; +} + +.edui-default .edui-menu-body .edui-state-hover { + padding: 0 !important; + background-color: #fff5d4; + border: 1px solid #dcac6c; +} + +/*弹出菜单*/ +.edui-default .edui-shortcutmenu { + padding: 2px; + width: 190px; + height: 50px; + background-color: #fff; + border: 1px solid #ccc; + border-radius: 5px; +} + +/*粘贴弹出菜单*/ +.edui-default .edui-wordpastepop .edui-popup-content { + border: none; + padding: 0; + width: 54px; + height: 21px; +} + +.edui-default .edui-pasteicon { + width: 100%; + height: 100%; + background-image: url('../images/wordpaste.png'); + background-position: 0 0; +} + +.edui-default .edui-pasteicon.edui-state-opened { + background-position: 0 -34px; +} + +.edui-default .edui-pastecontainer { + position: relative; + visibility: hidden; + width: 97px; + background: #fff; + border: 1px solid #ccc; +} + +.edui-default .edui-pastecontainer .edui-title { + font-weight: bold; + background: #F8F8FF; + height: 25px; + line-height: 25px; + font-size: 12px; + padding-left: 5px; +} + +.edui-default .edui-pastecontainer .edui-button { + overflow: hidden; + margin: 3px 0; +} + +.edui-default .edui-pastecontainer .edui-button .edui-richtxticon, +.edui-default .edui-pastecontainer .edui-button .edui-tagicon, +.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon { + float: left; + cursor: pointer; + width: 29px; + height: 29px; + margin-left: 5px; + background-image: url('../images/wordpaste.png'); + background-repeat: no-repeat; +} + +.edui-default .edui-pastecontainer .edui-button .edui-richtxticon { + margin-left: 0; + background-position: -109px 0; +} + +.edui-default .edui-pastecontainer .edui-button .edui-tagicon { + background-position: -148px 1px; +} + +.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon { + background-position: -72px 0; +} + +.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-richtxticon { + background-position: -109px -34px; +} + +.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-tagicon { + background-position: -148px -34px; +} + +.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-plaintxticon { + background-position: -72px -34px; +} \ No newline at end of file diff --git a/admin/themes/default/css/ueditor.min.css b/admin/themes/default/css/ueditor.min.css new file mode 100644 index 0000000..4bc00c7 --- /dev/null +++ b/admin/themes/default/css/ueditor.min.css @@ -0,0 +1,8 @@ +/*! + * UEditor + * version: ueditor + * build: Wed Aug 10 2016 11:06:03 GMT+0800 (CST) + */ + + +.edui-default .edui-box{border:0;padding:0;margin:0;overflow:hidden}.edui-default a.edui-box{display:block;text-decoration:none;color:#000}.edui-default a.edui-box:hover{text-decoration:none}.edui-default a.edui-box:active{text-decoration:none}.edui-default table.edui-box{border-collapse:collapse}.edui-default ul.edui-box{list-style-type:none}div.edui-box{position:relative;display:-moz-inline-box!important;display:inline-block!important;vertical-align:top}.edui-default .edui-clearfix{zoom:1}.edui-default .edui-clearfix:after{content:'\20';display:block;clear:both}* html div.edui-box{display:inline!important}:first-child+html div.edui-box{display:inline!important}.edui-default .edui-button-body,.edui-splitbutton-body,.edui-menubutton-body,.edui-combox-body{position:relative}.edui-default .edui-popup{position:absolute;-webkit-user-select:none;-moz-user-select:none}.edui-default .edui-popup .edui-shadow{position:absolute;z-index:-1}.edui-default .edui-popup .edui-bordereraser{position:absolute;overflow:hidden}.edui-default .edui-tablepicker .edui-canvas{position:relative}.edui-default .edui-tablepicker .edui-canvas .edui-overlay{position:absolute}.edui-default .edui-dialog-modalmask,.edui-dialog-dragmask{position:absolute;left:0;top:0;width:100%;height:100%}.edui-default .edui-toolbar{position:relative}.edui-default .edui-label{cursor:default}.edui-default span.edui-clickable{color:#00f;cursor:pointer;text-decoration:underline}.edui-default span.edui-unclickable{color:gray;cursor:default}.edui-default .edui-toolbar{cursor:default;-webkit-user-select:none;-moz-user-select:none;padding:1px;overflow:hidden;zoom:1;width:auto;height:auto}.edui-default .edui-toolbar .edui-button,.edui-default .edui-toolbar .edui-splitbutton,.edui-default .edui-toolbar .edui-menubutton,.edui-default .edui-toolbar .edui-combox{margin:1px}.edui-default .edui-editor{border:1px solid #d4d4d4;background-color:#fff;position:relative;overflow:visible;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.edui-editor div{width:auto;height:auto}.edui-default .edui-editor-toolbarbox{position:relative;zoom:1;-webkit-box-shadow:0 1px 4px rgba(204,204,204,.6);-moz-box-shadow:0 1px 4px rgba(204,204,204,.6);box-shadow:0 1px 4px rgba(204,204,204,.6);border-top-left-radius:2px;border-top-right-radius:2px}.edui-default .edui-editor-toolbarboxouter{border-bottom:1px solid #d4d4d4;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,.065);box-shadow:0 1px 4px rgba(0,0,0,.065)}.edui-default .edui-editor-toolbarboxinner{padding:2px}.edui-default .edui-editor-iframeholder{position:relative}.edui-default .edui-editor-bottomContainer{overflow:hidden}.edui-default .edui-editor-bottomContainer table{width:100%;height:0;overflow:hidden;border-spacing:0}.edui-default .edui-editor-bottomContainer td{white-space:nowrap;border-top:1px solid #ccc;line-height:20px;font-size:12px;font-family:Arial,Helvetica,Tahoma,Verdana,Sans-Serif}.edui-default .edui-editor-wordcount{text-align:right;margin-right:5px;color:#aaa}.edui-default .edui-editor-scale{width:12px}.edui-default .edui-editor-scale .edui-editor-icon{float:right;width:100%;height:12px;margin-top:10px;background:url(../images/scale.png) no-repeat;cursor:se-resize}.edui-default .edui-editor-breadcrumb{margin:2px 0 0 3px}.edui-default .edui-editor-breadcrumb span{cursor:pointer;text-decoration:underline;color:#00f}.edui-default .edui-toolbar .edui-for-fullscreen{float:right}.edui-default .edui-bubble .edui-popup-content{border:1px solid #DCAC6C;background-color:#fff6d9;padding:5px;font-size:10pt;font-family:"宋体"}.edui-default .edui-bubble .edui-shadow{}.edui-default .edui-editor-toolbarmsg{background-color:#FFF6D9;border-bottom:1px solid #ccc;position:absolute;bottom:-25px;left:0;z-index:1009;width:99.9%}.edui-default .edui-editor-toolbarmsg-upload{font-size:14px;color:#00f;width:100px;height:16px;line-height:16px;cursor:pointer;position:absolute;top:5px;left:350px}.edui-default .edui-editor-toolbarmsg-label{font-size:12px;line-height:16px;padding:4px}.edui-default .edui-editor-toolbarmsg-close{float:right;width:20px;height:16px;line-height:16px;cursor:pointer;color:red}.edui-default .edui-list .edui-bordereraser{display:none}.edui-default .edui-listitem{padding:1px;white-space:nowrap}.edui-default .edui-list .edui-state-hover{position:relative;background-color:#fff5d4;border:1px solid #dcac6c;padding:0}.edui-default .edui-for-fontfamily .edui-listitem-label{min-width:130px;_width:120px;font-size:12px;height:22px;line-height:22px;padding-left:5px}.edui-default .edui-for-insertcode .edui-listitem-label{min-width:120px;_width:120px;font-size:12px;height:22px;line-height:22px;padding-left:5px}.edui-default .edui-for-underline .edui-listitem-label{min-width:120px;_width:120px;padding:3px 5px;font-size:12px}.edui-default .edui-for-fontsize .edui-listitem-label{min-width:120px;_width:120px;padding:3px 5px}.edui-default .edui-for-paragraph .edui-listitem-label{min-width:200px;_width:200px;padding:2px 5px}.edui-default .edui-for-rowspacingtop .edui-listitem-label,.edui-default .edui-for-rowspacingbottom .edui-listitem-label{min-width:53px;_width:53px;padding:2px 5px}.edui-default .edui-for-lineheight .edui-listitem-label{min-width:53px;_width:53px;padding:2px 5px}.edui-default .edui-for-customstyle .edui-listitem-label{min-width:200px;_width:200px;width:200px!important;padding:2px 5px}.edui-default .edui-menu{z-index:3000}.edui-default .edui-menu .edui-popup-content{padding:3px}.edui-default .edui-menu-body{_width:150px;min-width:170px;background:url(../images/sparator_v.png) repeat-y 25px}.edui-default .edui-menuitem-body{}.edui-default .edui-menuitem{height:20px;cursor:default;vertical-align:top}.edui-default .edui-menuitem .edui-icon{width:20px!important;height:20px!important;background:url(../images/icons.png) 0 -4000px;background:url(../images/icons.gif) 0 -4000px\9}.edui-default .edui-menuitem .edui-label{font-size:12px;line-height:20px;height:20px;padding-left:10px}.edui-default .edui-state-checked .edui-menuitem-body{background:url(../images/icons-all.gif) no-repeat 6px -205px}.edui-default .edui-state-disabled .edui-menuitem-label{color:gray}.edui-default .edui-toolbar .edui-combox-body .edui-button-body{width:60px;font-size:12px;height:20px;line-height:20px;padding-left:5px;white-space:nowrap;margin:0 3px 0 0}.edui-default .edui-toolbar .edui-combox-body .edui-arrow{background:url(../images/icons.png) -741px 0;_background:url(../images/icons.gif) -741px 0;height:20px;width:9px}.edui-default .edui-toolbar .edui-combox .edui-combox-body{border:1px solid #CCC;background-color:#fff;border-radius:2px;-webkit-border-radius:2px;-moz-border-radius:2px}.edui-default .edui-toolbar .edui-combox-body .edui-splitborder{display:none}.edui-default .edui-toolbar .edui-combox-body .edui-arrow{border-left:1px solid #CCC}.edui-default .edui-toolbar .edui-state-hover .edui-combox-body{background-color:#fff5d4;border:1px solid #dcac6c}.edui-default .edui-toolbar .edui-state-hover .edui-combox-body .edui-arrow{border-left:1px solid #dcac6c}.edui-default .edui-toolbar .edui-state-checked .edui-combox-body{background-color:#FFE69F;border:1px solid #DCAC6C}.edui-toolbar .edui-state-checked .edui-combox-body .edui-arrow{border-left:1px solid #DCAC6C}.edui-toolbar .edui-state-disabled .edui-combox-body{background-color:#F0F0EE;opacity:.3;filter:alpha(opacity=30)}.edui-toolbar .edui-state-opened .edui-combox-body{background-color:#fff;border:1px solid gray}.edui-default .edui-toolbar .edui-button .edui-icon,.edui-default .edui-toolbar .edui-menubutton .edui-icon,.edui-default .edui-toolbar .edui-splitbutton .edui-icon{height:20px!important;width:20px!important;background-image:url(../images/icons.png);background-image:url(../images/icons.gif) \9}.edui-default .edui-toolbar .edui-button .edui-button-wrap{padding:1px;position:relative}.edui-default .edui-toolbar .edui-button .edui-state-hover .edui-button-wrap{background-color:#fff5d4;padding:0;border:1px solid #dcac6c}.edui-default .edui-toolbar .edui-button .edui-state-checked .edui-button-wrap{background-color:#ffe69f;padding:0;border:1px solid #dcac6c;border-radius:2px;-webkit-border-radius:2px;-moz-border-radius:2px}.edui-default .edui-toolbar .edui-button .edui-state-active .edui-button-wrap{background-color:#fff;padding:0;border:1px solid gray}.edui-default .edui-toolbar .edui-state-disabled .edui-label{color:#ccc}.edui-default .edui-toolbar .edui-state-disabled .edui-icon{opacity:.3;filter:alpha(opacity=30)}.edui-default .edui-for-undo .edui-icon{background-position:-160px 0}.edui-default .edui-for-redo .edui-icon{background-position:-100px 0}.edui-default .edui-for-bold .edui-icon{background-position:0 0}.edui-default .edui-for-italic .edui-icon{background-position:-60px 0}.edui-default .edui-for-fontborder .edui-icon{background-position:-160px -40px}.edui-default .edui-for-underline .edui-icon{background-position:-140px 0}.edui-default .edui-for-strikethrough .edui-icon{background-position:-120px 0}.edui-default .edui-for-subscript .edui-icon{background-position:-600px 0}.edui-default .edui-for-superscript .edui-icon{background-position:-620px 0}.edui-default .edui-for-blockquote .edui-icon{background-position:-220px 0}.edui-default .edui-for-forecolor .edui-icon{background-position:-720px 0}.edui-default .edui-for-backcolor .edui-icon{background-position:-760px 0}.edui-default .edui-for-inserttable .edui-icon{background-position:-580px -20px}.edui-default .edui-for-autotypeset .edui-icon{background-position:-640px -40px}.edui-default .edui-for-justifyleft .edui-icon{background-position:-460px 0}.edui-default .edui-for-justifycenter .edui-icon{background-position:-420px 0}.edui-default .edui-for-justifyright .edui-icon{background-position:-480px 0}.edui-default .edui-for-justifyjustify .edui-icon{background-position:-440px 0}.edui-default .edui-for-insertorderedlist .edui-icon{background-position:-80px 0}.edui-default .edui-for-insertunorderedlist .edui-icon{background-position:-20px 0}.edui-default .edui-for-lineheight .edui-icon{background-position:-725px -40px}.edui-default .edui-for-rowspacingbottom .edui-icon{background-position:-745px -40px}.edui-default .edui-for-rowspacingtop .edui-icon{background-position:-765px -40px}.edui-default .edui-for-horizontal .edui-icon{background-position:-360px 0}.edui-default .edui-for-link .edui-icon{background-position:-500px 0}.edui-default .edui-for-code .edui-icon{background-position:-440px -40px}.edui-default .edui-for-insertimage .edui-icon{background-position:-726px -77px}.edui-default .edui-for-insertframe .edui-icon{background-position:-240px -40px}.edui-default .edui-for-emoticon .edui-icon{background-position:-60px -20px}.edui-default .edui-for-spechars .edui-icon{background-position:-240px 0}.edui-default .edui-for-help .edui-icon{background-position:-340px 0}.edui-default .edui-for-print .edui-icon{background-position:-440px -20px}.edui-default .edui-for-preview .edui-icon{background-position:-420px -20px}.edui-default .edui-for-selectall .edui-icon{background-position:-400px -20px}.edui-default .edui-for-searchreplace .edui-icon{background-position:-520px -20px}.edui-default .edui-for-map .edui-icon{background-position:-40px -40px}.edui-default .edui-for-gmap .edui-icon{background-position:-260px -40px}.edui-default .edui-for-insertvideo .edui-icon{background-position:-320px -20px}.edui-default .edui-for-time .edui-icon{background-position:-160px -20px}.edui-default .edui-for-date .edui-icon{background-position:-140px -20px}.edui-default .edui-for-cut .edui-icon{background-position:-680px 0}.edui-default .edui-for-copy .edui-icon{background-position:-700px 0}.edui-default .edui-for-paste .edui-icon{background-position:-560px 0}.edui-default .edui-for-formatmatch .edui-icon{background-position:-40px 0}.edui-default .edui-for-pasteplain .edui-icon{background-position:-360px -20px}.edui-default .edui-for-directionalityltr .edui-icon{background-position:-20px -20px}.edui-default .edui-for-directionalityrtl .edui-icon{background-position:-40px -20px}.edui-default .edui-for-source .edui-icon{background-position:-261px -0px}.edui-default .edui-for-removeformat .edui-icon{background-position:-580px 0}.edui-default .edui-for-unlink .edui-icon{background-position:-640px 0}.edui-default .edui-for-touppercase .edui-icon{background-position:-786px 0}.edui-default .edui-for-tolowercase .edui-icon{background-position:-806px 0}.edui-default .edui-for-insertrow .edui-icon{background-position:-478px -76px}.edui-default .edui-for-insertrownext .edui-icon{background-position:-498px -76px}.edui-default .edui-for-insertcol .edui-icon{background-position:-455px -76px}.edui-default .edui-for-insertcolnext .edui-icon{background-position:-429px -76px}.edui-default .edui-for-mergeright .edui-icon{background-position:-60px -40px}.edui-default .edui-for-mergedown .edui-icon{background-position:-80px -40px}.edui-default .edui-for-splittorows .edui-icon{background-position:-100px -40px}.edui-default .edui-for-splittocols .edui-icon{background-position:-120px -40px}.edui-default .edui-for-insertparagraphbeforetable .edui-icon{background-position:-140px -40px}.edui-default .edui-for-deleterow .edui-icon{background-position:-660px -20px}.edui-default .edui-for-deletecol .edui-icon{background-position:-640px -20px}.edui-default .edui-for-splittocells .edui-icon{background-position:-800px -20px}.edui-default .edui-for-mergecells .edui-icon{background-position:-760px -20px}.edui-default .edui-for-deletetable .edui-icon{background-position:-620px -20px}.edui-default .edui-for-cleardoc .edui-icon{background-position:-520px 0}.edui-default .edui-for-fullscreen .edui-icon{background-position:-100px -20px}.edui-default .edui-for-anchor .edui-icon{background-position:-200px 0}.edui-default .edui-for-pagebreak .edui-icon{background-position:-460px -40px}.edui-default .edui-for-imagenone .edui-icon{background-position:-480px -40px}.edui-default .edui-for-imageleft .edui-icon{background-position:-500px -40px}.edui-default .edui-for-wordimage .edui-icon{background-position:-660px -40px}.edui-default .edui-for-imageright .edui-icon{background-position:-520px -40px}.edui-default .edui-for-imagecenter .edui-icon{background-position:-540px -40px}.edui-default .edui-for-indent .edui-icon{background-position:-400px 0}.edui-default .edui-for-outdent .edui-icon{background-position:-540px 0}.edui-default .edui-for-webapp .edui-icon{background-position:-601px -40px}.edui-default .edui-for-table .edui-icon{background-position:-580px -20px}.edui-default .edui-for-edittable .edui-icon{background-position:-420px -40px}.edui-default .edui-for-template .edui-icon{background-position:-339px -40px}.edui-default .edui-for-delete .edui-icon{background-position:-360px -40px}.edui-default .edui-for-attachment .edui-icon{background-position:-620px -40px}.edui-default .edui-for-edittd .edui-icon{background-position:-700px -40px}.edui-default .edui-for-snapscreen .edui-icon{background-position:-581px -40px}.edui-default .edui-for-scrawl .edui-icon{background-position:-801px -41px}.edui-default .edui-for-background .edui-icon{background-position:-680px -40px}.edui-default .edui-for-music .edui-icon{background-position:-18px -40px}.edui-default .edui-for-formula .edui-icon{background-position:-200px -40px}.edui-default .edui-for-aligntd .edui-icon{background-position:-236px -76px}.edui-default .edui-for-insertparagraphtrue .edui-icon{background-position:-625px -76px}.edui-default .edui-for-insertparagraph .edui-icon{background-position:-602px -76px}.edui-default .edui-for-insertcaption .edui-icon{background-position:-336px -76px}.edui-default .edui-for-deletecaption .edui-icon{background-position:-362px -76px}.edui-default .edui-for-inserttitle .edui-icon{background-position:-286px -76px}.edui-default .edui-for-deletetitle .edui-icon{background-position:-311px -76px}.edui-default .edui-for-aligntable .edui-icon{background-position:-440px 0}.edui-default .edui-for-tablealignment-left .edui-icon{background-position:-460px 0}.edui-default .edui-for-tablealignment-center .edui-icon{background-position:-420px 0}.edui-default .edui-for-tablealignment-right .edui-icon{background-position:-480px 0}.edui-default .edui-for-drafts .edui-icon{background-position:-560px 0}.edui-default .edui-for-charts .edui-icon{background:url( ../images/charts.png ) no-repeat 2px 3px!important}.edui-default .edui-for-inserttitlecol .edui-icon{background-position:-673px -76px}.edui-default .edui-for-deletetitlecol .edui-icon{background-position:-698px -76px}.edui-default .edui-for-simpleupload .edui-icon{background-position:-380px 0}.edui-default .edui-toolbar .edui-splitbutton-body .edui-arrow,.edui-default .edui-toolbar .edui-menubutton-body .edui-arrow{background:url(../images/icons.png) -741px 0;_background:url(../images/icons.gif) -741px 0;height:20px;width:9px}.edui-default .edui-toolbar .edui-splitbutton .edui-splitbutton-body,.edui-default .edui-toolbar .edui-menubutton .edui-menubutton-body{padding:1px}.edui-default .edui-toolbar .edui-splitborder{width:1px;height:20px}.edui-default .edui-toolbar .edui-state-hover .edui-splitborder{width:1px;border-left:0 solid #dcac6c}.edui-default .edui-toolbar .edui-state-active .edui-splitborder{width:0;border-left:1px solid gray}.edui-default .edui-toolbar .edui-state-opened .edui-splitborder{width:1px;border:0}.edui-default .edui-toolbar .edui-splitbutton .edui-state-hover .edui-splitbutton-body,.edui-default .edui-toolbar .edui-menubutton .edui-state-hover .edui-menubutton-body{background-color:#fff5d4;border:1px solid #dcac6c;padding:0}.edui-default .edui-toolbar .edui-splitbutton .edui-state-checked .edui-splitbutton-body,.edui-default .edui-toolbar .edui-menubutton .edui-state-checked .edui-menubutton-body{background-color:#FFE69F;border:1px solid #DCAC6C;padding:0}.edui-default .edui-toolbar .edui-splitbutton .edui-state-active .edui-splitbutton-body,.edui-default .edui-toolbar .edui-menubutton .edui-state-active .edui-menubutton-body{background-color:#fff;border:1px solid gray;padding:0}.edui-default .edui-state-disabled .edui-arrow{opacity:.3;_filter:alpha(opacity=30)}.edui-default .edui-toolbar .edui-splitbutton .edui-state-opened .edui-splitbutton-body,.edui-default .edui-toolbar .edui-menubutton .edui-state-opened .edui-menubutton-body{background-color:#fff;border:1px solid gray;padding:0}.edui-default .edui-for-insertorderedlist .edui-bordereraser,.edui-default .edui-for-lineheight .edui-bordereraser,.edui-default .edui-for-rowspacingtop .edui-bordereraser,.edui-default .edui-for-rowspacingbottom .edui-bordereraser,.edui-default .edui-for-insertunorderedlist .edui-bordereraser{background-color:#fff}.edui-default .edui-for-insertorderedlist .edui-popup-body .edui-icon,.edui-default .edui-for-lineheight .edui-popup-body .edui-icon,.edui-default .edui-for-rowspacingtop .edui-popup-body .edui-icon,.edui-default .edui-for-rowspacingbottom .edui-popup-body .edui-icon,.edui-default .edui-for-insertunorderedlist .edui-popup-body .edui-icon{background-image:none}.edui-default .edui-popup{z-index:3000;background-color:#fff;width:auto;height:auto}.edui-default .edui-popup .edui-shadow{left:0;top:0;width:100%;height:100%}.edui-default .edui-popup-content{border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 4px rgba(0,0,0,.2);-moz-box-shadow:0 3px 4px rgba(0,0,0,.2);box-shadow:0 3px 4px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;padding:5px;background:#fff}.edui-default .edui-popup .edui-bordereraser{background-color:#fff;height:3px}.edui-default .edui-menu .edui-bordereraser{height:3px}.edui-default .edui-anchor-topleft .edui-bordereraser{left:1px;top:-2px}.edui-default .edui-anchor-topright .edui-bordereraser{right:1px;top:-2px}.edui-default .edui-anchor-bottomleft .edui-bordereraser{left:0;bottom:-6px;height:7px;border-left:1px solid gray;border-right:1px solid gray}.edui-default .edui-anchor-bottomright .edui-bordereraser{right:0;bottom:-6px;height:7px;border-left:1px solid gray;border-right:1px solid gray}.edui-popup div{width:auto;height:auto}.edui-default .edui-editor-messageholder{display:block;width:150px;height:auto;border:0;margin:0;padding:0;position:absolute;top:28px;right:3px}.edui-default .edui-message{min-height:10px;text-shadow:0 1px 0 rgba(255,255,255,.5);padding:0;margin-bottom:3px;position:relative}.edui-default .edui-message-body{border-radius:3px;padding:8px 15px 8px 8px;color:#c09853;background-color:#fcf8e3;border:1px solid #fbeed5}.edui-default .edui-message-type-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.edui-default .edui-message-type-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.edui-default .edui-message-type-danger,.edui-default .edui-message-type-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.edui-default .edui-message .edui-message-closer{display:block;width:16px;height:16px;line-height:16px;position:absolute;top:0;right:0;padding:0;cursor:pointer;background:transparent;border:0;float:right;font-size:20px;font-weight:700;color:#999;text-shadow:0 1px 0 #fff;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.edui-default .edui-message .edui-message-content{font-size:10pt;word-wrap:break-word;word-break:normal}.edui-default .edui-dialog{z-index:2000;position:absolute}.edui-dialog div{width:auto}.edui-default .edui-dialog-wrap{margin-right:6px;margin-bottom:6px}.edui-default .edui-dialog-fullscreen-flag{margin-right:0;margin-bottom:0}.edui-default .edui-dialog-body{position:relative;padding:2px 0 0 2px;_zoom:1}.edui-default .edui-dialog-fullscreen-flag .edui-dialog-body{padding:0}.edui-default .edui-dialog-shadow{position:absolute;z-index:-1;left:0;top:0;width:100%;height:100%;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.edui-default .edui-dialog-foot{background-color:#fff}.edui-default .edui-dialog-titlebar{height:26px;border-bottom:1px solid #c6c6c6;background:url(../images/dialog-title-bg.png) repeat-x bottom;position:relative;cursor:move}.edui-default .edui-dialog-caption{font-weight:700;font-size:12px;line-height:26px;padding-left:5px}.edui-default .edui-dialog-draghandle{height:26px}.edui-default .edui-dialog-closebutton{position:absolute!important;right:5px;top:3px}.edui-default .edui-dialog-closebutton .edui-button-body{height:20px;width:20px;cursor:pointer;background:url(../images/icons-all.gif) no-repeat 0 -59px}.edui-default .edui-dialog-closebutton .edui-state-hover .edui-button-body{background:url(../images/icons-all.gif) no-repeat 0 -89px}.edui-default .edui-dialog-foot{height:40px}.edui-default .edui-dialog-buttons{position:absolute;right:0}.edui-default .edui-dialog-buttons .edui-button{margin-right:10px}.edui-default .edui-dialog-buttons .edui-button .edui-button-body{background:url(../images/icons-all.gif) no-repeat;height:24px;width:96px;font-size:12px;line-height:24px;text-align:center;cursor:default}.edui-default .edui-dialog-buttons .edui-button .edui-state-hover .edui-button-body{background:url(../images/icons-all.gif) no-repeat 0 -30px}.edui-default .edui-dialog iframe{border:0;padding:0;margin:0;vertical-align:top}.edui-default .edui-dialog-modalmask{opacity:.3;filter:alpha(opacity=30);background-color:#ccc;position:absolute}.edui-default .edui-dialog-dragmask{position:absolute;background-color:transparent;cursor:move}.edui-default .edui-dialog-content{position:relative}.edui-default .dialogcontmask{cursor:move;visibility:hidden;display:block;position:absolute;width:100%;height:100%;opacity:0;filter:alpha(opacity=0)}.edui-default .edui-for-link .edui-dialog-content{width:420px;height:200px;overflow:hidden}.edui-default .edui-for-background .edui-dialog-content{width:440px;height:280px;overflow:hidden}.edui-default .edui-for-template .edui-dialog-content{width:630px;height:390px;overflow:hidden}.edui-default .edui-for-scrawl .edui-dialog-content{width:515px;*width:506px;height:360px}.edui-default .edui-for-spechars .edui-dialog-content{width:620px;height:500px;*width:630px;*height:570px}.edui-default .edui-for-insertimage .edui-dialog-content{width:650px;height:400px;overflow:hidden}.edui-default .edui-for-webapp .edui-dialog-content{width:560px;_width:565px;height:450px;overflow:hidden}.edui-default .edui-for-insertframe .edui-dialog-content{width:350px;height:200px;overflow:hidden}.edui-default .edui-for-wordimage .edui-dialog-content{width:620px;height:380px;overflow:hidden}.edui-default .edui-for-attachment .edui-dialog-content{width:650px;height:400px;overflow:hidden}.edui-default .edui-for-map .edui-dialog-content{width:550px;height:400px}.edui-default .edui-for-gmap .edui-dialog-content{width:550px;height:400px}.edui-default .edui-for-insertvideo .edui-dialog-content{width:590px;height:390px}.edui-default .edui-for-anchor .edui-dialog-content{width:320px;height:60px;overflow:hidden}.edui-default .edui-for-searchreplace .edui-dialog-content{width:400px;height:220px}.edui-default .edui-for-help .edui-dialog-content{width:400px;height:420px}.edui-default .edui-for-edittable .edui-dialog-content{width:540px;_width:590px;height:335px}.edui-default .edui-for-edittip .edui-dialog-content{width:225px;height:60px}.edui-default .edui-for-edittd .edui-dialog-content{width:240px;height:50px}.edui-default .edui-for-snapscreen .edui-dialog-content{width:400px;height:220px}.edui-default .edui-for-music .edui-dialog-content{width:515px;height:360px}.edui-default .edui-for-paragraph .edui-listitem-label{font-family:Tahoma,Verdana,Arial,Helvetica}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-p{font-size:22px;line-height:27px}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h1{font-weight:bolder;font-size:32px;line-height:36px}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h2{font-weight:bolder;font-size:27px;line-height:29px}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h3{font-weight:bolder;font-size:19px;line-height:23px}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h4{font-weight:bolder;font-size:16px;line-height:19px}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h5{font-weight:bolder;font-size:13px;line-height:16px}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h6{font-weight:bolder;font-size:12px;line-height:14px}.edui-default .edui-for-inserttable .edui-splitborder{display:none}.edui-default .edui-for-inserttable .edui-splitbutton-body .edui-arrow{width:0}.edui-default .edui-toolbar .edui-for-inserttable .edui-state-active .edui-splitborder{border-left:1px solid transparent}.edui-default .edui-tablepicker .edui-infoarea{height:14px;line-height:14px;font-size:12px;width:220px;margin-bottom:3px;clear:both}.edui-default .edui-tablepicker .edui-infoarea .edui-label{float:left}.edui-default .edui-dialog-buttons .edui-label{line-height:24px}.edui-default .edui-tablepicker .edui-infoarea .edui-clickable{float:right}.edui-default .edui-tablepicker .edui-pickarea{background:url(../images/unhighlighted.gif) repeat;height:220px;width:220px}.edui-default .edui-tablepicker .edui-pickarea .edui-overlay{background:url(../images/highlighted.gif) repeat}.edui-default .edui-colorpicker-topbar{height:27px;width:200px}.edui-default .edui-colorpicker-preview{height:20px;border:1px inset #000;margin-left:1px;width:128px;float:left}.edui-default .edui-colorpicker-nocolor{float:right;margin-right:1px;font-size:12px;line-height:14px;height:14px;border:1px solid #333;padding:3px 5px;cursor:pointer}.edui-default .edui-colorpicker-tablefirstrow{height:30px}.edui-default .edui-colorpicker-colorcell{width:14px;height:14px;display:block;margin:0;cursor:pointer}.edui-default .edui-colorpicker-colorcell:hover{width:14px;height:14px;margin:0}.edui-default .edui-colorpicker-advbtn{display:block;text-align:center;cursor:pointer;height:20px}.arrow_down{background:#fff url(../images/arrow_down.png) no-repeat center}.arrow_up{background:#fff url(../images/arrow_up.png) no-repeat center}.edui-colorpicker-adv{position:relative;overflow:hidden;height:180px;display:none}.edui-colorpicker-plant,.edui-colorpicker-hue{border:solid 1px #666}.edui-colorpicker-pad{width:150px;height:150px;left:14px;top:13px;position:absolute;background:red;overflow:hidden;cursor:crosshair}.edui-colorpicker-cover{position:absolute;top:0;left:0;width:150px;height:150px;background:url(../images/tangram-colorpicker.png) -160px -200px}.edui-colorpicker-padDot{position:absolute;top:0;left:0;width:11px;height:11px;overflow:hidden;background:url(../images/tangram-colorpicker.png) 0 -200px repeat-x;z-index:1000}.edui-colorpicker-sliderMain{position:absolute;left:171px;top:13px;width:19px;height:152px;background:url(../images/tangram-colorpicker.png) -179px -12px no-repeat}.edui-colorpicker-slider{width:100%;height:100%;cursor:pointer}.edui-colorpicker-thumb{position:absolute;top:0;cursor:pointer;height:3px;left:-1px;right:-1px;border:1px solid #000;background:#fff;opacity:.8}.edui-default .edui-autotypesetpicker .edui-autotypesetpicker-body{font-size:12px;margin-bottom:3px;clear:both}.edui-default .edui-autotypesetpicker-body table{border-collapse:separate;border-spacing:2px}.edui-default .edui-autotypesetpicker-body td{font-size:12px;word-wrap:break-word}.edui-default .edui-autotypesetpicker-body td input{margin:3px 3px 3px 4px;*margin:1px 0 0}.edui-default .edui-cellalignpicker .edui-cellalignpicker-body{width:70px;font-size:12px;cursor:default}.edui-default .edui-cellalignpicker-body table{border-collapse:separate;border-spacing:0}.edui-default .edui-cellalignpicker-body td{padding:1px}.edui-default .edui-cellalignpicker-body .edui-icon{height:20px;width:20px;padding:1px;background-image:url(../images/table-cell-align.png)}.edui-default .edui-cellalignpicker-body .edui-left{background-position:0 0}.edui-default .edui-cellalignpicker-body .edui-center{background-position:-25px 0}.edui-default .edui-cellalignpicker-body .edui-right{background-position:-51px 0}.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-left{background-position:-73px 0}.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-center{background-position:-98px 0}.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-right{background-position:-124px 0}.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-left{background-position:-146px 0;background-color:#f1f4f5}.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-center{background-position:-245px 0}.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-right{background-position:-271px 0}.edui-default .edui-toolbar .edui-separator{width:2px;height:20px;margin:2px 4px 2px 3px;background:url(../images/icons.png) -181px 0;background:url(../images/icons.gif) -181px 0 \9}.edui-default .edui-toolbar .edui-colorbutton .edui-colorlump{position:absolute;overflow:hidden;bottom:1px;left:1px;width:18px;height:4px}.edui-default .edui-for-emotion .edui-icon{background-position:-60px -20px}.edui-default .edui-for-emotion .edui-popup-content iframe{width:514px;height:380px;overflow:hidden}.edui-default .edui-for-emotion .edui-popup-content{position:relative;z-index:555}.edui-default .edui-for-emotion .edui-splitborder{display:none}.edui-default .edui-for-emotion .edui-splitbutton-body .edui-arrow{width:0}.edui-default .edui-toolbar .edui-for-emotion .edui-state-active .edui-splitborder{border-left:1px solid transparent}.edui-default .edui-hassubmenu .edui-arrow{height:20px;width:20px;float:right;background:url(../images/icons-all.gif) no-repeat 10px -233px}.edui-default .edui-menu-body .edui-menuitem{padding:1px}.edui-default .edui-menuseparator{margin:2px 0;height:1px;overflow:hidden}.edui-default .edui-menuseparator-inner{border-bottom:1px solid #e2e3e3;margin-left:29px;margin-right:1px}.edui-default .edui-menu-body .edui-state-hover{padding:0!important;background-color:#fff5d4;border:1px solid #dcac6c}.edui-default .edui-shortcutmenu{padding:2px;width:190px;height:50px;background-color:#fff;border:1px solid #ccc;border-radius:5px}.edui-default .edui-wordpastepop .edui-popup-content{border:0;padding:0;width:54px;height:21px}.edui-default .edui-pasteicon{width:100%;height:100%;background-image:url(../images/wordpaste.png);background-position:0 0}.edui-default .edui-pasteicon.edui-state-opened{background-position:0 -34px}.edui-default .edui-pastecontainer{position:relative;visibility:hidden;width:97px;background:#fff;border:1px solid #ccc}.edui-default .edui-pastecontainer .edui-title{font-weight:700;background:#F8F8FF;height:25px;line-height:25px;font-size:12px;padding-left:5px}.edui-default .edui-pastecontainer .edui-button{overflow:hidden;margin:3px 0}.edui-default .edui-pastecontainer .edui-button .edui-richtxticon,.edui-default .edui-pastecontainer .edui-button .edui-tagicon,.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon{float:left;cursor:pointer;width:29px;height:29px;margin-left:5px;background-image:url(../images/wordpaste.png);background-repeat:no-repeat}.edui-default .edui-pastecontainer .edui-button .edui-richtxticon{margin-left:0;background-position:-109px 0}.edui-default .edui-pastecontainer .edui-button .edui-tagicon{background-position:-148px 1px}.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon{background-position:-72px 0}.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-richtxticon{background-position:-109px -34px}.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-tagicon{background-position:-148px -34px}.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-plaintxticon{background-position:-72px -34px} \ No newline at end of file diff --git a/admin/themes/default/dialogbase.css b/admin/themes/default/dialogbase.css new file mode 100644 index 0000000..cd663d5 --- /dev/null +++ b/admin/themes/default/dialogbase.css @@ -0,0 +1,100 @@ +/*弹出对话框页面样式组件 +*/ + +/*reset +*/ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, font, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td { + margin: 0; + padding: 0; + outline: 0; + font-size: 100%; +} + +body { + line-height: 1; +} + +ol, ul { + list-style: none; +} + +blockquote, q { + quotes: none; +} + +ins { + text-decoration: none; +} + +del { + text-decoration: line-through; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +/*module +*/ +body { + background-color: #fff; + font: 12px/1.5 sans-serif, "宋体", "Arial Narrow", HELVETICA; + color: #646464; +} + +/*tab*/ +.tabhead { + position: relative; + z-index: 10; +} + +.tabhead span { + display: inline-block; + padding: 0 5px; + height: 30px; + border: 1px solid #ccc; + background: url("images/dialog-title-bg.png") repeat-x; + text-align: center; + line-height: 30px; + cursor: pointer; + *margin-right: 5px; +} + +.tabhead span.focus { + height: 31px; + border-bottom: none; + background: #fff; +} + +.tabbody { + position: relative; + top: -1px; + margin: 0 auto; + border: 1px solid #ccc; +} + +/*button*/ +a.button { + display: block; + text-align: center; + line-height: 24px; + text-decoration: none; + height: 24px; + width: 95px; + border: 0; + color: #838383; + background: url(../../themes/default/images/icons-all.gif) no-repeat; +} + +a.button:hover { + background-position: 0 -30px; +} \ No newline at end of file diff --git a/admin/themes/default/images/anchor.gif b/admin/themes/default/images/anchor.gif new file mode 100644 index 0000000000000000000000000000000000000000..5aa797b2240a432d9f3f1d166ed5542eaf684937 GIT binary patch literal 184 zcmZ?wbhEHb6kygJ|Uu&?oD;%Ae!z@09(NL_hv#6Slx0y!YR{?r|LJZgAju=f-$sQVWNL{+Tsz18#+~Ke%+zTWns()WcPwy8dQcr!JH# U&i)o#ra{o6vp4_np&fqGg-1;GP^BJO_p_?A6nLIYwB=H*Qp>A8nZf?fNnCY(uvZL zYMq5r=M|ASom0_?Sn7~VE3B<^mcq1BrHIr9EGW>Ifm~m?y<>mJPIAsKPjWszPx7z| z^K(;^4e+i)B*?S*guTS?B+Vho2 z`WG1Kuclp>qR!nSa-c>gf6E3&1HPK$>6qGXeOCp%qBL8aEd$S;?m%#@0uH|roliGe zy#i~1E?Ad#U1t}6uwt+qqgIm=xY8r0F*7 zl{ZWo1&^Wcj_roRaNKw0cq|%;M#7eRWh<*7;!rva!w3Wdg+kTSXqlOr3+!(Y+UH1c!M>bUYK1<=lG*1pq%m&P~1QC>Rx($IJPWjnN zpR&G{Rq^JvgludxnIl{D8LgfGe-+MHCcM_UcHp8Td8VLE6B~29!k7r659<2nKp^Fl zj!GszzF7d5gy6DP@ZR1H93XOu{-OI@l6&5C>BJ*|uw%klayELyqgg z(1r2VJa0I-7Tj#n#oR8}RJ&g+`2!5Q8%of3mwZ1ylT{6m^cuZ3bEx<+w~3H6c=s2I zHqmMPM&{IH<=Icl=QPsL@wWkIaQ9;d5!{KiwDTAp6ANhcA|rcd_*y;vPo-D@#WUD8 zxj?H-u8_-Qb;^#oX{dywAOO4sP%-&Maru89peVTaNW45UP{=b_+ByMxH6aCa_?|l> lFG7akQpaiL%L!NFwXt25X8cm0x*UH6P&xU?o7rDC{|kH`9-#mL literal 0 HcmV?d00001 diff --git a/admin/themes/default/images/arrow_down.png b/admin/themes/default/images/arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..e9257e83b00375259f2f724c7cbac03d0df5ceb2 GIT binary patch literal 1610 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2v2cW`)d{3jAFJg2T)jk)8oi3#0-$aN1{?c|g2d$P)DnfH z)bz|eTc!8A_bVx6rr0WloBA5~7C5J7WO`H;r3P2|g(O#HCtIc{+1n}DR9FEG$W1Lt zRH(?!$t$+1uvG$^YXxM3g!Ppaz)DK8ZIvL7itr6kaLzAERWQ{v&`mZlGf*%y)H5_T zF*i5YQ7|$vG|)FN(l<2HH8i&}HnK7>P=Ep@plwAdX;wilZcw{`JX@uVl9B=|ef{$C za=mh6z5JqdeM3u2OOP2xM!G;1y2X`wC5aWfdBw^w6I@b@lZ!G7N;32F6hI~>Cgqow z*eU^C3h_d20o>TUVrVb{15Cdnu|VHY&j92lm_lD){7Q3k;i`*Ef>IIg#cFVINM%8) zeo$(0erZuMFyhjbK~@!5ITxiSmgEG&eP`1g19yq1OegIswNQ-xSi<4Z1u2!m4XhFqBbF8wG<_`!+|HhuxMFc&SLMF{7Z@fVvH$#8 ze|mSH#FSX^%>h00S4ci?>YufC3b$>be$N&e)g9;i=5%xkTh1s~5&sk~hpZURp;Qa?iE^5gq z0+?2AoO*aq`+eIDGp&3MoLz0RPBnf@mZEj!Y0cZVUxN2^iyZs(a?eI%oljxTtdUFo z4zJtT6vh6mc<(8@dEybWbJNr%Pc%*VvF}gIi|llP_mw#+z3j zapfmJXkU5iJgMMaq6;%eEr0F`fv2A$yk@Z1O`YMLW4b!$#En-43)(gNwO&tIE1$YR z{=f_5V<-h{r;w^f@VvOcJ`XH-Laf=HZ$7pE8y$b zea|FcbA8_y&V4&;c0EYAF6z7Uq;gWX%!S@_GP~BiYk9@S9hp{rSmuZc`!rX#z78?b z>^=VrHI}o6**U$5wKDVU&pfZEJI56Y zoT$4mvucV;+x1h4)@uJZd{#I=XN5ldnP;uVH#)aA-sLj_f6xsvx)X=xc_v2 z@-mt-`NgS3hTn0)cfZMswpSgNlI1YlD$F(+3=d#Wzp$P!&XKAJY literal 0 HcmV?d00001 diff --git a/admin/themes/default/images/arrow_up.png b/admin/themes/default/images/arrow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..74277af1e6a8ef91f8fe664efde11377a5292dbc GIT binary patch literal 1649 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2v2c=9J8kh>{3jAFJg2T)jk)8oi3#0-$aN1{?c|g2d$P)DnfH z)bz|eTc!8A_bVx6rr0WloBA5~7C5J7WO`H;r3P2|g(O#HCtIc{+1n}DR9FEG$W1Lt zRH(?!$t$+1uvG$^YXxM3g!Ppaz)DK8ZIvL7itr6kaLzAERWQ{v&`mZlGf*%y)H5_T zF*i5YQ7|$vG|)FN(l<2HH8i&}HnK7>P=Ep@plwAdX;wilZcw{`JX@uVl9B=|ef{$C za=mh6z5JqdeM3u2OOP2xM!G;1y2X`wC5aWfdBw^w6I@b@lZ!G7N;32F6hI~>Cgqow z*eU^C3h_d2fv+#z;JjjJKmmhHzap_f-%!s$KQ|ZTFR<$3lAu(CGq9>I4yi0i)elN7 z&Mz%W2F6F4GE6ft?C@IzQV4X7m48ttFj5k8T=J7kb5rw5JY8&+fHHb1nJHGr&Zcf= zZpLmdj^@s;MuvtK&X$(07A9_{2F`9K1|}9TGqCA(Gj?@#HgIt=cQbG_G;}qxFf=l- zbaON}GPN)@wKR5t>GjMjE=kNwPKDW<3A7ig*AcH?E9aur#FG4?ko^1{SPBTp$S=t+ z&d4uNa1J(A2+zz*$uBPkMGnNTE~!PCWvMA{Mftf3;Lx?o#9}*PUqke!kP~A1K*#8V zk_J*zfe8WAABYK0_&^Rk>!juZ^GgvhW0Y{Wv@$R-E%tPA45_#^WvZ{gh@(K;>Z+== zX-At4KPH3-+4r@v2}X8*AN$Mh@OiHNYs3&%QbHW!0`#zh1`9tBzYV@8G#Wg&l2-#)h$FUdfE_lvm%b2=kt^Ebzn( zr(4oF%+7xg2Te=y(fqh}+AK?Nt8-e6Vo~YWrY1FhH}uX($oOv&HCTs__< zzEdCca~LbgR5%PtJYh=3FjGRGp=cUaJC^c^yU)Zr^k2P zlm5xRG;W0~lefT@)ERLuic?K4bNlUNS|KodrrwHIUNWEc`M1i>U^rI0VS1uR{)PLi zihmWG2&`Lpzrjh}nD@mILlb2Uhtt|CHp`N!r`KF5c$VaRcJZF}LJe(& zwV}p~KZGbP@?1Z4Mc+d4`MOQrYgSe4X#ZDh+%|1dL)h$@nv3?ZH`~Z?rV3X7(F@K> zb+Z2u>#VllaHj5&E!~}`b21Ja)w^fT&+2mzy!OR_pE1^}_1<=w+EA5Nm$Hp%M~^AK zU)Z92;jd=Sl<1n3x7z+*ci#Wo(IT=)J{K*+Q?C!N1MD&Sbd le02W-shBsPKJ+s%GgK)^wA}p_d>&K@c)I$ztaD0e0svXmV!r?Y literal 0 HcmV?d00001 diff --git a/admin/themes/default/images/button-bg.gif b/admin/themes/default/images/button-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..ec7fa2eabf0705226fe0c488d65198508bf547e9 GIT binary patch literal 1114 zcmV-g1f}~&Nk%w1VKM+R0OkMy00030|Nr{?`~Uyg|Nq+c_4NPz*Z=(3`t{5D_RRV9 z%lr1t{P@xN^27S{$occg`t-~D_Rjb6(E0Jf`t!&5^V9k7zxnUL`S8H{@x=P_$@uNP z`0c*=@5lM`q&aU|6w)f(-(ZHJcKyq);w!1v|A_vOL(=ELpXz3||{+03)&lq#;^N`q z;o#ul-{0Tf-rm~U+Sk|D(9qET|Nj6000000000000000000000A^8LW004OaEC2ui z05SkF000O7fO%_oc!h?Ch>41ei+5{zWp`--l$Dm3n3+> zsF_HyqQ#3CGiszrN8-khAVaF@xTd7ZlPFWFT*=ZTojPn{%A85Frp=o;W!90Hv!~CW zBj>nb)267=qezn~UCPvr&^vA(N|o9Msu?(T?r7c0wX4^!V8PmfVC>oFmqw6)fdnp04j^zqp|u`Sa-0r=OsK#f}aaILMz*zrOwZ z`0-!pup>tY5FP|5;D7`cXyAbdg3v(@I*72r2M|Um;e-@cXrYB0h@gWGA&@Y_haiS1 z;)o=cSRx4_Z1{o+CA8?`i!jD0v_{FvJiptdPRD zl1w(~KIEzAo_zM{=bwE7aRU-l5Rn8GGXU|#qKr1`=%bKE+9(h+P>}@@TWDd06i{^P z>8GHED(a}AN@0Z-TXdns6;*su#jCK!D(kGY)*7p;S18d%0YNN*1r}fgE9|hu7HjOW g!~VKN5CsU(L=jFzEA6z@R%`9G*G3VB0D%AiJBq`ncK`qY literal 0 HcmV?d00001 diff --git a/admin/themes/default/images/cancelbutton.gif b/admin/themes/default/images/cancelbutton.gif new file mode 100644 index 0000000000000000000000000000000000000000..df4bc2c06d485df4403d689c98ee745a4cde8e97 GIT binary patch literal 1227 zcmV;+1T_0cNk%w1VH^Ms0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~EC2ui02}}g000R80N?d8lSPY`ECmaSA@vT~rz=b%E}1xSN+M*v*63=s zj2W|z%bEpKgUQntPOMg`Ql)Ygt58`0p~(cQlP6A|I&tD;)03AgfeIBOG>DKjY^XJ4==@p5kGnYDTB5w7&K^jxZs(hL{cL~lH}dPcdt$q zD_5TQ&|`gZmzMqH0#&%8nU(?9AzvZOs&E($thW17wAnF=2dS zixx%10*e+@Tw%iubG*?-5ob)X#T8L>VFrIHgwcf)I#^*u6G{}}gcVlU-~$+ANa4h3 zU5Eh&8T;8#LljaNAp~tsNC8C^Rb1i1Av~P%1{`$QfyY)`G0{dGGhE??7h#NH1{!Ik pfd&v=WTQt8w{C>_-)j6kG zmZ@`2opZWct<*WE%jHsMvsp;f^!~Ol**?^DO`hifs44&=f~umb34Y07v! zehXl>0V0C67HciWn4KjeEEWr@sxtk4|8?WtNwEFcm{Yc@Vy$H`7@(^3dc70h4xmY} zPa;B+{C!@Q<^CQRW6lMfrwb>zFkriOfWsf}arIZ0*)jKSzW9HD4>|2i1+FOg^6oL0 zuMGL+PHkt#*vvh~NQ@CxMMM#xZ40h-e^cjfe*)md?7iRY1HqRBjSwR0J%@RRXP>@> zkKcbjGFwIi5M!jSYpSZEsw%t>6uuy+C;C8K=M*aB-KzlIq|@mbYi)bIUbpA-`I#n_ zWy#v)_!v+R^=b{kGLNXLO{}#BFq6sTxvIY0l+`3NPhQ=Ac;nXf2W4IstBgcUD^b-d zJ3eY@@JRF1!NCEoR?7f{5J-}wDJcQkB4Re+sH#y!e2lU916r{A&pdHrm;e9(07*qo IM6N<$g2apNRsaA1 literal 0 HcmV?d00001 diff --git a/admin/themes/default/images/cursor_h.gif b/admin/themes/default/images/cursor_h.gif new file mode 100644 index 0000000000000000000000000000000000000000..d7c3e7e9eb5755d57ec03c34097c258244abe61a GIT binary patch literal 253 zcmVG|6H_V+Po~-c6$N^_IEGZ*Iy1qOk3oThS@Yxn_+t|0*P6|%n+#L~Iyf|E zrg84hNMwpx9_!-6|BEHhl_}FHLcZHi@xo+A>tN1bvzr~8Z#Ex)a8Qdkef% WRW|>PuXh3sXYh3Ob6Mw<&;$VH);Gui literal 0 HcmV?d00001 diff --git a/admin/themes/default/images/cursor_v.gif b/admin/themes/default/images/cursor_v.gif new file mode 100644 index 0000000000000000000000000000000000000000..bb508db552b6ac3f670f9ce1fcb1e55669db0dd6 GIT binary patch literal 370 zcmZ?wbhEHbQBhG}zIty_2L(xqFsZe72A-PqWelao_UPVUE#AKKd5`}glJC@2UB2rw`(IB?*A zqN1XRh{(>JJ55YXczAeJRaJNI-YqUJE-x?t@#Dumd-if8Ejy6@I4`1w~F!Qzky-V-VnInOpfk+|GDYn9AS7wc)Z8bf!!3 zZ2HZ7qm!>fg-@N3u_S6BtfcFRaLzUWGF!q z%AzEfB~`D;I)q^T@hn>GjrE?{UdLiPgP&3w>7tmXsgPC#5>G@))3jVemdgxLP8K0W zSvgGh3k4G=ZtO?YCn3lc(TL2c!850)DFo3*HcZxKVg(a36p4}m^OOpp{&p|bt$J&&x7~}fl`AqcVt%cEU2}27dM96QnwD)g zZI46N>oIHU?{_Z!WDf$^W^<7J82vsuXemZ#a;t%OX9%BFi literal 0 HcmV?d00001 diff --git a/admin/themes/default/images/filescan.png b/admin/themes/default/images/filescan.png new file mode 100644 index 0000000000000000000000000000000000000000..1d271588692c1726e3521032f71d8354b66fab0e GIT binary patch literal 4282 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 literal 0 HcmV?d00001 diff --git a/admin/themes/default/images/highlighted.gif b/admin/themes/default/images/highlighted.gif new file mode 100644 index 0000000000000000000000000000000000000000..9272b4915ad2b8d4052a19b4c80a41b7c71cf1f1 GIT binary patch literal 111 zcmZ?wbhEHb6k`x$Sjfb1_to#iH~&L`;!hSvE(RtB9R?r($ulrHOzB@K_Ll!X=Ym_^ zj literal 0 HcmV?d00001 diff --git a/admin/themes/default/images/icons-all.gif b/admin/themes/default/images/icons-all.gif new file mode 100644 index 0000000000000000000000000000000000000000..21915e59dede0aa22cda8c7097a14f0f1f68906c GIT binary patch literal 3750 zcmWlYc|g*K8^!@mQ327sYPRf{nw7a~O0^mt9=R-=9nQ=_hjV7mZB1R*0581p_$if} zc%)>OT8em^m|}{eqIpyzAYzIl2zf`Y0c|BYU+ z@9XPZTU%RQUDfGyTCG;2(EtFTR;!gt<;uzm>t(VQ)UK_r>9jg*R^g{tJNu0 zfJ_0X04--|eC(refH$!qQ}zyy^$d*8FDd4v%W~!Vf@(>jT97G3l6ir6Zf;2-UXaO@ zfK;xOtJb}s5&&gN6{yv&uB~ZxI#3I)u7|CyYJnjwzysA28s$51rAMRUXjJ`L^$@5W z)~ZK9B~Pm!1yy4j#amF`safgKDmfZuzg9H}t_*_99U4U!DDT!N`alI2R19fWhBeA@ z(!ERIQX431*DQB}vM!ChN2BQ1t_*4v!&-KVPX|sM1Sc=@;wtOHF!N3;4MSoNwiiywb`z z+T}t0bcSA#r5EPtMR|JBBmGQ)UR)WQa}uo0MPQHxsNH9l#r z{$E37&LE4fTi}ciyiu*lmZWo?)oE%zqrN;@J>59bU8WYabiB${3)=uud-IE&hUZyo z5v#wgL@n-`8*gf^%5Qp^$8IXoNe6X{Ja!A6|Gs--s8ihYM9p8%>JYuj5V0uY?tF1K zRlP7NXiN~crcA%OH_aeSJ^!8mGFl}b)oC^B6$C+0rBcb|a+ypfl}hL4=4NMSMIw+bIE=;&x`Yinw1VlWuR#l`9A>0~lF zIyyQsGBP3}A~ZAC*?3}(Ig+dxC;Is%YA|B>(?6A-u_qF?<2 z(*NNw6u!|Vm|b1ON<#1O4QBS+Goi2p;UCyF!nWJ9U4MRorj_>OI0sY&_q=-Ao9}FV z=Zl!gC*4mxOlW2vwDN&MY@F#9-&*=$i5IJA2jTTIuP7nK_aEOnmyzH21>r|MhAQ4y z;WDF-l#k3c!VHHhuJ$rsOx8yU-~ID_eS708zYW}vz4cX7Z7`X@%AZy}%_48y9n#0F z5q49|jBOUq6NtUk1Ghf)HN2i3pq)%@{r1s*@7|Jt=OLWKcYYb(yuqI8*Tj%cGXI$W z#A&Ku8n42e<*qg{mxb(m#o&Nvd_5BiE?Jh1~W z(HFA6t*@iKtRVXHTsbY#_V2Uf|UpA|J zZy}G--t@TCz#ns5{?Jv&SsWJe7hZF{c1vq{mu^Yx#*RIYvpAx2>vkD8OhGsuwL9O5 zl%R;L#s$XwVw0?E_fqr9&=JE%4=emB^8$yBl6_$d*iPihofe&M;7*mY4ur>ojD_}2 zi?UQ(;te;q86NJn@I(~FqkZD{$k{vdBji2K<(2YxJI#tZ(Vhpt{+@;it~q5L;IQp& z|F`M|#Q@fL?+W*nt@MCpz=fJlYXmpK)B1vg#arHm%eR#yfj_@cjt0l1e`9&!0^V~N zzn{Co_9n&RtxZI|R5cmZy;uF=&imWy$@7%+Mz&We`lDYN+@bk(*<7=V1g6POF9AWC z$08sk|61f>dj~-7Gzcwid23e?vk1=8l3X>C()`G~lI(nZ;>^Ko|1#`<>vYvF)V`0@ zN}01SwTq12BK7BkwsN)usndeJ%yz2M$@@H(bPBF_)qQ&sLhiGz(ySY@GXuR9zJs5% zZw(OT|GEZB%B$7@;)Nyn&T$r_We4fttF={Nw(2`gI$ZuxSB7uj;htsccLTN&euf6K zWw#q0mJ!iuG(%geiC^ipjhPUKn}$AEKb*kQ0Z|0^_UW*EEQ@zOQ)KE*HZi;AA4i(T zxtztP{E$ns!t@oPV%V%NHL@fuq8P0|jXxPsARukx*}2^>GQGg#CZ0?ywkr4Ww4bQ9 zD#IqY+@DT;l<@N4l<@BgK*Dcb?saGL8?4H9f?2oKD zb(P;?(+e+kFh0#bu~|+bpDEpLyUXVa|AcKTq-$@sh4ThxMJAJ7>gdtabM~%0hlY6S z?A>$P2X;O11Dxl6qbB7_d{$~JE^*J#r+b4Y-##-v@qLws}tREGRoz9=TI! zTjpD~KfkB%{EO|IJ^}$x%T9B`gA|X)`pVqvdpMDI6;I;jMu&LQs95IpEh3o_re;@0 z4DF=78Kxc9Nz91x`Q;zp9^)e&MS5yfb%{MtnTr`)Mt0qg+oDD|mo_h>9=bc)FZq|B z*gE6LlErNeZ=mDf9USyF!P+N|CmmBAhh#0X+ywCR-W!w|8|)GxAUElZ;y8r0hrea_ zZL4olvLC48xUz5d_Cfhs0bVU7U+m);AItL%VBIk&_q=Fz0$Gyz6oq@H!R|UzT;co& zo#h5FlY$nB<}5nPKG=`v!G{iYkqy3_^0`&a9?T%QiocLLBn3B3WH7dS*-NqWA=aL# zSo%qOA88_n2Q_a&MW5e*H~v-tHIEJy)lfN=p&q^C{dZNbX~-90-rr9QJyzAy{iN5O zveK?s7u!@~y!Ja51-;RePuL{^r#44W63^M6uq&p&xP;3xJ2=KS!TPwOBM6DX?I)NR z3r|-|X#5_4U_7QgZbP7ugAHvP?H_fzas974*%M79M@btQsfl>5P4i}==gxmA365B( z=_U5kgC~>(r&EFk8HfG#v7!xoVyDf1B6L{N2)KQ?<7R~zFT#P2)PoMisGn)9t!Q1s zcid^jpV(8IW531|c`yrGcf&34+Rv^1%J!7TaYR7+X5@eU+RhIM2g{d z%i{vejlzwG+&j14{a~`yc#}n;gI79!+SFeXXptw0&)Zu>c8Ke+hWzXHRnW4@bt|ED zl`Q`8U@+qP{bId!E`9mC?DN3~O2Gcxk*;6O=ra99#eHw#cW56AQvGFzcJzcL>?UQw zukYM$_cHA5zvg=>zVRfx7P{v?vPFuozh;<*s-t`Reg5HzhDSeJS8=&z+!9AKsLrUX z{P`mkkqc?v$%Y_s*DURB@JG2L5X0C9mUcKu^A-np-@}B6n}zY?T)*fu+p*bs*elE} zveS^eKV-vWwUd06s_xbkY51>4U{Gv*UDi=Zc!1VvIz!F8I7y6AcYgAE6che>b1cBdr-nKKt*BO?-i%phV7VQUt)HC!xje%+lAnzp8c~V?y|vd%3&V9UD*{O9OH7nfqm(4$JCz>b;BWG57TcUxf*HB zD8wYtPu)1Vx)?jq^vNj*hHBrkXz%={BK`^qQNWjx&ov7y2BIa`_y&&TW|7mmzk2>A z7_e0YvBv<|AG0PYmbM#tozo0G`Lseazis?OyJj>KXRsrzW#MMwUGB?P<@PZG{FIya zQ#nmlD8<505J-Zgc3Ah;R(bw+_xbl2274jL;iX$iHi)f;V*{9aHNVbFV%jcq}0VNWj4p2O-FQ|HRPP#IUf$0W^~T6p@NHin2@k9h3AM z96kUE;b4>Q(vvuZq$pVu!H&HC#{>A)VVMz`N={*tQ!z-s{u?9?ot%wH&h<&o2qQ;Q zk{>gZ3)so|&cQ=mqhd@-X<*7zXC(hCWJGmJ_AjD@ibX>3NvpUA)5GFJjKRbiR$AtCbEOkHdy2*3KCU<^A% zG5nFT0nA*EH8yRaAjT=kWJ;YUvIJ*r^<$RJUs=|NOl5&r#{7|^vMh&9+1pLBc?2Xr zHrx48wo60yp5!0})|{S*TIHhX(dJ5uZ&}-^0HG;<{`T+KDt5ptjAp#s3%a(DA1kHX!?vqQlD;Wp)6JCt|h$Gp(L^1>eFg*W8= zG-qBRHjhjWkJ^-9=AM7&bod{;@?(Aszt@xZ5X>iRqLL0#(ZU$57n=e*8&J|D-$)!AlS*c>zo^a}*K=;?Oxu1;q8$jw=) z#?tcJJQ3 z^m9Eb>Y%HuYi`xZlP6D-l8&{vw}<76fB#-PabYYyBjba)nW3TKwQJYb);BH{7k?A~ z92gkr>FF8h?#`|l8RYrQFRxq0*Ze%jSYF-GD*~Ud=>Iam^z8YYnmc#?uCJfFIXLxZ zwpC4~>fxYI&LZvdivt&b>g~Qf_3?K`am&-mZ-4&$NxeG!?0~}T{Ga*x`KUzR-PrB@ z!=ux)-+nAFAHE{ad@$SGJ@RpGK9+eq{N%0auRljdC&fO#Ih7xM5-!O37y6xi5x~9c za{6;kL(|64nY0^EqlcG@YCk0xJ-YpH;q?6`0 z@Npg33r?sr2 z=Rduin&`LpXa9b3@WJr!MAju$#+SRna#M|`s>UUkdghTQw!rt^eR?b8$?_|Og30Va z%l@ffKVFPxbbtP^wDM~*`uXcsMYm%Y@2_eK!y|6LNN9W~`tXCt<83Q!Np>;#yRy70 z`GaZlPPn#KHu^nxXk$pUbolzHkJ|IquXBIbegtOjo3C|l?wapUPAYv_@no{c z?GM99&iL%?{pXVI;aN4Wk?->}mwgHSk7|GX`E_cK4`@o_!+$x%a-9DoE~;ES5*v^5 z|1!JwCHlJT*_xMe`M<&h<&2wKrF0KWoijOx+VWR`l&v#P!EF zVn?B%gbG&=J}Vrxe)Z^sZ$nnp&m?V-gr70gyw>udWwrelohPy($aNHEN&Y{ye#5{Z zkOX83`WOF~6CjiXBta9X{L+q8l)Q0hKfkOi9nf(rp*EEFWaBp-e%;?t(RZHckVSB9 ztQ@#t=vNau&{#E8M3Q!1RK9of$yJ+UUtSN~yY=)2ITfSs*7SZjhc=PH_HDZT>=sS4 ze3B1#a)Q9h4}VZ8yVG5dYtB-Cl;D@A5ozFDmLH!9Q*|G+FUhB+y3qF4Hr4ifyMn;VP$^7hLS*-5X9CU%zr``WJImSD zamwUKP@1pWRR!HHh~uhGCC|~62(>4z>QD;Y+(`CFMSq$-+OtysSu*1ON#QANx8)AF z&oV5K^3cftWAURZBOFIpmqk;*Fs{YRJT5Z{s1$`-VKE8SrJ44M#*wc}60al)frvR~ zACW#sPsc)f?vF}g$DG)#y-K>bu_xw0y~LzBQZMklfr~TTJ|~7!9XMOleUHsc_zor? z4mFX}30^!S2P}OX53bOb-a{xq^8(XwZ1v_SVrui(`Fm>Bw+r&E{EvKt-CS?UC%ll_ zltbXLcI03ZY#dcIj?^v=TAU|v=#=lq3g5|#H7qU#Yi-%VLWPhh@{eQ`IIs<=*O5q? zTd=*wO!Po-*Pg6rw$Z zRzFQ6aMGI5M6^nV){5ql5X>M&MouNX&xAh7>NCkZK}M^ip73UHhWi-Zc6iMU-Vnr$ z%!)>hP6yW96?I_ocPAUvDK5hCOO;seA{dH`CU&7D{hklrAf8LMB5y;bad!+=LjJrz zCB?Puf-Q$U!5Ib;9zhN5F}wN*frOKz2ptqI6S$tbacWM-aStyO+uWRL&mDW1_>~)l zKFv3K8po4T1EP`_Qezpq|80R;v`I6DK`sJlU0z~lsQmcBaG`^DoWmv$HnR2eN4~=& zV22@)#!QyTrip!AgfJWBWw2R}CM;EUpFlQcec$-elrE&v+g%fRM-SN)$y}!3O&Kix zBv@p~YEU1H4FQ^%TJ&vGyWM&lF^%abB*h@OTsJO+Y7cE)6^zW#IXARmLHe)z@v2p+ zdb-B`x7jZ#Q~_wzR0Nd-F%c^l9i*<0q`&t=9g}QVtg$rh@S)=!C@<6U^=uY1F=!}! zWeZ^ByGU&O!lY~`nxuwOi2K{vc!^f8RY3z0%V)_>B$>ztcxcIGbRw0=*%pV$5JGU8 zV)zFXdi)^DWU_-`L*JCckU5^=p{t!8ww=vkf~Cm$Lm_3hn+NC!PrMwCN@jb=9YQ?T z>4)&>7+>vPA#O_|*V z52dH5`A~NI^8}~TOr?UOSqi?|ePS(6cF-C>cKL!EF# zI+;rcWAk_@^#ZD~awSIU;Ds{EN>7X0M=?~1q>e;FXlzgeQElg*8km-= z;wJB*XCZOd*+WYwn0;(&X*T@#j7pJe?khqt`7CY~A7TmtX%xM`7Ro))#FU#{Q6NOu7MY6P8Dg zU(I5LD-Q+D{!TzTp6>r)-BC6uLy=`XA$D#TvA;^kBAuwzYZ_KBxsjVOTlm=s)e4rg zlB1NpTXcRXK8&iQEtzd7vmK==7=)sdQ;ildn_a}BV=9ZH&h1ZgD(6jk8LMs2%1 zxbFI4*8oZ(?-*N^;!wH!zKs`jTe&%dSNay)p3up9o*khJd0Uk z1w7tSrg;aTR9p;)P!{cI!!wE%mWU(E6x9f+^qB)nj|Hs_jxWUl!B0Bi>>u%JQgR*I z$`6Ubb7Yi#DZ07wxe}WX-xH7zPo)-+<ug?$W=uMYzL)F>OO5yA`>E2Ndl0^fvFJDBtNb&NT zDs|ccH~5ngQpZgvj*%dnUb}BE1=2ntSayaX16C$-`MKtvh+5 z=|AbjJ42vkOVM))^Fql6?n}5sBT=0OP8vGG5g!(9E+QSZU&6+)TR_-ot>y-Yvpla+ zO18vC+oJcZAItRj>p8Dq1(H`sKC7w=n=4Cc~P1fOAIF$$Hsnz9o-JjBPyS=7nXd?{k2jPCjM==Y9e~&Q54zpw-__8 zCA%wh#v91_DX=(iHF{p7^^w=J1|-Dwnk*-Zdxnaf5u15-Q{>)VHCIek)w?@)4hLDM&QWvP|P=#VxlcT-H4~YOQ*}Gi&^PBj4^N^A3(c;yl)=_)cB`w3c(IcX*gTj z%m#*K?v0*>lw3@;$w=M)5jd`oyiIqj@^`y!?Hkv3;^+gg3)vIi5&L=zV4DDVMW2;g z)S<8)G)1ybGyA=WdfZ!{`&Xf1NlAz@rW6${gJQ{SV#X96vP@&5DUj{Iz*++DhbzFX z70bOHr>+~wN^2!I1|F&23NSN{w4TT?>bLs31#thEtSrfg9aq|SwmhbY4BkY>Vk!S# za#R~2$4Lmj2rwijAmz?(YsxfYLxQ7#?0)jabbwDnL@-j$oIEO920hF`y3@`{N}-T+ zs5=8G1Y4f(25IpQDA98IiUArEUPlD#m~iF=t&z^8BWboJ4Cu=w=!sP9tA4baB|MRq zKp?@?`3GM5A^mtbi7$J>W_!6j+L6h=^g?m&=KcZ~;8pYaZ#U1cN5>!*&x58okl&n7 zI*BOlAk=MeUa`a372Z+B<9C}Ps{#SLVvMB_mUBPoQR4|}kS>-9Dd|t1_{G^vKBGHz z9`O+P-Dr{Z(E{WEc#-tHXcxAey5J=d!y>7`R7>ug)!aS4xkt9>)o>tMq7dEEu()y@ zsuJ$Z!+ZmfrAW#G3)13qB+B<J0v})%m7EwGMRiE%aa%tcZx*!py{m<>a0K z5`iN5Y5PJEuy+xxON(^*Evo>4_YY_c*_^s$h%2N!B3O`S6fOgV&7h+^0BnN*mc}oB z`$^B{a>wV2zFXsNLyX|8VnrXwW(LysC6q6yxJrZS32;F` zQKE34lWLLSAzbK8i5%0mDflV`SLJgBw_k{8JH&EGg~yg6R7dq4ft%sRH}3&AT}cJF z?qh%PJV^!se^>y~;>l>;YM!ZlQtl>yyG$Vx82eqg=T;)v0a63p+(d$^39m`Vdkl=@ zh9$EeC617%)}F9M*iAZS={L0K%54Ot%5OUmfC>0CT`6>x(=3JWSOyOIszrvE)nba` zA=kgGTuZ-_VI5Deg&r8Iw2Hg4N`nlx#y2F7JhwCa@fnFZQ@}%dt znk$mS3#{Uk)^&5W(# z9eNy}+L!pN&}qcWq&tdWj2|8TlUzTLEj4-WXpTH0Z+tbwkZye7QFF|z=D0u247CSGkJKjYd2r(NgQTkuk{>-d^XkF5 zKM$B{E$kgFoINdRr&}_vwq!kO$$8b1_os!Y_Ar74kr!_&bZ;tn1sIZ`i3h4RMo$)> zuJFgT%E#N-p5A=uC_xO+A-7ZFbSo7^eQm(rwwBX z-5`S>h)@EOrhtKcKn8Cx8{}B{tPXr0SjCyvK7AFRJ&He%Q$bBbVDl*W8G$)n5N&O# z(Wtc?4Q%4Uvun?}R(J5A;R zT{;3LMmd%8l_+qVoG#OK+3L}*Di&_nd{^zOi%AKHLu71IDe52t9Vx&ii)5{V9$(uY zYr5X^`~wE|;Dg&k?|w!Qd2k}1iCygpGliq_VZvK&y?0E)FXN1P2nL~#G5i?5*qcD; zJ8lbP^7|-K(9Z34_KWKv2TRvkOsG40+LqtNLfM^OM^T~LzXnKk}0mx7Sh@_^vD$K zdk>fIsQpc8SThIkVfM)1@A;hpsF#8;A|MucGG_Z^tPM9#c;X9!Otn1;+ye9xdqIq| zF_>F&)14Q{a75V1+-pEb1Ti7OcJjLbEpU?q{4NQVTG|QA*LBy{otl=72K4-V^~kll z9!pQbb^q>l+brh5EIk=fyJgQBRc!`j_5zV~Y-S09E$mhWLv;iw?VV#fPoUPN$W4ym zFga6A2JGS|@>T|Fs}N!>c>}TB`HaW_4EkYP0H|7N&=vtq4ex!BfjGk$KSLWoWeXV7 z#;MoF5Aw$){Pyq(-Hj6U7mrfjWVZ+Wed?(V4&K}6l{@Zc)*f+o{J=FpUL>n5>Mt-I z@Dsw7MY6KCxYsjgqH=r!$^3(y`Bbk&jsc2dgrW%YtremuRF77$O=iH`L8eN~ zqPwABPm--C?-&7>AP34X(F5=A#NoFyR8`ZBpA<=iV|Q(U6rMCjjLlp_To5Cg_P)CR zBtc~q(HQ%RNXFI(Up;>F1Of(y$4JeT07tgt{FzTv`6Fh-uSeQ}Z|fsF>0LiO3|4ZU zu9=cx5u_=}C^#CV=hsQXhmqdCnVPO6%{~!sW%)xI0zmhNzwbOgH2)S_hAN_WuhqRf z1UzrNirWQx>qkPy?}Q_E!B3MQy965UtFrt1K(6AkwdF_hUenuR{js7QSwF$qdQcBO zXgC{Z%pAWVKz`$m`~H>HIXA9%ZpNn$*hhk#_@Zmh7r}AwH@zL%qVb<@+>D`l`_6?K zBl93-AsiVeIzWPd_kSU`XgjL2^K2~OwK4lg?E^e)GUJxdb9s5M@S}*_bKB@N1hEuTocCFIA+Ae$r0?5J<%ZX*gf|eaFHgP!&!nF& zN#TB;dHUNH{fA%|P5Roj?`xAxcVpbw);z@go3{(!+>Er}$!HMsXGJh@AVLex79O@I zqMgp7pIk@e649zS(P=t7uoOC#_brf*ROi2kh81c7^PVma6M?|X^+#Xo7q0Ge(j`K7 zszV7fHxrQs3TIuIy|vQ?su?- zm@Fgy^Y(kTEkv0FKOkIGzkzh~dZDW2o=l67r$sPmOGXwSjCoS8HmP~{{eQPlf8_$PWiNQx*fg}4MvFASO3BeBtxDUGEO?E&1EWkV|k3WYg{Z|*HUzP$MrMepc-0DA!3m>Dy$1wOf4~A#_tgHzL zQdE!85&d#eCU(Dp#DPG^(qETtU~;^_Na#;5qaF*<%wye(h&u5JJLi&7kn z2YVs&WAZ3*+)q4NI@&s5Oo;z z3hzjNf`2s+mWe&E6f+z2v9l*j%PFtc(1nZJspwxb&-Xn~-8PVu^O@8c<#|=7HzRcM zCfg2es2|i)+VL*qx|Xu8tN#%PqIu}yi@b(usH+0jI#l%X;+-_OAvI5Zk3YLnu}4_5 zclxMFaEq3M!gI0~430f!HZHB@+r>#yqH!_+?VL0e&N=1_sqq4&pV!5GmUh%s1}*1I z7??lr`Vq&N$@9tx-gGd8xV<`jCj=H8VHOExVg)Ob*w;<229;xv9#G#sb~(>z2&bOc zu5>Nd63@9VjfUry`}n;{{%Jn-YhJ@-FXW2FbVvHTA60877Ct|}d+^=czo%El#~8&o z-tSkCma<>|W+M0a+=kp>*)ADJxtW|z{&;6N>~1hX(VF>_&eUDu&)7>@%xa+_V`}z= zIL9?QY^T1kqFdf`JT>i({S_hx@18LYQHjXV%F+a7pD%M()vDGf?hsRSHO`))mdg|n ztaL4%sY?R}d*=jjOUJ`)>K&QQ)O((X6q+R zvt^9kCYdNK^$Oin+BabHbF8iqw+ms-?352VQl*%+t~;Jx{cygO$*x;_^{oqVV%sCV z<<=rDGx|sMOBzHr?94-#`70s%be>rA(Cv05Sct!mXJ{jcR|kL7n-K9PaS!8t=o`E! z57IdICfDYDauVD6Oc^=P+S2NkL#{b$WI<$pll-)usWH4kVa<-C5 zvL!|>;_q_^R-Zrp{1<+#ywBOtL!zB2*I55h`}XZPM{H)JdDszdcX5K7@>t-GZ^oBx zPsg^r`gkSh_UR_oBXtjJAGz=YfUENy^Kj86F-rD37D3LErD+!qZiP&zq z)*iHb^R9qX?_d37KU!MbJeeP-Vf5*m!;&Lwhr*KMRZi3NbzS`RNc(l8_J`~3;tK># z4Dj-#x8@?X|!*>Iht{Lf)SlA=y@x-WWtV2ka z)Nl~oEQuoJhQg{5(EZdINr!YeMR$M*Ras})D_j>#*Ur}0%s=#NAq8WQ$xs?zLHaA+v#*M2fw;NWFCK_@MHs#}8$xsA-p6)jXfzDXp z+MZ8`>s6Cy%V}We>)$n*hf`sb0`?wII3}9Og%P#n!hd%`qdqHvTY0X! z7<6i3V9{-h}%g<+<`3e@FDVN!&`* z)2V~FwcoPu7Vn;v%pIiMkT3XPeelNm+KvCH?_ty>Vi=|}T4hiGT_rccY)QqA=m97^ z+&Wc9?~to!2u>zX7a|EV3J!ef%dKqEF5ts8@dX!fybh)97df0Pp1di`6$19p(Bbn^ zHS}Q$+oGL*I{LHY^|fkjf>{2S4GTy-GQu+hjEfNlXm^(uh6&3t!-pqaN=Kb-bjSV) znG^Rvl5~%Ry6)ZG2uTX$)Ssv`+4t(pL{rVhI;~S*_q;bQmnG55F{Tb$cEauzP?iM5 z3uWmj2ZJpk7`Y7w1Swc}6oK81fb^ zrHqp6XRa0-7GjEj=TqWy_uO{-a6akJl=l*-QuBj;cQrMj-}kDU>cIe_)(g%A^$f#N zoTiLq01>DEGudZTxwZX69SY<-{q}gi?$#fA1M< zmZSaRAaXq7?ndh6!NA@Gd%1>e$Cgrv3H}FWIOd~;LAmxJrA?Qgp806qr)Wt5h zc78jrLGDOY3W5A^Z*6@aZeiRO4x|=$TNqmj{`U5uX-tUhT8vNLETwW`>ZIiHEn1q<>Z@|w{#0jB zM_7hS=#0E19gPgnmVapv57?n>=s6VDFw$*(^T>F%BZrK1htE}j=eJsEJc+2{kPdi^22ve_%`qJna zwb6d(n*h7dt$%c1Xa{oHy1OB>dz3c^irx(hQ56aUTf+g!8yR627FF)OR>&$B-AI7O!#2$NGv|q!v8@C#GuV)Q4r45^m zuyOl-EbBac4~XbGFDfiwe?Rp1YXk@$^DEx^{YS5du9EQRP0$qhyxxG$i0PRbgV~dd z*MI5i$A3@r-K*0JZY2V8f59* zy?^7!dAs0oVcLbQfBH^Ij!XXHqKlsyYgcc(dWWcbp`pcwoPx=;QOiawTak3Kk-BJj z;Vy19`LQ@1m}{NKf*qz4OxEucPSL4l1yQ~P=QPoa++IsL(nSW-=G(=AO+wLw4Ddl+d z=EbJreyMF!m%>7v-|dn8E6M^G^$+RSqdZWa9_OD8^~QKOwTO1M0Qw(V&~kvw0^Y^I zvQLKEJ4z(w-^+mRFpSG_IaT74T&aOQ>13)a*8@BxjhK`#&2FABUP(2l;tzQDm=@{!FmEfP(Z7Z&TCFe6Udx1$8)OCGanCs)#mxS z`$-mQcud#B#&GzZ?y#gm1PcYR)LOuR0PaD^w!}mK8KmmbUg}Il5MFu;7>pr|(ja2Tb8iEahF;0+gN~v#Y^q6AOn4#yG@mZ+FUtf#ozD9qM#&s;x&SzTzzkHxU z@@7?!O9o5xu5%cE=xLX`;;gL8tcfYVvBka=)3FT)Uv4ybHs;3rHgKpIu6+P)fY^&mhHMtFzO1tMkV-5BEDJ;T)-JXu z2m`HhYY}ly0T5;YH>Cy1yeQ0KassG9+`W?op)jk3o5UNEDQ=b%(Mt zX6AO%A^vlLy|JNGbf$gc4Tqmx`EB{=s&TJue=Z$9{1X{ijoOI^=RFS^{SYMgdt8mj zR^mY>0`?lUuzb}sErXu#&KR*2vi#3JZ{RT}E<(1oOG#8#!D{`k1SVJ^+Q3^q6V3yp z=x?AKM3dwyuKQFBBML-?rdOhz#!u9Fh|WWt>vY z=Rl|RvUf08dVHwN0)0miM48NKp+QY1p&H_m)>^!rbE^DXCG8-Xb}2lBH>Hc>Y>j5e z3b|JgQ1NrYniH4ui&^1RWMV(uo|;PTPdi%u1{eME&QG=~9c*+x-1vHU4`;@BB;4q~ z8N-PgnVn@L<;rSoOFXYbWcih_Zr*1;dVZ~2 zP-Pozq`ex^c^^#Um)qBC+g$^p4Po|p=E0=dgY?(>X`#Osk?(E2_V-76)7j_`k7G99 z_rRh9@!$h^cp#k{$^-dD!994)rvVwloiFV0yN~UB!{Y@^oK>DkRGxr?Ljp2%@lX=} zqooj}PfHELLwC1}cw{iZlLidg+xuC1j7c6p04?;wGuaqAWH@Ml6<^!L9%5_mSs-M} z@WDX>j;4TPJP3K0jX9N<)lz)$6ry^sYUbW@<QCmL8bVZK(3@?L_#lMZDk}+|MrwiQQr~9bAqU(uwncv? z1cAqR5U7kB>l%0e29g>Cc4s0|mevFhoip_mqOvCU^svdq)y6^4#XKA2sBR%Px`Z zAm2d{O)+lr2-nc-`ALrg<(mpC{ zPF~tYT1tsp($~bsaKVnNaFg^@ZlD{j6r5oW_ML-~KBak);o4+)9FZ%@tw-T)(rtmy zMzqvDL1`9zmX&xeUyLL`xhX;5n}@lC>Tf(6JoRt-)s6JfT|p^9knLp7HLs8G5te|E zsYy;XutC}s$HzB=35+jU%)@j3Ayw^PYV)#BnBMkHm%aNkt?9(q2TI8OsMH6|Q!UQ@ z8i-FC8)8l|D5RPjLLO1;=Z2C))NLAhbZ99prZIQkD?8@J1~TG7Oyke={!8;uZq7#> zoj-Im_DK55X6m=ibZEo#6T_iKcu*E`&iZyNdaD{`!m%sm*xy5HwJ{h6!lGegJty}cx?8K)tH&1I9oi3oWzHR)mk6t-a1^$|r z`sc8>J$+6&I{Q19B}Y!XkN9C}@xzOpCPx!nH?z%G!G{b}#dDBD%-tq7$O6HS?fowl z1&~9$Gy=nzD@JOO(@zW2d8J%5$;*g*+<8Al;?Ccj0vtY4k5WakdqHW(KwM~Nkk{^v z8_m$Wuic`F+GC(@PO1AvtEo4o=T?JY0VzkmOE#SPxlY3AV7vad-u056pDD#m#p-_* zI86=2v}UA}R}tz-tKm0h4)vvuLQpA?zpSvu?;^V`rb;u1GWzy+v9Z$H{x*x+y@Y zMh~+1myYBI2>45UC(E5ur!57H^*LS`X zseU+~gID(Li%x*`;*0LZHC4y{K~zyvZ>l6@R&=2(XmpXGOl7LFjrjqO%i1~~_>WIb z{4;#Q90s<;CMUdD{P{>`0ok5np|J0a_mb%J%HZtA*}K=H)&pvuXTQmDu|T!!EVE1O zqGDjFM*ZvYB389EYfv-3o8sXb4XbcICYTgMNr$@=+)2^P<4!8EF*8pwLDUGYwN48s z4=_umBA=Lj2XzgHVE9Vf<{qx(IM^&5*)j)qUIs*l+{G zbd5{FhaXm5$_C0%#p8x@k~HmXYd&=wnAdsppZYdbrf!N{Tl^AE;0pIqy>4J~i6oZ07?o>1L z-b6bYt3AQ!kX8;I?+lPTyNsJ?xoGPUC>I@DIbj;dEWH%sLg?tmoVZxY#InqA?xx$j z%XiDV0)f7IBY3I2@YT+BRUf2gNjC&8jwEQG@<|-y2l%n5oe$5G{ZFHCup%B4Vjc!MAp_|?9MB7QO0qXk z=zuHHSm}B|k)D-Sy@x;BRBukxUR33Df4E24q`z}-fd~Shqf7m3EYy#a(`9lRNXUxx zPUjBH3DR&Fl7){V`88yJCPtWpL8x$jUhuFzkyLTnJxahatnB@#z=CyS8LGKj9QmgF zsaQIF6SW0~SPF-LlZk^qZ&{!(d-9GEd2YJL|Cv-&`|&MSo44NoB-wd6<9yO#w5HAH zv7Id?&(5sy)48E6+@DivDWMHpIWRD~ng};`6T-BuS@?LHRNZ=&^Z>X6(jA{FqX5dZ z-Y~%*dX-_fBuuk{b>Xb5yUfyrX+|xMm~%mWwlWFZ&2l0LHV=!Sa5m&TP66JmGe@Qo zbGd;a8BasBOfo1{Gh+$af22=uSH7)NY5H|k+4be_XO2I@GEtrQ3oHCv*uAFq$~8nI zj|k&umz&W_ov9rb^9kvC9`=OCB6;s&k(7?;uF{u&r?N3oo*XJV06Pu#uP}aIz5OEG zSH0h#QhobY)aE+@A6QxdK2V7hP-BZrh3OL0?l&gZnM<@V(o_;lx0< zP++1wov5MBNl;M#S5yz^eS5Y1NIT6QjLGORK{n^RF`)zo0j@u%)fc)vktbo|HO-pY zvuh2y@nDu(n`Jh6q*HC76>J{LhRF4oqH`mkjOsIU3)0$ z7@iB7mfq8%+dGz5>)H8HS z%)e&Z-2|jgARJWX#C>MXeg#Uy5UoG+24*M1GmX5rX>L%{<{UrCcB{kSI{gXR&9(28 zzD$=v*(_yxY1B@91;M%W#?_9#Yuf~995sn8Rl?NZ1>QY1^~`CTe`(&Ou_j^KuHznO z!KoC1HgJL2Yj;?jMy4gp-8!DBl2HoANx9KJ3%S0YuM7>zEM(=bpSL}wxyH3w<8(e&ZB~X+D}2t;zevn_O?k?3QN03@z3)>b3m}#L z1FMgq)?4MJ9nZsbGcHTpM{h zzJJOuo=>iGHw6n`8kfTOd^2rObY|yjU|z*s9U-_w+5=xCtw^nxF(2u}@F|bBqGq)y z8vSbc!gNEi`4Qh|97B4%!Kr@AgYXgV(OIIb`C`ZYVkQ(4%EH(be^&=A#|mOfp)MMf z5EuGw8Cb(^*hR9*4Lv_?VzSN;t>|4V6+balQIiA(kthC!HtfG3C1d46xUwN@ctBfi zW)*5xyO>U150g5iaNe#J$nhjhX-XzJ1zX2vQ*)q+e=EV>HKj>C76Q#)8^`Q*I@Ye1 zJtUcA+R5P160KDVywCsvMu}2KbttyoEsoo)X?ZrG_RgdFaeAv;VE|rl z^|bix;@!bNCv5E2p4y$;cVTe-vx{VH$l~138#j<&e(mxup|LSGWt_h*)6PKxMC2Y6 zDGNs5)11Gj#Dfghc2o!gL7PHd`-dnrI$Q&Mau{U)yUVz?bN|C`WSd&sKcFDt#>i@F z+iE9{8kn+oz!_CyRm=1T38jn)U11QJkEJrcuVG+e1qc8jVSNud+s=d%)u;O}L%sV2 zNJj|;T^WidY5iF4Hlue~_Y;&oph`Au_oje72Pjcbl(pB#oJ|G!uAo+}YgM2i*Jv^l zl})a^IDQD99uVX@KAq-+*KotDFKDq(6|2C?iAo*k{Mjj}aMu{HdlKc}l8A11(3OWU z>)_PQk?b)!r(!(OJgZ%-ap?3>Gn+q#lug|W}cR%mZQq3bHYuPW#$6_ zGZfPC4t>77!ZPfu9#kbJ^Ws2U&>CpKie%jACGo%{PtnxpPC$C*4hap%D~la{nQ zEqNvnFWq@~-K6#Aoz{AjN6mL0{b%xz6l@zYX`hhXX@6_--^V-uEtouBx$}6#M1ZIj z$e4C0)plr@cIwx5{xdJO)OPJM?RKv1_AnQu>49EIoR zoeAHZfx3}6bl7pzo)Bsz^1?8^t6Wno}$n zW|sc#tC&;N>&f%;UL3Qql6hxR{rl|;N>UOI2>(qzZ@~)%0!qxk++6saX6`-wZF~bb z30j~8)!7BbdiO8bF`4AK`hVx>()9d3vxyD!sgH3l*31`A1YI&@zT0B)Zf3!`wced> z`ZK)tQVUk-Ykg06d&~_SfEP24>ejKg3MiJ^415vUMcPW z*=r_DaDDSO_U+s3AKNV!G|WGE#eG=m{!38TxBfn$E7sSox(nz!K zE2NV|Jh0=NWXs+8k=nt|m`ei5JZ>n)d)O2@Jnz+3r-0=sNW>pH>t&91t4V=Lg#xwZ zyNVH+%Z)N0>uY6@@mKwsBRE<4b-zn|(r+2q2WQf$Zwm_}4TNKTh)PAxUk#dn4*pGx zn2Z|0A6%qN#>R@w?1$?h45p5qm9B%;0tTd4WT|(7?;b+|U=)??I`_~7g9q~;)*Mi~ zLGT|O{bLD++2(kiZw4uh$v^?>-cmc=GE>ffUxF*KhcBhpDE*#co}E6{DP9H?-i;qiAGy?3;hM zEj#w|CbJiOldc~hWF(94(i*Okz>jB-nfgN)6_E0@_m~@oq}{26Pm5Uj@inF6;9uQ{ z;qU8+Mw^0rn(l&M=8YS1Fzp9S?Y_% zei#-l8GUzj`{Urc=f{s--**gc^495AI>Ru^<|B>_Jlh^ie#gM>U-SZwea9Sgea-KK z-P@_zZT>yZ;!lFy=^U5zroitU&>d@Q3+rS;+~x;)pcl1JwYZRHmMSNg{2wpa6~~%f zFtd|hn}c{qarX_;;lr zd%7C@zgzq5->jZ65P1INZfxwxu6qy#vrDgIg14H@TGb`L%eHd2^3mzG`Y#ibVgJkg zx~7#R0ePzH#HoV`N97x0e|5jIx+}LFn`=kTeZLU%e)a7{3t4Ql zFq7f&1Tu_ZyF|o2YN>CcAl0yUp%|1*7@n7BYgdxtk-fse8L^ zr@Oh=`CY6svTJ+RCjWay%e(gSIad=@nYXpO??i!90-^uAD;PSLkMCm}^im(Mg|l_J zP3V_xo)9=Z#0!C0QhK4?ubW_cil6vDsJ3`G?wos!$E&$dzxV@?dbvCKMqDhf_d3h> z`m3`}%PWCExO~=5Fp;OcGrPRb)B3N2u#jKNt1o#_kHE2K?Mmx(HnX_W`}t0c`MooJ zyC-?JOTEz_J>Z5s$b-DMZvoeHJ$i4!tqYNaZ9!Rgeb>Kx8Ke8Ue>=NZz183D(IR09=Ig5Uo=;QzhAL#+Z7d}Y^il_xxROaP>R8JInOF>E%)lh4}@ zgg9r3X=nbHaQ{4aEN}v2J5A?2-cFec@tLJ>n`vc1dxp4dZ&7Zza@4Tzi ze9ilO?3*%56Z>-;JKV>8z2E)QhqT=n|9A(#^YX&p^1}D(HUP)2@Vj^hE3g8q{f>wA z*Y$MX9=lDqdFh|K-ro5q%Q>Bke3jEZlB@sRPrtNJyW5jLzf(ac)W7}Pe>CKOCk+0* z07MFZ0|gTNcMu^$1quHtDCqBD3Wf|P%vj)Jm=KK{{dCmWVZlU^BT1Gtc@kwxl`C1c zbomlyOqu^Y47BM%CWDv&TJ!{9a*IuWK?i~;T6AO(r3#n|^~Y3c5RyR#D%f!qYt|hL zMb><(b^mKtt`imbt8fI#K}#!Gj4C9xD=q z(8M+u55z#SvA@WZ={~T08S~}CA{AuzYY+lnupLPC=>yZRQ^F4X zpsYXGe>s;nEHXuK;lqWO9PRrzVC02ElU<&CX7A^wN#daLr&A~F+Or2J5a16El@V=9 z9ACbCNfHyXbO;ebQ^$_B1lj7SDob?z`}z0x{~y2rY4U);0(064fCPUkDXIpQGD;{A z^mq+VnrH$TAb@Dh08F$L zFnH8aNa!I>%`r+?{Sg30zEE8DxM~M$60fteopD&c_{uTO zIp1`wBss^GvQ2UKq!Ted`7}w-c*}LysXh~`mD!tY@@rYIvJ5sQf4vOWR+79r*#Fjo zCt7SV2Hv!{U3Do-_uPr+m6*+ublNyidNZB~2Np^hndDNu8vy0+7*&!yG&yS&J(ooy zVZ9^{vFDJS4@pIZ`VK{40#}6|n&_g9rpYN`Us@|Brb}}6R;MI%?JFfXP+|wGmB@{^ zi3DbnS7#HpsWr}Q{O3+Q8T#6^Yp!bjl_ZjtY8L%a}o-sgo8$!hz+Q41rwg| z3RIxNGXn68S_JK7EQ?w1R;Cc%iEw5lAcD?#7zyM3Z~z8)-VljcL?asQg9wZtu9 zBR&y|F$p0K6Eem5WpIO7^iKpM7)6-e$%_I4qtJ+e4Fa4Ijc7bn0DRDd8Xm+UGo+$I zV3s=?swW9V(BmHUcz^@^FaXL6;~)uHNJAbHk%?5~A{iN-BsS8EH2)|@5++$mN-BdG z-Oxo6Bmfu^!R1n+4AVkDSt(Kaj%KM;B?&}Oya12@lChNKENNLwTiz0vxzyz@g_ZyV zB!HK}6y`9ASxjRd6Pd|W<}#VtOlLk5n$eWzG^trlYhDwZ+0^DXx!Fx`eiNMG6z4d} zSx$4F6P@W)=Q>q#3Rj&VBnN>ZOJG<}cHR@8&TGIv`PqOlE&!kb73e_YnNOh=w4er^ zq7j9tN*3?|dBS7@VaVt_71~jc3a9~2@n=g!P|}jFY5@>X=}KA3(u5|Y zpD~r`NJTPJo6?jaH=XHAL{L+m#?*@;d8tVP`VW8_bpa+&>i<$rFp{Dk6`&iC>QpyC z5|f_vAWU8A6A9YYqI%Jt4jsq|##&Z?oS-BYod`z{qE?Z(^&nx$V+X>J5V(%yt|ZB8 zLay4^3G`L39}w(bKU&yfhEymxbxBWG!dQ8(l%tMCNJ?8;S(Og;Ac#e5lr&2c&2l!e zBl)aILn{)mh6J!M9mr-k3jv!bmahzv>_27;)1U6ss-~StZ4-joe=OA>Th*;dHZYLl z`lG5N>FIJ20$kyiB(?vb>Qte7)s;}zvMn8|1GwAW34C_~-BpQqD-z!Ba+f6Mj06E^{i%vFIodT*o(Gxu!Q|ben0SCBG7;c-_7qy;Qv}+yF%9l4^`?3mdfA+^R}(~ zm9VR{s??i~WV%wluwgmuS((ZN!nsAr1Rxt*hAbchDOT}{SM1x-g4Q3fMTl$tL1UrV zxW=MgEsR&|)VdXvw=}l#kZl415hG-_A#Q*KnA~J1Gg-z50W3mkYtoYV*11Y`Du$hs z+#_dIslnBBi4#WWinLq|kFabD^SI#HMfSvsj=RT(w&I36` zp#Qv9@Rs+xGXQT|DRPh#oC+cOy=xdcKm@uT*dzvyG^UkXVFf3c!6A|q8fItHvi$tXkXtr^ZV4D!xx+OvOHAODrmjS)Hjyfs z8PaZ{y!#}xJ+8d--4YbD7~m;>bDsw?13L5By(#hY1oVvXJCDTA5hrxQDI!sev$Z7i ztmsQ7(14Aygufx@FLX0p@>=T`Ri$Qij8iS|l}Gv2uV(B5m`sC#SUV-P-fco~4FO%} z)Yq^5HA85OUF{A8-6HX`(JkxSqPy9pJ|_3nfpG1KEPbWe)%us$jAYMBpz2+vfdpW# zTig+B@eui&x>?Ww-;(d*1Z6x4j~n zbBY}RaKg9Bp8vpjsxlCz$~z?kX%#G~-TiV5?_0w{Z*|N`FJ+T1pxR@X_Sq$$XxA^g zx+d-UU%#zd(eD`5*d7SevyOB?`-At|9m&&MTH~xsUEJihIzzC2*{mNw-RqWevB5s| zX`4IgC!ummupH*+o;cNLwklS^-0ttEIU#LFE}6-n620G^<;*8^c}Pt027es0n=6@`R!SZ6foENab!X%G7TI zJg@XZaOOII1WS!%!pN4PuvJ2XB4B}!C1)a_YSqkYc%g3ZG^>9uF z8A8Rj?LQy@?7RvH&J9(bN~n^m!kh}Kny}>9?FsX({m#to{Nw#_Z}bqt&o0mJ_$>3n ziX_|#|MbrvE-wR>ZXndK4gEm^C@vu?FAm`_&gw7@OTyq9F9RCS4;e4T9B|I~kP!P2 z5Ft$u4bcx5(Gd5nBrXsRAu$cd@2Y68q%09YRL-WtZ`C$21V0g}07}-J4cpqx5_OIR zOJWOqE%zpZ_*BaHkj?jM5crJE7FX)nv~BpD@7SWm*nI1>s?5p~qWQEf>vHkzh;aDA zP27@C+LRCqw~h5&kl1{R8vjW`8d#`EUYL%mfTF1C%Nu7jg}E3)CFU z!4}K}bnYc8%+xsW^QH>~L9wuQswGemhA1)>i|xkbEyG~27FQ}3XE6JOu<=rgyNoRt zk#YDAVgY8-*x>9JeJo0rj~I6k8G~{sdD13kuqdg|+QbeTO$!C1&a;A!3*&Fsppq54 z@Wh&u2Z_oXu@NhgZ7Sg}@51p7{UHqffdc=53`fG9GLJ0tPYm0TBo+@4Squ@05%JV3 z<19`u>ntw!^5Ry|FaITK0%t-5m?|P4av}lbrG^b7)y*b1k|RBe*Q9bKB+xP|v&2dQ z$7~D>*H8CS5*B-p2IKK2?~=QGYw6mn&$6gB$~mtrI*G0%i|oe4G7UGREGID~GC(^U zt_?S&AuBF0CvP72@An8zJ^%0Ogu>6(lOE#{KHXFE?2DvIF2g9&B^DDhd+WsdGcpZo zGRscxFe)<-&lYnL0z7aRkqw}n0-#pv_e#?=Q4=WDi$ZnLv~V*wtIq4L?lhb2Hpi{% z{DJCv^9YqPKK~~x-~w(MsggOrGAd*A*;tHECgSw&rlbvt)e ztlDzV_gQp+u0Q;$7? z4mk;yYYod;Ryi4#O(zpz$+m1kH8~@eOIuYi2XLZN0-_Gh;%+rCAIf7J3YqM) zC9n<>Z~=EA6>>a5N@h>uWoOn+Ka8YmkEfbe=?2mexlvGs4Q0deB?%RC6_IoAk*7pr zUNzTI^EFbZZBpwdS-^JkyB-JK85v`K2~x4(`66WcPA@x zdzW}Ww@sB%=}5M4`(t*ata(#qcK>58{jm`Zv3Q4xKY@3$VwMZp^m@M+e8X3K^N9(E b4O*493C(v}$CrKE*L~j?e&ctU0s;U#>#h02 literal 0 HcmV?d00001 diff --git a/admin/themes/default/images/icons.png b/admin/themes/default/images/icons.png new file mode 100644 index 0000000000000000000000000000000000000000..c015e3aac9a84ebad11b932e84722124772d9641 GIT binary patch literal 19694 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ÏmvOE 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 b`u_(2Nr-(&rSM literal 0 HcmV?d00001 diff --git a/admin/themes/default/images/loaderror.png b/admin/themes/default/images/loaderror.png new file mode 100644 index 0000000000000000000000000000000000000000..35ff3336457d48dbecbc11698ef8245441a94f82 GIT binary patch literal 3209 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 literal 0 HcmV?d00001 diff --git a/admin/themes/default/images/loading.gif b/admin/themes/default/images/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..b713e27dfba708a01c380e7c731a13b52a34edfc GIT binary patch literal 734 zcmZ?wbhEHb6krfw*v!jdZ*RYU|9&kkt+4ULFya6I z{|pQa5E95x{Lk&@8WQa67~pE8XTZz|68g!)$-uzNpaWzB4HaNuV6okB(sT7*i`QqX zc^L!>4t!=<(wVp51?zD`Kkg=-D~S>;skcR%7#$omMC>21xN*pcHs0c0tRNsF(;}SM ziPc1Fu!&|20tT$-nJa`fCQUjv@kC+C3!quI1U@ISvoqf2Xk|(i=IUl?N@{e_G3Yq3 z;U-H^uFrB+CTuRW+i+5nfx|fagWLs?!jQY{X6=arU0riqs^&x$2`7X};t z37RYmQ;O#*G6uOVn*=nAm7~Q)&(!ybaj}oz`WtJ?PQSHN#^y?3ICf5PGS1Ha8pE+k zgJmJh5y6y1=@^y-ft=a0ZG|ZdPArq?H(+2`(;|7`F{6Xpbl>GI8B?M_My|#ljzAN4 z3Pb@-+?qdUsm6)xA>j@^Y0K7lSt}-Mopvo#qQ-sCkLXFkyF zSLvgkf4d8-w;?feL$4)lp3HYoMI*E5@=0AueT*09aVgICcu;r3k!5-F!GZ%U3=K0F z9S$(a^)KPCsC4r`z65*B*uc`x?)kvPGDl;Yns{Fj0|R3#FisfHGY4!D^0$zE1ljvXNk%w1VH^N10QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~EC2ui02}}=000R80RIUbNU)&6g9sBUT*$DY!-o(fN}Na$VuFhf5;SOl zQR2k}8962Z;Gkkb01ZqM%&2mp#+Cvv!u%%_X3ds21*#in3e-1?2?(ltc28ctYrP)k z{Pb@UlQicB-E)}JlDi_MMmXbuk803?iR{rRp~2S#dR_^-LU%))h*>DmHq0rnjf;8~ zsJM}rcHp`#D%4?EVW;cduL6J7ThT2kQ{cJka07oF;i3Wu4ZceYpGm&F`Sa-04-5zZJCANLt@XPdKI8X22WQ%mvv4FO#q2N BK}7%n literal 0 HcmV?d00001 diff --git a/admin/themes/default/images/pagebreak.gif b/admin/themes/default/images/pagebreak.gif new file mode 100644 index 0000000000000000000000000000000000000000..8d1cffd64af72709b1180b3b0a51bbfe30bcb8c6 GIT binary patch literal 54 zcmZ?wbhEHb{( zJaZG%Q-e|yQz{EjrrH1%u?6^qxTdA0{r~^J*gJ9sP=u)@$S?Rm!_(~sUO=9vr;B4q z#jTK2Cpj4yIG7J^{J*Sr7aP;;!*evU*UP7-zWuuR&zi{Xq6rL2tqds~bx9pSO$?r{ KelF{r5}E*+%QgN0 literal 0 HcmV?d00001 diff --git a/admin/themes/default/images/sortable.png b/admin/themes/default/images/sortable.png new file mode 100644 index 0000000000000000000000000000000000000000..1bca649698e187a80e1b1951fde99ddea3d7b038 GIT binary patch literal 2851 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 BXOsW{ literal 0 HcmV?d00001 diff --git a/admin/themes/default/images/spacer.gif b/admin/themes/default/images/spacer.gif new file mode 100644 index 0000000000000000000000000000000000000000..5bfd67a2d6f72ac3a55cbfcea5866e841d22f5d9 GIT binary patch literal 43 mcmZ?wbhEHbWMp7uXkdT>#h)yUAf^t80Ld^gF}W}@SOWlZ0R#L1 literal 0 HcmV?d00001 diff --git a/admin/themes/default/images/sparator_v.png b/admin/themes/default/images/sparator_v.png new file mode 100644 index 0000000000000000000000000000000000000000..8cf5662da8c36a446e1e08eb71b992c730ab8d15 GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-Y0V1m%Ufcz7ii6yp7}lMWc?smOq&xaLGB9lH z=l+w(3gmMZctjR6Fz_7)VaDV6D^h@h{GKk3Arj%q6<>aQ{Qv(yqp%0-vU7cb$AD4{ Mp00i_>zopr0ET%XRR910 literal 0 HcmV?d00001 diff --git a/admin/themes/default/images/table-cell-align.png b/admin/themes/default/images/table-cell-align.png new file mode 100644 index 0000000000000000000000000000000000000000..ddf42853ea5c00663e74d9195d1f1264ab684252 GIT binary patch literal 1847 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 literal 0 HcmV?d00001 diff --git a/admin/themes/default/images/toolbar_bg.png b/admin/themes/default/images/toolbar_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..7ab685f4236ad543601b0d7dc43e429e041bee98 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI{!2~3a95{LaNJ*BsMwA5Sra_n`~3ut zhqFCqhNk>9eAm}?**d-K>ErgL-9FQkEgB1_|9|!V%ggstduo?ezj^hOMS@|yt(J@G Th3lO_a~V8c{an^LB{Ts5X5&F_ literal 0 HcmV?d00001 diff --git a/admin/themes/default/images/unhighlighted.gif b/admin/themes/default/images/unhighlighted.gif new file mode 100644 index 0000000000000000000000000000000000000000..7ad0b67ae634d41e76848ec0b6696e8ac7e06983 GIT binary patch literal 111 zcmZ?wbhEHb6k`x$Sjfci#j9d&%3_1)z0Fq~5a+uP;QtU1Nea;29 zx*cclynVJpP9xwz=Q6F#ReGoPZ4xWkEPX#)_EqLPYsO~h_`vc#s_EX6+DxrJi$d-_ L>N=ao&0q}x{nsuG literal 0 HcmV?d00001 diff --git a/admin/themes/default/images/upload.png b/admin/themes/default/images/upload.png new file mode 100644 index 0000000000000000000000000000000000000000..08d4d9268204a20ca343bf75784302cc706d2417 GIT binary patch literal 6608 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 O00001IobTth)ve1{+;xF-z$zX1$@cbk;N#jz zM8mU4YCupmEU?Nii0lQg^bRCan?Ab3%VAH658-8xBFJMB`IuzR@?X?_cxg~njWe8Z z7he1{t~NY@;sD2oqwB>InLWHP3|(&rFL;_%YXisG!f|)t`LI~xqj*wKLbXWp)f$eo z4#asOE4^bXVR1zDClZ^-`L@9YE{GEUM6w@>B$|*3C13A^6xxLq**_!Pdr{&MM+{D{ z56z@TzG*@hw6S^P4v136mt~*C)1y;z@#LIHDjO7zE0$NBVk(?tEAPD`x}r!4rSvo+ zGrN|Z-`M*gk?fXS+qo0;d0 zh<&hBzt>Fxc`eUN=*S8tip(N)4%c-Hsa$abS1kGZZD3dwRL~Y&OiQls$!Zy(aK#~| zjPP=1B(V$A*qhVABln1FxZ*mlSSnXYWQzzgJF1owUC)i7_7-#saE!r1=5SG$fWQ*I z?G_O^BB^|7ZhisN&MW7LKFbwbTU$SV{P_O;`{w56#>U3_`uf`1+Un}+%F2pDp;%g4 zT3lS5pP!e@<#Tg$GMVhlmoKxkvokX@)6>(Flao@ZbYfycB9V-bkB^RyibNuzP$&=x zMn*=4hK2?Q2l;$HkH;Gr80hQk>+S93a=9E1r@OnG&1QFYb~2ev27}Sj(b3-C-qzOE z+}zyQ*hr;PDHIBkNX*O2%g)YDPEJltOhlnjzdrQ8MQa@l0suN-^vmE^6Tt3mAau_$ zXbql@q{N)M&$25b1FG78WjFA2Q`{wpcH+plH-T+lc4H{-V^L{To}?sY^7t- zRp-#0EC|Fh>5nV9*osg354U2y3FFpwXQ!`Na;JKQ;uHrYmb=qU|MBr zTOt(Y=@VUlJq+6mQt^WJ9lIJTz?$6jvB@_0Ijg#xyHYhx6QE$9@Q;P`SNru{MQcx_ z>I9eqMm;}}tfJ*J&?Udq;ijL1AIs^TNj%ED8++(4bqQ3YK5><%~obS)3oEv z2`L9EwBilZbt=4c48b+h%ydj29TQf1;FclAt3p@D@Iv$C>k|Ryx={((b>+iEv*M}T zw2%>2(|!*aqioP7@6#WGj~%z23qkbWx? zq>K{ydFDHsgH&Ab#e8p|DBB+i&e7YjgH&Dp_Cc?zbGzF=vu-e#1^&&3UitP6Qvg=W z;+>M!e1J%3O7HX-hEcUA+~cC@8WAyj^bml>?&AT`HEEBQ}9Z=3X$i*Zty)I zU*Zj5^tvjIuB=l9Z9~T)&b;Eg=FK&TO>3g*yVOqt8d@&{JXvVbxz7~cYII$TQHvSS zgJ#LpO3a#6>HScB5@i5vKw}cnyiI*AUkCSPz7s6};*mIoCN(8C-gssBWz<}Twr?3} zMG(-KVyeCT&UjVicgg-NE@GN=DKAW@1zjD3zqggT>WPOqXK6a*HA(U%`Q-^?%QNdz M>|NJq=D?r-0Tclc1poj5 literal 0 HcmV?d00001 diff --git a/admin/themes/default/images/word.gif b/admin/themes/default/images/word.gif new file mode 100644 index 0000000000000000000000000000000000000000..9ef5d09b7b30c4f3225f77788462e429cc494b9b GIT binary patch literal 1019 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 bp?H9uNI6(~=EJQ&zcn<}bW|&qZNmQtXU+rA literal 0 HcmV?d00001 diff --git a/admin/themes/iframe.css b/admin/themes/iframe.css new file mode 100644 index 0000000..774013a --- /dev/null +++ b/admin/themes/iframe.css @@ -0,0 +1 @@ +/*可以在这里添加你自己的css*/ diff --git a/admin/third-party/SyntaxHighlighter/shCore.js b/admin/third-party/SyntaxHighlighter/shCore.js new file mode 100644 index 0000000..b0b7214 --- /dev/null +++ b/admin/third-party/SyntaxHighlighter/shCore.js @@ -0,0 +1,3535 @@ +// XRegExp 1.5.1 +// (c) 2007-2012 Steven Levithan +// MIT License +// +// Provides an augmented, extensible, cross-browser implementation of regular expressions, +// including support for additional syntax, flags, and methods + +var XRegExp; + +if (XRegExp) { + // Avoid running twice, since that would break references to native globals + throw Error("can't load XRegExp twice in the same frame"); +} + +// Run within an anonymous function to protect variables and avoid new globals +(function (undefined) { + + //--------------------------------- + // Constructor + //--------------------------------- + + // Accepts a pattern and flags; returns a new, extended `RegExp` object. Differs from a native + // regular expression in that additional syntax and flags are supported and cross-browser + // syntax inconsistencies are ameliorated. `XRegExp(/regex/)` clones an existing regex and + // converts to type XRegExp + XRegExp = function (pattern, flags) { + var output = [], + currScope = XRegExp.OUTSIDE_CLASS, + pos = 0, + context, tokenResult, match, chr, regex; + + if (XRegExp.isRegExp(pattern)) { + if (flags !== undefined) + throw TypeError("can't supply flags when constructing one RegExp from another"); + return clone(pattern); + } + // Tokens become part of the regex construction process, so protect against infinite + // recursion when an XRegExp is constructed within a token handler or trigger + if (isInsideConstructor) + throw Error("can't call the XRegExp constructor within token definition functions"); + + flags = flags || ""; + context = { // `this` object for custom tokens + hasNamedCapture: false, + captureNames: [], + hasFlag: function (flag) { + return flags.indexOf(flag) > -1; + }, + setFlag: function (flag) { + flags += flag; + } + }; + + while (pos < pattern.length) { + // Check for custom tokens at the current position + tokenResult = runTokens(pattern, pos, currScope, context); + + if (tokenResult) { + output.push(tokenResult.output); + pos += (tokenResult.match[0].length || 1); + } else { + // Check for native multicharacter metasequences (excluding character classes) at + // the current position + if (match = nativ.exec.call(nativeTokens[currScope], pattern.slice(pos))) { + output.push(match[0]); + pos += match[0].length; + } else { + chr = pattern.charAt(pos); + if (chr === "[") + currScope = XRegExp.INSIDE_CLASS; + else if (chr === "]") + currScope = XRegExp.OUTSIDE_CLASS; + // Advance position one character + output.push(chr); + pos++; + } + } + } + + regex = RegExp(output.join(""), nativ.replace.call(flags, flagClip, "")); + regex._xregexp = { + source: pattern, + captureNames: context.hasNamedCapture ? context.captureNames : null + }; + return regex; + }; + + + //--------------------------------- + // Public properties + //--------------------------------- + + XRegExp.version = "1.5.1"; + + // Token scope bitflags + XRegExp.INSIDE_CLASS = 1; + XRegExp.OUTSIDE_CLASS = 2; + + + //--------------------------------- + // Private variables + //--------------------------------- + + var replacementToken = /\$(?:(\d\d?|[$&`'])|{([$\w]+)})/g, + flagClip = /[^gimy]+|([\s\S])(?=[\s\S]*\1)/g, // Nonnative and duplicate flags + quantifier = /^(?:[?*+]|{\d+(?:,\d*)?})\??/, + isInsideConstructor = false, + tokens = [], + // Copy native globals for reference ("native" is an ES3 reserved keyword) + nativ = { + exec: RegExp.prototype.exec, + test: RegExp.prototype.test, + match: String.prototype.match, + replace: String.prototype.replace, + split: String.prototype.split + }, + compliantExecNpcg = nativ.exec.call(/()??/, "")[1] === undefined, // check `exec` handling of nonparticipating capturing groups + compliantLastIndexIncrement = function () { + var x = /^/g; + nativ.test.call(x, ""); + return !x.lastIndex; + }(), + hasNativeY = RegExp.prototype.sticky !== undefined, + nativeTokens = {}; + + // `nativeTokens` match native multicharacter metasequences only (including deprecated octals, + // excluding character classes) + nativeTokens[XRegExp.INSIDE_CLASS] = /^(?:\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|c[A-Za-z]|[\s\S]))/; + nativeTokens[XRegExp.OUTSIDE_CLASS] = /^(?:\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|c[A-Za-z]|[\s\S])|\(\?[:=!]|[?*+]\?|{\d+(?:,\d*)?}\??)/; + + + //--------------------------------- + // Public methods + //--------------------------------- + + // Lets you extend or change XRegExp syntax and create custom flags. This is used internally by + // the XRegExp library and can be used to create XRegExp plugins. This function is intended for + // users with advanced knowledge of JavaScript's regular expression syntax and behavior. It can + // be disabled by `XRegExp.freezeTokens` + XRegExp.addToken = function (regex, handler, scope, trigger) { + tokens.push({ + pattern: clone(regex, "g" + (hasNativeY ? "y" : "")), + handler: handler, + scope: scope || XRegExp.OUTSIDE_CLASS, + trigger: trigger || null + }); + }; + + // Accepts a pattern and flags; returns an extended `RegExp` object. If the pattern and flag + // combination has previously been cached, the cached copy is returned; otherwise the newly + // created regex is cached + XRegExp.cache = function (pattern, flags) { + var key = pattern + "/" + (flags || ""); + return XRegExp.cache[key] || (XRegExp.cache[key] = XRegExp(pattern, flags)); + }; + + // Accepts a `RegExp` instance; returns a copy with the `/g` flag set. The copy has a fresh + // `lastIndex` (set to zero). If you want to copy a regex without forcing the `global` + // property, use `XRegExp(regex)`. Do not use `RegExp(regex)` because it will not preserve + // special properties required for named capture + XRegExp.copyAsGlobal = function (regex) { + return clone(regex, "g"); + }; + + // Accepts a string; returns the string with regex metacharacters escaped. The returned string + // can safely be used at any point within a regex to match the provided literal string. Escaped + // characters are [ ] { } ( ) * + ? - . , \ ^ $ | # and whitespace + XRegExp.escape = function (str) { + return str.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); + }; + + // Accepts a string to search, regex to search with, position to start the search within the + // string (default: 0), and an optional Boolean indicating whether matches must start at-or- + // after the position or at the specified position only. This function ignores the `lastIndex` + // of the provided regex in its own handling, but updates the property for compatibility + XRegExp.execAt = function (str, regex, pos, anchored) { + var r2 = clone(regex, "g" + ((anchored && hasNativeY) ? "y" : "")), + match; + r2.lastIndex = pos = pos || 0; + match = r2.exec(str); // Run the altered `exec` (required for `lastIndex` fix, etc.) + if (anchored && match && match.index !== pos) + match = null; + if (regex.global) + regex.lastIndex = match ? r2.lastIndex : 0; + return match; + }; + + // Breaks the unrestorable link to XRegExp's private list of tokens, thereby preventing + // syntax and flag changes. Should be run after XRegExp and any plugins are loaded + XRegExp.freezeTokens = function () { + XRegExp.addToken = function () { + throw Error("can't run addToken after freezeTokens"); + }; + }; + + // Accepts any value; returns a Boolean indicating whether the argument is a `RegExp` object. + // Note that this is also `true` for regex literals and regexes created by the `XRegExp` + // constructor. This works correctly for variables created in another frame, when `instanceof` + // and `constructor` checks would fail to work as intended + XRegExp.isRegExp = function (o) { + return Object.prototype.toString.call(o) === "[object RegExp]"; + }; + + // Executes `callback` once per match within `str`. Provides a simpler and cleaner way to + // iterate over regex matches compared to the traditional approaches of subverting + // `String.prototype.replace` or repeatedly calling `exec` within a `while` loop + XRegExp.iterate = function (str, regex, callback, context) { + var r2 = clone(regex, "g"), + i = -1, match; + while (match = r2.exec(str)) { // Run the altered `exec` (required for `lastIndex` fix, etc.) + if (regex.global) + regex.lastIndex = r2.lastIndex; // Doing this to follow expectations if `lastIndex` is checked within `callback` + callback.call(context, match, ++i, str, regex); + if (r2.lastIndex === match.index) + r2.lastIndex++; + } + if (regex.global) + regex.lastIndex = 0; + }; + + // Accepts a string and an array of regexes; returns the result of using each successive regex + // to search within the matches of the previous regex. The array of regexes can also contain + // objects with `regex` and `backref` properties, in which case the named or numbered back- + // references specified are passed forward to the next regex or returned. E.g.: + // var xregexpImgFileNames = XRegExp.matchChain(html, [ + // {regex: /]+)>/i, backref: 1}, // tag attributes + // {regex: XRegExp('(?ix) \\s src=" (? [^"]+ )'), backref: "src"}, // src attribute values + // {regex: XRegExp("^http://xregexp\\.com(/[^#?]+)", "i"), backref: 1}, // xregexp.com paths + // /[^\/]+$/ // filenames (strip directory paths) + // ]); + XRegExp.matchChain = function (str, chain) { + return function recurseChain(values, level) { + var item = chain[level].regex ? chain[level] : {regex: chain[level]}, + regex = clone(item.regex, "g"), + matches = [], i; + for (i = 0; i < values.length; i++) { + XRegExp.iterate(values[i], regex, function (match) { + matches.push(item.backref ? (match[item.backref] || "") : match[0]); + }); + } + return ((level === chain.length - 1) || !matches.length) ? + matches : recurseChain(matches, level + 1); + }([str], 0); + }; + + + //--------------------------------- + // New RegExp prototype methods + //--------------------------------- + + // Accepts a context object and arguments array; returns the result of calling `exec` with the + // first value in the arguments array. the context is ignored but is accepted for congruity + // with `Function.prototype.apply` + RegExp.prototype.apply = function (context, args) { + return this.exec(args[0]); + }; + + // Accepts a context object and string; returns the result of calling `exec` with the provided + // string. the context is ignored but is accepted for congruity with `Function.prototype.call` + RegExp.prototype.call = function (context, str) { + return this.exec(str); + }; + + + //--------------------------------- + // Overriden native methods + //--------------------------------- + + // Adds named capture support (with backreferences returned as `result.name`), and fixes two + // cross-browser issues per ES3: + // - Captured values for nonparticipating capturing groups should be returned as `undefined`, + // rather than the empty string. + // - `lastIndex` should not be incremented after zero-length matches. + RegExp.prototype.exec = function (str) { + var match, name, r2, origLastIndex; + if (!this.global) + origLastIndex = this.lastIndex; + match = nativ.exec.apply(this, arguments); + if (match) { + // Fix browsers whose `exec` methods don't consistently return `undefined` for + // nonparticipating capturing groups + if (!compliantExecNpcg && match.length > 1 && indexOf(match, "") > -1) { + r2 = RegExp(this.source, nativ.replace.call(getNativeFlags(this), "g", "")); + // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed + // matching due to characters outside the match + nativ.replace.call((str + "").slice(match.index), r2, function () { + for (var i = 1; i < arguments.length - 2; i++) { + if (arguments[i] === undefined) + match[i] = undefined; + } + }); + } + // Attach named capture properties + if (this._xregexp && this._xregexp.captureNames) { + for (var i = 1; i < match.length; i++) { + name = this._xregexp.captureNames[i - 1]; + if (name) + match[name] = match[i]; + } + } + // Fix browsers that increment `lastIndex` after zero-length matches + if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index)) + this.lastIndex--; + } + if (!this.global) + this.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows) + return match; + }; + + // Fix browser bugs in native method + RegExp.prototype.test = function (str) { + // Use the native `exec` to skip some processing overhead, even though the altered + // `exec` would take care of the `lastIndex` fixes + var match, origLastIndex; + if (!this.global) + origLastIndex = this.lastIndex; + match = nativ.exec.call(this, str); + // Fix browsers that increment `lastIndex` after zero-length matches + if (match && !compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index)) + this.lastIndex--; + if (!this.global) + this.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows) + return !!match; + }; + + // Adds named capture support and fixes browser bugs in native method + String.prototype.match = function (regex) { + if (!XRegExp.isRegExp(regex)) + regex = RegExp(regex); // Native `RegExp` + if (regex.global) { + var result = nativ.match.apply(this, arguments); + regex.lastIndex = 0; // Fix IE bug + return result; + } + return regex.exec(this); // Run the altered `exec` + }; + + // Adds support for `${n}` tokens for named and numbered backreferences in replacement text, + // and provides named backreferences to replacement functions as `arguments[0].name`. Also + // fixes cross-browser differences in replacement text syntax when performing a replacement + // using a nonregex search value, and the value of replacement regexes' `lastIndex` property + // during replacement iterations. Note that this doesn't support SpiderMonkey's proprietary + // third (`flags`) parameter + String.prototype.replace = function (search, replacement) { + var isRegex = XRegExp.isRegExp(search), + captureNames, result, str, origLastIndex; + + // There are too many combinations of search/replacement types/values and browser bugs that + // preclude passing to native `replace`, so don't try + //if (...) + // return nativ.replace.apply(this, arguments); + + if (isRegex) { + if (search._xregexp) + captureNames = search._xregexp.captureNames; // Array or `null` + if (!search.global) + origLastIndex = search.lastIndex; + } else { + search = search + ""; // Type conversion + } + + if (Object.prototype.toString.call(replacement) === "[object Function]") { + result = nativ.replace.call(this + "", search, function () { + if (captureNames) { + // Change the `arguments[0]` string primitive to a String object which can store properties + arguments[0] = new String(arguments[0]); + // Store named backreferences on `arguments[0]` + for (var i = 0; i < captureNames.length; i++) { + if (captureNames[i]) + arguments[0][captureNames[i]] = arguments[i + 1]; + } + } + // Update `lastIndex` before calling `replacement` (fix browsers) + if (isRegex && search.global) + search.lastIndex = arguments[arguments.length - 2] + arguments[0].length; + return replacement.apply(null, arguments); + }); + } else { + str = this + ""; // Type conversion, so `args[args.length - 1]` will be a string (given nonstring `this`) + result = nativ.replace.call(str, search, function () { + var args = arguments; // Keep this function's `arguments` available through closure + return nativ.replace.call(replacement + "", replacementToken, function ($0, $1, $2) { + // Numbered backreference (without delimiters) or special variable + if ($1) { + switch ($1) { + case "$": + return "$"; + case "&": + return args[0]; + case "`": + return args[args.length - 1].slice(0, args[args.length - 2]); + case "'": + return args[args.length - 1].slice(args[args.length - 2] + args[0].length); + // Numbered backreference + default: + // What does "$10" mean? + // - Backreference 10, if 10 or more capturing groups exist + // - Backreference 1 followed by "0", if 1-9 capturing groups exist + // - Otherwise, it's the string "$10" + // Also note: + // - Backreferences cannot be more than two digits (enforced by `replacementToken`) + // - "$01" is equivalent to "$1" if a capturing group exists, otherwise it's the string "$01" + // - There is no "$0" token ("$&" is the entire match) + var literalNumbers = ""; + $1 = +$1; // Type conversion; drop leading zero + if (!$1) // `$1` was "0" or "00" + return $0; + while ($1 > args.length - 3) { + literalNumbers = String.prototype.slice.call($1, -1) + literalNumbers; + $1 = Math.floor($1 / 10); // Drop the last digit + } + return ($1 ? args[$1] || "" : "$") + literalNumbers; + } + // Named backreference or delimited numbered backreference + } else { + // What does "${n}" mean? + // - Backreference to numbered capture n. Two differences from "$n": + // - n can be more than two digits + // - Backreference 0 is allowed, and is the entire match + // - Backreference to named capture n, if it exists and is not a number overridden by numbered capture + // - Otherwise, it's the string "${n}" + var n = +$2; // Type conversion; drop leading zeros + if (n <= args.length - 3) + return args[n]; + n = captureNames ? indexOf(captureNames, $2) : -1; + return n > -1 ? args[n + 1] : $0; + } + }); + }); + } + + if (isRegex) { + if (search.global) + search.lastIndex = 0; // Fix IE, Safari bug (last tested IE 9.0.5, Safari 5.1.2 on Windows) + else + search.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows) + } + + return result; + }; + + // A consistent cross-browser, ES3 compliant `split` + String.prototype.split = function (s /* separator */, limit) { + // If separator `s` is not a regex, use the native `split` + if (!XRegExp.isRegExp(s)) + return nativ.split.apply(this, arguments); + + var str = this + "", // Type conversion + output = [], + lastLastIndex = 0, + match, lastLength; + + // Behavior for `limit`: if it's... + // - `undefined`: No limit + // - `NaN` or zero: Return an empty array + // - A positive number: Use `Math.floor(limit)` + // - A negative number: No limit + // - Other: Type-convert, then use the above rules + if (limit === undefined || +limit < 0) { + limit = Infinity; + } else { + limit = Math.floor(+limit); + if (!limit) + return []; + } + + // This is required if not `s.global`, and it avoids needing to set `s.lastIndex` to zero + // and restore it to its original value when we're done using the regex + s = XRegExp.copyAsGlobal(s); + + while (match = s.exec(str)) { // Run the altered `exec` (required for `lastIndex` fix, etc.) + if (s.lastIndex > lastLastIndex) { + output.push(str.slice(lastLastIndex, match.index)); + + if (match.length > 1 && match.index < str.length) + Array.prototype.push.apply(output, match.slice(1)); + + lastLength = match[0].length; + lastLastIndex = s.lastIndex; + + if (output.length >= limit) + break; + } + + if (s.lastIndex === match.index) + s.lastIndex++; + } + + if (lastLastIndex === str.length) { + if (!nativ.test.call(s, "") || lastLength) + output.push(""); + } else { + output.push(str.slice(lastLastIndex)); + } + + return output.length > limit ? output.slice(0, limit) : output; + }; + + + //--------------------------------- + // Private helper functions + //--------------------------------- + + // Supporting function for `XRegExp`, `XRegExp.copyAsGlobal`, etc. Returns a copy of a `RegExp` + // instance with a fresh `lastIndex` (set to zero), preserving properties required for named + // capture. Also allows adding new flags in the process of copying the regex + function clone(regex, additionalFlags) { + if (!XRegExp.isRegExp(regex)) + throw TypeError("type RegExp expected"); + var x = regex._xregexp; + regex = XRegExp(regex.source, getNativeFlags(regex) + (additionalFlags || "")); + if (x) { + regex._xregexp = { + source: x.source, + captureNames: x.captureNames ? x.captureNames.slice(0) : null + }; + } + return regex; + } + + function getNativeFlags(regex) { + return (regex.global ? "g" : "") + + (regex.ignoreCase ? "i" : "") + + (regex.multiline ? "m" : "") + + (regex.extended ? "x" : "") + // Proposed for ES4; included in AS3 + (regex.sticky ? "y" : ""); + } + + function runTokens(pattern, index, scope, context) { + var i = tokens.length, + result, match, t; + // Protect against constructing XRegExps within token handler and trigger functions + isInsideConstructor = true; + // Must reset `isInsideConstructor`, even if a `trigger` or `handler` throws + try { + while (i--) { // Run in reverse order + t = tokens[i]; + if ((scope & t.scope) && (!t.trigger || t.trigger.call(context))) { + t.pattern.lastIndex = index; + match = t.pattern.exec(pattern); // Running the altered `exec` here allows use of named backreferences, etc. + if (match && match.index === index) { + result = { + output: t.handler.call(context, match, scope), + match: match + }; + break; + } + } + } + } catch (err) { + throw err; + } finally { + isInsideConstructor = false; + } + return result; + } + + function indexOf(array, item, from) { + if (Array.prototype.indexOf) // Use the native array method if available + return array.indexOf(item, from); + for (var i = from || 0; i < array.length; i++) { + if (array[i] === item) + return i; + } + return -1; + } + + + //--------------------------------- + // Built-in tokens + //--------------------------------- + + // Augment XRegExp's regular expression syntax and flags. Note that when adding tokens, the + // third (`scope`) argument defaults to `XRegExp.OUTSIDE_CLASS` + + // Comment pattern: (?# ) + XRegExp.addToken( + /\(\?#[^)]*\)/, + function (match) { + // Keep tokens separated unless the following token is a quantifier + return nativ.test.call(quantifier, match.input.slice(match.index + match[0].length)) ? "" : "(?:)"; + } + ); + + // Capturing group (match the opening parenthesis only). + // Required for support of named capturing groups + XRegExp.addToken( + /\((?!\?)/, + function () { + this.captureNames.push(null); + return "("; + } + ); + + // Named capturing group (match the opening delimiter only): (? + XRegExp.addToken( + /\(\?<([$\w]+)>/, + function (match) { + this.captureNames.push(match[1]); + this.hasNamedCapture = true; + return "("; + } + ); + + // Named backreference: \k + XRegExp.addToken( + /\\k<([\w$]+)>/, + function (match) { + var index = indexOf(this.captureNames, match[1]); + // Keep backreferences separate from subsequent literal numbers. Preserve back- + // references to named groups that are undefined at this point as literal strings + return index > -1 ? + "\\" + (index + 1) + (isNaN(match.input.charAt(match.index + match[0].length)) ? "" : "(?:)") : + match[0]; + } + ); + + // Empty character class: [] or [^] + XRegExp.addToken( + /\[\^?]/, + function (match) { + // For cross-browser compatibility with ES3, convert [] to \b\B and [^] to [\s\S]. + // (?!) should work like \b\B, but is unreliable in Firefox + return match[0] === "[]" ? "\\b\\B" : "[\\s\\S]"; + } + ); + + // Mode modifier at the start of the pattern only, with any combination of flags imsx: (?imsx) + // Does not support x(?i), (?-i), (?i-m), (?i: ), (?i)(?m), etc. + XRegExp.addToken( + /^\(\?([imsx]+)\)/, + function (match) { + this.setFlag(match[1]); + return ""; + } + ); + + // Whitespace and comments, in free-spacing (aka extended) mode only + XRegExp.addToken( + /(?:\s+|#.*)+/, + function (match) { + // Keep tokens separated unless the following token is a quantifier + return nativ.test.call(quantifier, match.input.slice(match.index + match[0].length)) ? "" : "(?:)"; + }, + XRegExp.OUTSIDE_CLASS, + function () { + return this.hasFlag("x"); + } + ); + + // Dot, in dotall (aka singleline) mode only + XRegExp.addToken( + /\./, + function () { + return "[\\s\\S]"; + }, + XRegExp.OUTSIDE_CLASS, + function () { + return this.hasFlag("s"); + } + ); + + + //--------------------------------- + // Backward compatibility + //--------------------------------- + + // Uncomment the following block for compatibility with XRegExp 1.0-1.2: + /* + XRegExp.matchWithinChain = XRegExp.matchChain; + RegExp.prototype.addFlags = function (s) {return clone(this, s);}; + RegExp.prototype.execAll = function (s) {var r = []; XRegExp.iterate(s, this, function (m) {r.push(m);}); return r;}; + RegExp.prototype.forEachExec = function (s, f, c) {return XRegExp.iterate(s, this, f, c);}; + RegExp.prototype.validate = function (s) {var r = RegExp("^(?:" + this.source + ")$(?!\\s)", getNativeFlags(this)); if (this.global) this.lastIndex = 0; return s.search(r) === 0;}; + */ + +})(); + +// +// Begin anonymous function. This is used to contain local scope variables without polutting global scope. +// +if (typeof(SyntaxHighlighter) == 'undefined') var SyntaxHighlighter = function () { + +// CommonJS + if (typeof(require) != 'undefined' && typeof(XRegExp) == 'undefined') { + XRegExp = require('XRegExp').XRegExp; + } + +// Shortcut object which will be assigned to the SyntaxHighlighter variable. +// This is a shorthand for local reference in order to avoid long namespace +// references to SyntaxHighlighter.whatever... + var sh = { + defaults: { + /** Additional CSS class names to be added to highlighter elements. */ + 'class-name': '', + + /** First line number. */ + 'first-line': 1, + + /** + * Pads line numbers. Possible values are: + * + * false - don't pad line numbers. + * true - automaticaly pad numbers with minimum required number of leading zeroes. + * [int] - length up to which pad line numbers. + */ + 'pad-line-numbers': false, + + /** Lines to highlight. */ + 'highlight': false, + + /** Title to be displayed above the code block. */ + 'title': null, + + /** Enables or disables smart tabs. */ + 'smart-tabs': true, + + /** Gets or sets tab size. */ + 'tab-size': 4, + + /** Enables or disables gutter. */ + 'gutter': true, + + /** Enables or disables toolbar. */ + 'toolbar': true, + + /** Enables quick code copy and paste from double click. */ + 'quick-code': true, + + /** Forces code view to be collapsed. */ + 'collapse': false, + + /** Enables or disables automatic links. */ + 'auto-links': false, + + /** Gets or sets light mode. Equavalent to turning off gutter and toolbar. */ + 'light': false, + + 'unindent': true, + + 'html-script': false + }, + + config: { + space: ' ', + + /** Enables use of + * + * ``` + */ + findParent: function (node, filterFn, includeSelf) { + if (node && !domUtils.isBody(node)) { + node = includeSelf ? node : node.parentNode; + while (node) { + if (!filterFn || filterFn(node) || domUtils.isBody(node)) { + return filterFn && !filterFn(node) && domUtils.isBody(node) ? null : node; + } + node = node.parentNode; + } + } + return null; + }, + /** + * 查找node的节点名为tagName的第一个祖先节点, 查找的起点是node节点的父节点。 + * @method findParentByTagName + * @param { Node } node 需要查找的节点对象 + * @param { Array } tagNames 需要查找的父节点的名称数组 + * @warning 查找的终点是到body节点为止 + * @return { Node | NULL } 如果找到符合条件的节点, 则返回该节点, 否则返回NULL + * @example + * ```javascript + * var node = UE.dom.domUtils.findParentByTagName( document.getElementsByTagName("div")[0], [ "BODY" ] ); + * //output: BODY + * console.log( node.tagName ); + * ``` + */ + + /** + * 查找node的节点名为tagName的祖先节点, 如果includeSelf的值为true,则查找的起点是给定的节点node, + * 否则, 起点是node的父节点。 + * @method findParentByTagName + * @param { Node } node 需要查找的节点对象 + * @param { Array } tagNames 需要查找的父节点的名称数组 + * @param { Boolean } includeSelf 查找过程是否包含node节点自身 + * @warning 查找的终点是到body节点为止 + * @return { Node | NULL } 如果找到符合条件的节点, 则返回该节点, 否则返回NULL + * @example + * ```javascript + * var queryTarget = document.getElementsByTagName("div")[0]; + * var node = UE.dom.domUtils.findParentByTagName( queryTarget, [ "DIV" ], true ); + * //output: true + * console.log( queryTarget === node ); + * ``` + */ + findParentByTagName: function (node, tagNames, includeSelf, excludeFn) { + tagNames = utils.listToMap(utils.isArray(tagNames) ? tagNames : [tagNames]); + return domUtils.findParent(node, function (node) { + return tagNames[node.tagName] && !(excludeFn && excludeFn(node)); + }, includeSelf); + }, + /** + * 查找节点node的祖先节点集合, 查找的起点是给定节点的父节点,结果集中不包含给定的节点。 + * @method findParents + * @param { Node } node 需要查找的节点对象 + * @return { Array } 给定节点的祖先节点数组 + * @grammar UE.dom.domUtils.findParents(node) => Array //返回一个祖先节点数组集合,不包含自身 + * @grammar UE.dom.domUtils.findParents(node,includeSelf) => Array //返回一个祖先节点数组集合,includeSelf指定是否包含自身 + * @grammar UE.dom.domUtils.findParents(node,includeSelf,filterFn) => Array //返回一个祖先节点数组集合,filterFn指定过滤条件,返回true的node将被选取 + * @grammar UE.dom.domUtils.findParents(node,includeSelf,filterFn,closerFirst) => Array //返回一个祖先节点数组集合,closerFirst为true的话,node的直接父亲节点是数组的第0个 + */ + + /** + * 查找节点node的祖先节点集合, 如果includeSelf的值为true, + * 则返回的结果集中允许出现当前给定的节点, 否则, 该节点不会出现在其结果集中。 + * @method findParents + * @param { Node } node 需要查找的节点对象 + * @param { Boolean } includeSelf 查找的结果中是否允许包含当前查找的节点对象 + * @return { Array } 给定节点的祖先节点数组 + */ + findParents: function (node, includeSelf, filterFn, closerFirst) { + var parents = includeSelf && (filterFn && filterFn(node) || !filterFn) ? [node] : []; + while (node = domUtils.findParent(node, filterFn)) { + parents.push(node); + } + return closerFirst ? parents : parents.reverse(); + }, + + /** + * 在节点node后面插入新节点newNode + * @method insertAfter + * @param { Node } node 目标节点 + * @param { Node } newNode 新插入的节点, 该节点将置于目标节点之后 + * @return { Node } 新插入的节点 + */ + insertAfter: function (node, newNode) { + return node.nextSibling ? node.parentNode.insertBefore(newNode, node.nextSibling) : + node.parentNode.appendChild(newNode); + }, + + /** + * 删除节点node及其下属的所有节点 + * @method remove + * @param { Node } node 需要删除的节点对象 + * @return { Node } 返回刚删除的节点对象 + * @example + * ```html + *
      + *
      你好
      + *
      + * + * ``` + */ + + /** + * 删除节点node,并根据keepChildren的值决定是否保留子节点 + * @method remove + * @param { Node } node 需要删除的节点对象 + * @param { Boolean } keepChildren 是否需要保留子节点 + * @return { Node } 返回刚删除的节点对象 + * @example + * ```html + *
      + *
      你好
      + *
      + * + * ``` + */ + remove: function (node, keepChildren) { + var parent = node.parentNode, + child; + if (parent) { + if (keepChildren && node.hasChildNodes()) { + while (child = node.firstChild) { + parent.insertBefore(child, node); + } + } + parent.removeChild(node); + } + return node; + }, + + /** + * 取得node节点的下一个兄弟节点, 如果该节点其后没有兄弟节点, 则递归查找其父节点之后的第一个兄弟节点, + * 直到找到满足条件的节点或者递归到BODY节点之后才会结束。 + * @method getNextDomNode + * @param { Node } node 需要获取其后的兄弟节点的节点对象 + * @return { Node | NULL } 如果找满足条件的节点, 则返回该节点, 否则返回NULL + * @example + * ```html + * + *
      + * + *
      + * xxx + * + * + * ``` + * @example + * ```html + * + *
      + * + * xxx + *
      + * xxx + * + * + * ``` + */ + + /** + * 取得node节点的下一个兄弟节点, 如果startFromChild的值为ture,则先获取其子节点, + * 如果有子节点则直接返回第一个子节点;如果没有子节点或者startFromChild的值为false, + * 则执行getNextDomNode(Node node)的查找过程。 + * @method getNextDomNode + * @param { Node } node 需要获取其后的兄弟节点的节点对象 + * @param { Boolean } startFromChild 查找过程是否从其子节点开始 + * @return { Node | NULL } 如果找满足条件的节点, 则返回该节点, 否则返回NULL + * @see UE.dom.domUtils.getNextDomNode(Node) + */ + getNextDomNode: function (node, startFromChild, filterFn, guard) { + return getDomNode(node, 'firstChild', 'nextSibling', startFromChild, filterFn, guard); + }, + getPreDomNode: function (node, startFromChild, filterFn, guard) { + return getDomNode(node, 'lastChild', 'previousSibling', startFromChild, filterFn, guard); + }, + /** + * 检测节点node是否属是UEditor定义的bookmark节点 + * @method isBookmarkNode + * @private + * @param { Node } node 需要检测的节点对象 + * @return { Boolean } 是否是bookmark节点 + * @example + * ```html + * + * + * ``` + */ + isBookmarkNode: function (node) { + return node.nodeType == 1 && node.id && /^_baidu_bookmark_/i.test(node.id); + }, + /** + * 获取节点node所属的window对象 + * @method getWindow + * @param { Node } node 节点对象 + * @return { Window } 当前节点所属的window对象 + * @example + * ```javascript + * //output: true + * console.log( UE.dom.domUtils.getWindow( document.body ) === window ); + * ``` + */ + getWindow: function (node) { + var doc = node.ownerDocument || node; + return doc.defaultView || doc.parentWindow; + }, + /** + * 获取离nodeA与nodeB最近的公共的祖先节点 + * @method getCommonAncestor + * @param { Node } nodeA 第一个节点 + * @param { Node } nodeB 第二个节点 + * @remind 如果给定的两个节点是同一个节点, 将直接返回该节点。 + * @return { Node | NULL } 如果未找到公共节点, 返回NULL, 否则返回最近的公共祖先节点。 + * @example + * ```javascript + * var commonAncestor = UE.dom.domUtils.getCommonAncestor( document.body, document.body.firstChild ); + * //output: true + * console.log( commonAncestor.tagName.toLowerCase() === 'body' ); + * ``` + */ + getCommonAncestor: function (nodeA, nodeB) { + if (nodeA === nodeB) + return nodeA; + var parentsA = [nodeA], parentsB = [nodeB], parent = nodeA, i = -1; + while (parent = parent.parentNode) { + if (parent === nodeB) { + return parent; + } + parentsA.push(parent); + } + parent = nodeB; + while (parent = parent.parentNode) { + if (parent === nodeA) + return parent; + parentsB.push(parent); + } + parentsA.reverse(); + parentsB.reverse(); + while (i++, parentsA[i] === parentsB[i]) { + } + return i == 0 ? null : parentsA[i - 1]; + + }, + /** + * 清除node节点左右连续为空的兄弟inline节点 + * @method clearEmptySibling + * @param { Node } node 执行的节点对象, 如果该节点的左右连续的兄弟节点是空的inline节点, + * 则这些兄弟节点将被删除 + * @grammar UE.dom.domUtils.clearEmptySibling(node,ignoreNext) //ignoreNext指定是否忽略右边空节点 + * @grammar UE.dom.domUtils.clearEmptySibling(node,ignoreNext,ignorePre) //ignorePre指定是否忽略左边空节点 + * @example + * ```html + * + *
      + * + * + * + * xxx + * + * + * + * ``` + */ + + /** + * 清除node节点左右连续为空的兄弟inline节点, 如果ignoreNext的值为true, + * 则忽略对右边兄弟节点的操作。 + * @method clearEmptySibling + * @param { Node } node 执行的节点对象, 如果该节点的左右连续的兄弟节点是空的inline节点, + * @param { Boolean } ignoreNext 是否忽略忽略对右边的兄弟节点的操作 + * 则这些兄弟节点将被删除 + * @see UE.dom.domUtils.clearEmptySibling(Node) + */ + + /** + * 清除node节点左右连续为空的兄弟inline节点, 如果ignoreNext的值为true, + * 则忽略对右边兄弟节点的操作, 如果ignorePre的值为true,则忽略对左边兄弟节点的操作。 + * @method clearEmptySibling + * @param { Node } node 执行的节点对象, 如果该节点的左右连续的兄弟节点是空的inline节点, + * @param { Boolean } ignoreNext 是否忽略忽略对右边的兄弟节点的操作 + * @param { Boolean } ignorePre 是否忽略忽略对左边的兄弟节点的操作 + * 则这些兄弟节点将被删除 + * @see UE.dom.domUtils.clearEmptySibling(Node) + */ + clearEmptySibling: function (node, ignoreNext, ignorePre) { + function clear(next, dir) { + var tmpNode; + while (next && !domUtils.isBookmarkNode(next) && (domUtils.isEmptyInlineElement(next) + //这里不能把空格算进来会吧空格干掉,出现文字间的空格丢掉了 + || !new RegExp('[^\t\n\r' + domUtils.fillChar + ']').test(next.nodeValue))) { + tmpNode = next[dir]; + domUtils.remove(next); + next = tmpNode; + } + } + + !ignoreNext && clear(node.nextSibling, 'nextSibling'); + !ignorePre && clear(node.previousSibling, 'previousSibling'); + }, + /** + * 将一个文本节点textNode拆分成两个文本节点,offset指定拆分位置 + * @method split + * @param { Node } textNode 需要拆分的文本节点对象 + * @param { int } offset 需要拆分的位置, 位置计算从0开始 + * @return { Node } 拆分后形成的新节点 + * @example + * ```html + *
      abcdef
      + * + * ``` + */ + split: function (node, offset) { + var doc = node.ownerDocument; + if (browser.ie && offset == node.nodeValue.length) { + var next = doc.createTextNode(''); + return domUtils.insertAfter(node, next); + } + var retval = node.splitText(offset); + //ie8下splitText不会跟新childNodes,我们手动触发他的更新 + if (browser.ie8) { + var tmpNode = doc.createTextNode(''); + domUtils.insertAfter(retval, tmpNode); + domUtils.remove(tmpNode); + } + return retval; + }, + + /** + * 检测文本节点textNode是否为空节点(包括空格、换行、占位符等字符) + * @method isWhitespace + * @param { Node } node 需要检测的节点对象 + * @return { Boolean } 检测的节点是否为空 + * @example + * ```html + *
      + * + *
      + * + * ``` + */ + isWhitespace: function (node) { + return !new RegExp('[^ \t\n\r' + domUtils.fillChar + ']').test(node.nodeValue); + }, + /** + * 获取元素element相对于viewport的位置坐标 + * @method getXY + * @param { Node } element 需要计算位置的节点对象 + * @return { Object } 返回形如{x:left,y:top}的一个key-value映射对象, 其中键x代表水平偏移距离, + * y代表垂直偏移距离。 + * + * @example + * ```javascript + * var location = UE.dom.domUtils.getXY( document.getElementById("test") ); + * //output: test的坐标为: 12, 24 + * console.log( 'test的坐标为: ', location.x, ',', location.y ); + * ``` + */ + getXY: function (element) { + var x = 0, y = 0; + while (element.offsetParent) { + y += element.offsetTop; + x += element.offsetLeft; + element = element.offsetParent; + } + return {'x': x, 'y': y}; + }, + /** + * 为元素element绑定原生DOM事件,type为事件类型,handler为处理函数 + * @method on + * @param { Node } element 需要绑定事件的节点对象 + * @param { String } type 绑定的事件类型 + * @param { Function } handler 事件处理器 + * @example + * ```javascript + * UE.dom.domUtils.on(document.body,"click",function(e){ + * //e为事件对象,this为被点击元素对戏那个 + * }); + * ``` + */ + + /** + * 为元素element绑定原生DOM事件,type为事件类型,handler为处理函数 + * @method on + * @param { Node } element 需要绑定事件的节点对象 + * @param { Array } type 绑定的事件类型数组 + * @param { Function } handler 事件处理器 + * @example + * ```javascript + * UE.dom.domUtils.on(document.body,["click","mousedown"],function(evt){ + * //evt为事件对象,this为被点击元素对象 + * }); + * ``` + */ + on: function (element, type, handler) { + + var types = utils.isArray(type) ? type : utils.trim(type).split(/\s+/), + k = types.length; + if (k) while (k--) { + type = types[k]; + if (element.addEventListener) { + element.addEventListener(type, handler, false); + } else { + if (!handler._d) { + handler._d = { + els: [] + }; + } + var key = type + handler.toString(), index = utils.indexOf(handler._d.els, element); + if (!handler._d[key] || index == -1) { + if (index == -1) { + handler._d.els.push(element); + } + if (!handler._d[key]) { + handler._d[key] = function (evt) { + return handler.call(evt.srcElement, evt || window.event); + }; + } + + + element.attachEvent('on' + type, handler._d[key]); + } + } + } + element = null; + }, + /** + * 解除DOM事件绑定 + * @method un + * @param { Node } element 需要解除事件绑定的节点对象 + * @param { String } type 需要接触绑定的事件类型 + * @param { Function } handler 对应的事件处理器 + * @example + * ```javascript + * UE.dom.domUtils.un(document.body,"click",function(evt){ + * //evt为事件对象,this为被点击元素对象 + * }); + * ``` + */ + + /** + * 解除DOM事件绑定 + * @method un + * @param { Node } element 需要解除事件绑定的节点对象 + * @param { Array } type 需要接触绑定的事件类型数组 + * @param { Function } handler 对应的事件处理器 + * @example + * ```javascript + * UE.dom.domUtils.un(document.body, ["click","mousedown"],function(evt){ + * //evt为事件对象,this为被点击元素对象 + * }); + * ``` + */ + un: function (element, type, handler) { + var types = utils.isArray(type) ? type : utils.trim(type).split(/\s+/), + k = types.length; + if (k) while (k--) { + type = types[k]; + if (element.removeEventListener) { + element.removeEventListener(type, handler, false); + } else { + var key = type + handler.toString(); + try { + element.detachEvent('on' + type, handler._d ? handler._d[key] : handler); + } catch (e) { + } + if (handler._d && handler._d[key]) { + var index = utils.indexOf(handler._d.els, element); + if (index != -1) { + handler._d.els.splice(index, 1); + } + handler._d.els.length == 0 && delete handler._d[key]; + } + } + } + }, + + /** + * 比较节点nodeA与节点nodeB是否具有相同的标签名、属性名以及属性值 + * @method isSameElement + * @param { Node } nodeA 需要比较的节点 + * @param { Node } nodeB 需要比较的节点 + * @return { Boolean } 两个节点是否具有相同的标签名、属性名以及属性值 + * @example + * ```html + * ssss + * bbbbb + * ssss + * bbbbb + * + * + * ``` + */ + isSameElement: function (nodeA, nodeB) { + if (nodeA.tagName != nodeB.tagName) { + return false; + } + var thisAttrs = nodeA.attributes, + otherAttrs = nodeB.attributes; + if (!ie && thisAttrs.length != otherAttrs.length) { + return false; + } + var attrA, attrB, al = 0, bl = 0; + for (var i = 0; attrA = thisAttrs[i++];) { + if (attrA.nodeName == 'style') { + if (attrA.specified) { + al++; + } + if (domUtils.isSameStyle(nodeA, nodeB)) { + continue; + } else { + return false; + } + } + if (ie) { + if (attrA.specified) { + al++; + attrB = otherAttrs.getNamedItem(attrA.nodeName); + } else { + continue; + } + } else { + attrB = nodeB.attributes[attrA.nodeName]; + } + if (!attrB.specified || attrA.nodeValue != attrB.nodeValue) { + return false; + } + } + // 有可能attrB的属性包含了attrA的属性之外还有自己的属性 + if (ie) { + for (i = 0; attrB = otherAttrs[i++];) { + if (attrB.specified) { + bl++; + } + } + if (al != bl) { + return false; + } + } + return true; + }, + + /** + * 判断节点nodeA与节点nodeB的元素的style属性是否一致 + * @method isSameStyle + * @param { Node } nodeA 需要比较的节点 + * @param { Node } nodeB 需要比较的节点 + * @return { Boolean } 两个节点是否具有相同的style属性值 + * @example + * ```html + * ssss + * bbbbb + * ssss + * bbbbb + * + * + * ``` + */ + isSameStyle: function (nodeA, nodeB) { + var styleA = nodeA.style.cssText.replace(/( ?; ?)/g, ';').replace(/( ?: ?)/g, ':'), + styleB = nodeB.style.cssText.replace(/( ?; ?)/g, ';').replace(/( ?: ?)/g, ':'); + if (browser.opera) { + styleA = nodeA.style; + styleB = nodeB.style; + if (styleA.length != styleB.length) + return false; + for (var p in styleA) { + if (/^(\d+|csstext)$/i.test(p)) { + continue; + } + if (styleA[p] != styleB[p]) { + return false; + } + } + return true; + } + if (!styleA || !styleB) { + return styleA == styleB; + } + styleA = styleA.split(';'); + styleB = styleB.split(';'); + if (styleA.length != styleB.length) { + return false; + } + for (var i = 0, ci; ci = styleA[i++];) { + if (utils.indexOf(styleB, ci) == -1) { + return false; + } + } + return true; + }, + /** + * 检查节点node是否为block元素 + * @method isBlockElm + * @param { Node } node 需要检测的节点对象 + * @return { Boolean } 是否是block元素节点 + * @warning 该方法的判断规则如下: 如果该元素原本是block元素, 则不论该元素当前的css样式是什么都会返回true; + * 否则,检测该元素的css样式, 如果该元素当前是block元素, 则返回true。 其余情况下都返回false。 + * @example + * ```html + * + * + *
      + * + * + * ``` + */ + isBlockElm: function (node) { + return node.nodeType == 1 && (dtd.$block[node.tagName] || styleBlock[domUtils.getComputedStyle(node, 'display')]) && !dtd.$nonChild[node.tagName]; + }, + /** + * 检测node节点是否为body节点 + * @method isBody + * @param { Element } node 需要检测的dom元素 + * @return { Boolean } 给定的元素是否是body元素 + * @example + * ```javascript + * //output: true + * console.log( UE.dom.domUtils.isBody( document.body ) ); + * ``` + */ + isBody: function (node) { + return node && node.nodeType == 1 && node.tagName.toLowerCase() == 'body'; + }, + /** + * 以node节点为分界,将该节点的指定祖先节点parent拆分成两个独立的节点, + * 拆分形成的两个节点之间是node节点 + * @method breakParent + * @param { Node } node 作为分界的节点对象 + * @param { Node } parent 该节点必须是node节点的祖先节点, 且是block节点。 + * @return { Node } 给定的node分界节点 + * @example + * ```javascript + * + * var node = document.createElement("span"), + * wrapNode = document.createElement( "div" ), + * parent = document.createElement("p"); + * + * parent.appendChild( node ); + * wrapNode.appendChild( parent ); + * + * //拆分前 + * //output:

      + * console.log( wrapNode.innerHTML ); + * + * + * UE.dom.domUtils.breakParent( node, parent ); + * //拆分后 + * //output:

      + * console.log( wrapNode.innerHTML ); + * + * ``` + */ + breakParent: function (node, parent) { + var tmpNode, + parentClone = node, + clone = node, + leftNodes, + rightNodes; + do { + parentClone = parentClone.parentNode; + if (leftNodes) { + tmpNode = parentClone.cloneNode(false); + tmpNode.appendChild(leftNodes); + leftNodes = tmpNode; + tmpNode = parentClone.cloneNode(false); + tmpNode.appendChild(rightNodes); + rightNodes = tmpNode; + } else { + leftNodes = parentClone.cloneNode(false); + rightNodes = leftNodes.cloneNode(false); + } + while (tmpNode = clone.previousSibling) { + leftNodes.insertBefore(tmpNode, leftNodes.firstChild); + } + while (tmpNode = clone.nextSibling) { + rightNodes.appendChild(tmpNode); + } + clone = parentClone; + } while (parent !== parentClone); + tmpNode = parent.parentNode; + tmpNode.insertBefore(leftNodes, parent); + tmpNode.insertBefore(rightNodes, parent); + tmpNode.insertBefore(node, rightNodes); + domUtils.remove(parent); + return node; + }, + /** + * 检查节点node是否是空inline节点 + * @method isEmptyInlineElement + * @param { Node } node 需要检测的节点对象 + * @return { Number } 如果给定的节点是空的inline节点, 则返回1, 否则返回0。 + * @example + * ```html + * => 1 + * => 1 + * => 1 + * xx => 0 + * ``` + */ + isEmptyInlineElement: function (node) { + if (node.nodeType != 1 || !dtd.$removeEmpty[node.tagName]) { + return 0; + } + node = node.firstChild; + while (node) { + //如果是创建的bookmark就跳过 + if (domUtils.isBookmarkNode(node)) { + return 0; + } + if (node.nodeType == 1 && !domUtils.isEmptyInlineElement(node) || + node.nodeType == 3 && !domUtils.isWhitespace(node) + ) { + return 0; + } + node = node.nextSibling; + } + return 1; + + }, + + /** + * 删除node节点下首尾两端的空白文本子节点 + * @method trimWhiteTextNode + * @param { Element } node 需要执行删除操作的元素对象 + * @example + * ```javascript + * var node = document.createElement("div"); + * + * node.appendChild( document.createTextNode( "" ) ); + * + * node.appendChild( document.createElement("div") ); + * + * node.appendChild( document.createTextNode( "" ) ); + * + * //3 + * console.log( node.childNodes.length ); + * + * UE.dom.domUtils.trimWhiteTextNode( node ); + * + * //1 + * console.log( node.childNodes.length ); + * ``` + */ + trimWhiteTextNode: function (node) { + function remove(dir) { + var child; + while ((child = node[dir]) && child.nodeType == 3 && domUtils.isWhitespace(child)) { + node.removeChild(child); + } + } + + remove('firstChild'); + remove('lastChild'); + }, + + /** + * 合并node节点下相同的子节点 + * @name mergeChild + * @desc + * UE.dom.domUtils.mergeChild(node,tagName) //tagName要合并的子节点的标签 + * @example + *

      xxaaxx

      + * ==> UE.dom.domUtils.mergeChild(node,'span') + *

      xxaaxx

      + */ + mergeChild: function (node, tagName, attrs) { + var list = domUtils.getElementsByTagName(node, node.tagName.toLowerCase()); + for (var i = 0, ci; ci = list[i++];) { + if (!ci.parentNode || domUtils.isBookmarkNode(ci)) { + continue; + } + //span单独处理 + if (ci.tagName.toLowerCase() == 'span') { + if (node === ci.parentNode) { + domUtils.trimWhiteTextNode(node); + if (node.childNodes.length == 1) { + node.style.cssText = ci.style.cssText + ";" + node.style.cssText; + domUtils.remove(ci, true); + continue; + } + } + ci.style.cssText = node.style.cssText + ';' + ci.style.cssText; + if (attrs) { + var style = attrs.style; + if (style) { + style = style.split(';'); + for (var j = 0, s; s = style[j++];) { + ci.style[utils.cssStyleToDomStyle(s.split(':')[0])] = s.split(':')[1]; + } + } + } + if (domUtils.isSameStyle(ci, node)) { + domUtils.remove(ci, true); + } + continue; + } + if (domUtils.isSameElement(node, ci)) { + domUtils.remove(ci, true); + } + } + }, + + /** + * 原生方法getElementsByTagName的封装 + * @method getElementsByTagName + * @param { Node } node 目标节点对象 + * @param { String } tagName 需要查找的节点的tagName, 多个tagName以空格分割 + * @return { Array } 符合条件的节点集合 + */ + getElementsByTagName: function (node, name, filter) { + if (filter && utils.isString(filter)) { + var className = filter; + filter = function (node) { + return domUtils.hasClass(node, className) + } + } + name = utils.trim(name).replace(/[ ]{2,}/g, ' ').split(' '); + var arr = []; + for (var n = 0, ni; ni = name[n++];) { + var list = node.getElementsByTagName(ni); + for (var i = 0, ci; ci = list[i++];) { + if (!filter || filter(ci)) + arr.push(ci); + } + } + + return arr; + }, + /** + * 将节点node提取到父节点上 + * @method mergeToParent + * @param { Element } node 需要提取的元素对象 + * @example + * ```html + *
      + *
      + * + *
      + *
      + * + * + * ``` + */ + mergeToParent: function (node) { + var parent = node.parentNode; + while (parent && dtd.$removeEmpty[parent.tagName]) { + if (parent.tagName == node.tagName || parent.tagName == 'A') {//针对a标签单独处理 + domUtils.trimWhiteTextNode(parent); + //span需要特殊处理 不处理这样的情况 xxxxxxxxx + if (parent.tagName == 'SPAN' && !domUtils.isSameStyle(parent, node) + || (parent.tagName == 'A' && node.tagName == 'SPAN')) { + if (parent.childNodes.length > 1 || parent !== node.parentNode) { + node.style.cssText = parent.style.cssText + ";" + node.style.cssText; + parent = parent.parentNode; + continue; + } else { + parent.style.cssText += ";" + node.style.cssText; + //trace:952 a标签要保持下划线 + if (parent.tagName == 'A') { + parent.style.textDecoration = 'underline'; + } + } + } + if (parent.tagName != 'A') { + parent === node.parentNode && domUtils.remove(node, true); + break; + } + } + parent = parent.parentNode; + } + }, + /** + * 合并节点node的左右兄弟节点 + * @method mergeSibling + * @param { Element } node 需要合并的目标节点 + * @example + * ```html + * xxxxoooxxxx + * + * + * ``` + */ + + /** + * 合并节点node的左右兄弟节点, 可以根据给定的条件选择是否忽略合并左节点。 + * @method mergeSibling + * @param { Element } node 需要合并的目标节点 + * @param { Boolean } ignorePre 是否忽略合并左节点 + * @example + * ```html + * xxxxoooxxxx + * + * + * ``` + */ + + /** + * 合并节点node的左右兄弟节点,可以根据给定的条件选择是否忽略合并左右节点。 + * @method mergeSibling + * @param { Element } node 需要合并的目标节点 + * @param { Boolean } ignorePre 是否忽略合并左节点 + * @param { Boolean } ignoreNext 是否忽略合并右节点 + * @remind 如果同时忽略左右节点, 则该操作什么也不会做 + * @example + * ```html + * xxxxoooxxxx + * + * + * ``` + */ + mergeSibling: function (node, ignorePre, ignoreNext) { + function merge(rtl, start, node) { + var next; + if ((next = node[rtl]) && !domUtils.isBookmarkNode(next) && next.nodeType == 1 && domUtils.isSameElement(node, next)) { + while (next.firstChild) { + if (start == 'firstChild') { + node.insertBefore(next.lastChild, node.firstChild); + } else { + node.appendChild(next.firstChild); + } + } + domUtils.remove(next); + } + } + + !ignorePre && merge('previousSibling', 'firstChild', node); + !ignoreNext && merge('nextSibling', 'lastChild', node); + }, + + /** + * 设置节点node及其子节点不会被选中 + * @method unSelectable + * @param { Element } node 需要执行操作的dom元素 + * @remind 执行该操作后的节点, 将不能被鼠标选中 + * @example + * ```javascript + * UE.dom.domUtils.unSelectable( document.body ); + * ``` + */ + unSelectable: ie && browser.ie9below || browser.opera ? function (node) { + //for ie9 + node.onselectstart = function () { + return false; + }; + node.onclick = node.onkeyup = node.onkeydown = function () { + return false; + }; + node.unselectable = 'on'; + node.setAttribute("unselectable", "on"); + for (var i = 0, ci; ci = node.all[i++];) { + switch (ci.tagName.toLowerCase()) { + case 'iframe' : + case 'textarea' : + case 'input' : + case 'select' : + break; + default : + ci.unselectable = 'on'; + node.setAttribute("unselectable", "on"); + } + } + } : function (node) { + node.style.MozUserSelect = + node.style.webkitUserSelect = + node.style.msUserSelect = + node.style.KhtmlUserSelect = 'none'; + }, + /** + * 删除节点node上的指定属性名称的属性 + * @method removeAttributes + * @param { Node } node 需要删除属性的节点对象 + * @param { String } attrNames 可以是空格隔开的多个属性名称,该操作将会依次删除相应的属性 + * @example + * ```html + *
      + * xxxxx + *
      + * + * + * ``` + */ + + /** + * 删除节点node上的指定属性名称的属性 + * @method removeAttributes + * @param { Node } node 需要删除属性的节点对象 + * @param { Array } attrNames 需要删除的属性名数组 + * @example + * ```html + *
      + * xxxxx + *
      + * + * + * ``` + */ + removeAttributes: function (node, attrNames) { + attrNames = utils.isArray(attrNames) ? attrNames : utils.trim(attrNames).replace(/[ ]{2,}/g, ' ').split(' '); + for (var i = 0, ci; ci = attrNames[i++];) { + ci = attrFix[ci] || ci; + switch (ci) { + case 'className': + node[ci] = ''; + break; + case 'style': + node.style.cssText = ''; + var val = node.getAttributeNode('style'); + !browser.ie && val && node.removeAttributeNode(val); + } + node.removeAttribute(ci); + } + }, + /** + * 在doc下创建一个标签名为tag,属性为attrs的元素 + * @method createElement + * @param { DomDocument } doc 新创建的元素属于该document节点创建 + * @param { String } tagName 需要创建的元素的标签名 + * @param { Object } attrs 新创建的元素的属性key-value集合 + * @return { Element } 新创建的元素对象 + * @example + * ```javascript + * var ele = UE.dom.domUtils.createElement( document, 'div', { + * id: 'test' + * } ); + * + * //output: DIV + * console.log( ele.tagName ); + * + * //output: test + * console.log( ele.id ); + * + * ``` + */ + createElement: function (doc, tag, attrs) { + return domUtils.setAttributes(doc.createElement(tag), attrs) + }, + /** + * 为节点node添加属性attrs,attrs为属性键值对 + * @method setAttributes + * @param { Element } node 需要设置属性的元素对象 + * @param { Object } attrs 需要设置的属性名-值对 + * @return { Element } 设置属性的元素对象 + * @example + * ```html + * + * + * + * + */ + setAttributes: function (node, attrs) { + for (var attr in attrs) { + if (attrs.hasOwnProperty(attr)) { + var value = attrs[attr]; + switch (attr) { + case 'class': + //ie下要这样赋值,setAttribute不起作用 + node.className = value; + break; + case 'style' : + node.style.cssText = node.style.cssText + ";" + value; + break; + case 'innerHTML': + node[attr] = value; + break; + case 'value': + node.value = value; + break; + default: + node.setAttribute(attrFix[attr] || attr, value); + } + } + } + return node; + }, + + /** + * 获取元素element经过计算后的样式值 + * @method getComputedStyle + * @param { Element } element 需要获取样式的元素对象 + * @param { String } styleName 需要获取的样式名 + * @return { String } 获取到的样式值 + * @example + * ```html + * + * + * + * + * + * ``` + */ + getComputedStyle: function (element, styleName) { + //一下的属性单独处理 + var pros = 'width height top left'; + + if (pros.indexOf(styleName) > -1) { + return element['offset' + styleName.replace(/^\w/, function (s) { + return s.toUpperCase() + })] + 'px'; + } + //忽略文本节点 + if (element.nodeType == 3) { + element = element.parentNode; + } + //ie下font-size若body下定义了font-size,则从currentStyle里会取到这个font-size. 取不到实际值,故此修改. + if (browser.ie && browser.version < 9 && styleName == 'font-size' && !element.style.fontSize && + !dtd.$empty[element.tagName] && !dtd.$nonChild[element.tagName]) { + var span = element.ownerDocument.createElement('span'); + span.style.cssText = 'padding:0;border:0;font-family:simsun;'; + span.innerHTML = '.'; + element.appendChild(span); + var result = span.offsetHeight; + element.removeChild(span); + span = null; + return result + 'px'; + } + try { + var value = domUtils.getStyle(element, styleName) || + (window.getComputedStyle ? domUtils.getWindow(element).getComputedStyle(element, '').getPropertyValue(styleName) : + (element.currentStyle || element.style)[utils.cssStyleToDomStyle(styleName)]); + + } catch (e) { + return ""; + } + return utils.transUnitToPx(utils.fixColor(styleName, value)); + }, + /** + * 删除元素element指定的className + * @method removeClasses + * @param { Element } ele 需要删除class的元素节点 + * @param { String } classNames 需要删除的className, 多个className之间以空格分开 + * @example + * ```html + * xxx + * + * + * ``` + */ + + /** + * 删除元素element指定的className + * @method removeClasses + * @param { Element } ele 需要删除class的元素节点 + * @param { Array } classNames 需要删除的className数组 + * @example + * ```html + * xxx + * + * + * ``` + */ + removeClasses: function (elm, classNames) { + classNames = utils.isArray(classNames) ? classNames : + utils.trim(classNames).replace(/[ ]{2,}/g, ' ').split(' '); + for (var i = 0, ci, cls = elm.className; ci = classNames[i++];) { + cls = cls.replace(new RegExp('\\b' + ci + '\\b'), '') + } + cls = utils.trim(cls).replace(/[ ]{2,}/g, ' '); + if (cls) { + elm.className = cls; + } else { + domUtils.removeAttributes(elm, ['class']); + } + }, + /** + * 给元素element添加className + * @method addClass + * @param { Node } ele 需要增加className的元素 + * @param { String } classNames 需要添加的className, 多个className之间以空格分割 + * @remind 相同的类名不会被重复添加 + * @example + * ```html + * + * + * + * ``` + */ + + /** + * 判断元素element是否包含给定的样式类名className + * @method hasClass + * @param { Node } ele 需要检测的元素 + * @param { Array } classNames 需要检测的className数组 + * @return { Boolean } 元素是否包含所有给定的className + * @example + * ```html + * + * + * + * ``` + */ + hasClass: function (element, className) { + if (utils.isRegExp(className)) { + return className.test(element.className) + } + className = utils.trim(className).replace(/[ ]{2,}/g, ' ').split(' '); + for (var i = 0, ci, cls = element.className; ci = className[i++];) { + if (!new RegExp('\\b' + ci + '\\b', 'i').test(cls)) { + return false; + } + } + return i - 1 == className.length; + }, + + /** + * 阻止事件默认行为 + * @method preventDefault + * @param { Event } evt 需要阻止默认行为的事件对象 + * @example + * ```javascript + * UE.dom.domUtils.preventDefault( evt ); + * ``` + */ + preventDefault: function (evt) { + evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); + }, + /** + * 删除元素element指定的样式 + * @method removeStyle + * @param { Element } element 需要删除样式的元素 + * @param { String } styleName 需要删除的样式名 + * @example + * ```html + * + * + * + * ``` + */ + removeStyle: function (element, name) { + if (browser.ie) { + //针对color先单独处理一下 + if (name == 'color') { + name = '(^|;)' + name; + } + element.style.cssText = element.style.cssText.replace(new RegExp(name + '[^:]*:[^;]+;?', 'ig'), '') + } else { + if (element.style.removeProperty) { + element.style.removeProperty(name); + } else { + element.style.removeAttribute(utils.cssStyleToDomStyle(name)); + } + } + + + if (!element.style.cssText) { + domUtils.removeAttributes(element, ['style']); + } + }, + /** + * 获取元素element的style属性的指定值 + * @method getStyle + * @param { Element } element 需要获取属性值的元素 + * @param { String } styleName 需要获取的style的名称 + * @warning 该方法仅获取元素style属性中所标明的值 + * @return { String } 该元素包含指定的style属性值 + * @example + * ```html + *
      + * + * + * ``` + */ + getStyle: function (element, name) { + var value = element.style[utils.cssStyleToDomStyle(name)]; + return utils.fixColor(name, value); + }, + /** + * 为元素element设置样式属性值 + * @method setStyle + * @param { Element } element 需要设置样式的元素 + * @param { String } styleName 样式名 + * @param { String } styleValue 样式值 + * @example + * ```html + *
      + * + * + * ``` + */ + setStyle: function (element, name, value) { + element.style[utils.cssStyleToDomStyle(name)] = value; + if (!utils.trim(element.style.cssText)) { + this.removeAttributes(element, 'style') + } + }, + /** + * 为元素element设置多个样式属性值 + * @method setStyles + * @param { Element } element 需要设置样式的元素 + * @param { Object } styles 样式名值对 + * @example + * ```html + *
      + * + * + * ``` + */ + setStyles: function (element, styles) { + for (var name in styles) { + if (styles.hasOwnProperty(name)) { + domUtils.setStyle(element, name, styles[name]); + } + } + }, + /** + * 删除_moz_dirty属性 + * @private + * @method removeDirtyAttr + */ + removeDirtyAttr: function (node) { + for (var i = 0, ci, nodes = node.getElementsByTagName('*'); ci = nodes[i++];) { + ci.removeAttribute('_moz_dirty'); + } + node.removeAttribute('_moz_dirty'); + }, + /** + * 获取子节点的数量 + * @method getChildCount + * @param { Element } node 需要检测的元素 + * @return { Number } 给定的node元素的子节点数量 + * @example + * ```html + *
      + * + *
      + * + * + * ``` + */ + + /** + * 根据给定的过滤规则, 获取符合条件的子节点的数量 + * @method getChildCount + * @param { Element } node 需要检测的元素 + * @param { Function } fn 过滤器, 要求对符合条件的子节点返回true, 反之则要求返回false + * @return { Number } 符合过滤条件的node元素的子节点数量 + * @example + * ```html + *
      + * + *
      + * + * + * ``` + */ + getChildCount: function (node, fn) { + var count = 0, first = node.firstChild; + fn = fn || function () { + return 1; + }; + while (first) { + if (fn(first)) { + count++; + } + first = first.nextSibling; + } + return count; + }, + + /** + * 判断给定节点是否为空节点 + * @method isEmptyNode + * @param { Node } node 需要检测的节点对象 + * @return { Boolean } 节点是否为空 + * @example + * ```javascript + * UE.dom.domUtils.isEmptyNode( document.body ); + * ``` + */ + isEmptyNode: function (node) { + return !node.firstChild || domUtils.getChildCount(node, function (node) { + return !domUtils.isBr(node) && !domUtils.isBookmarkNode(node) && !domUtils.isWhitespace(node) + }) == 0 + }, + clearSelectedArr: function (nodes) { + var node; + while (node = nodes.pop()) { + domUtils.removeAttributes(node, ['class']); + } + }, + /** + * 将显示区域滚动到指定节点的位置 + * @method scrollToView + * @param {Node} node 节点 + * @param {window} win window对象 + * @param {Number} offsetTop 距离上方的偏移量 + */ + scrollToView: function (node, win, offsetTop) { + var getViewPaneSize = function () { + var doc = win.document, + mode = doc.compatMode == 'CSS1Compat'; + return { + width: (mode ? doc.documentElement.clientWidth : doc.body.clientWidth) || 0, + height: (mode ? doc.documentElement.clientHeight : doc.body.clientHeight) || 0 + }; + }, + getScrollPosition = function (win) { + if ('pageXOffset' in win) { + return { + x: win.pageXOffset || 0, + y: win.pageYOffset || 0 + }; + } + else { + var doc = win.document; + return { + x: doc.documentElement.scrollLeft || doc.body.scrollLeft || 0, + y: doc.documentElement.scrollTop || doc.body.scrollTop || 0 + }; + } + }; + var winHeight = getViewPaneSize().height, offset = winHeight * -1 + offsetTop; + offset += (node.offsetHeight || 0); + var elementPosition = domUtils.getXY(node); + offset += elementPosition.y; + var currentScroll = getScrollPosition(win).y; + // offset += 50; + if (offset > currentScroll || offset < currentScroll - winHeight) { + win.scrollTo(0, offset + (offset < 0 ? -20 : 20)); + } + }, + /** + * 判断给定节点是否为br + * @method isBr + * @param { Node } node 需要判断的节点对象 + * @return { Boolean } 给定的节点是否是br节点 + */ + isBr: function (node) { + return node.nodeType == 1 && node.tagName == 'BR'; + }, + /** + * 判断给定的节点是否是一个“填充”节点 + * @private + * @method isFillChar + * @param { Node } node 需要判断的节点 + * @param { Boolean } isInStart 是否从节点内容的开始位置匹配 + * @returns { Boolean } 节点是否是填充节点 + */ + isFillChar: function (node, isInStart) { + if (node.nodeType != 3) + return false; + var text = node.nodeValue; + if (isInStart) { + return new RegExp('^' + domUtils.fillChar).test(text) + } + return !text.replace(new RegExp(domUtils.fillChar, 'g'), '').length + }, + isStartInblock: function (range) { + var tmpRange = range.cloneRange(), + flag = 0, + start = tmpRange.startContainer, + tmp; + if (start.nodeType == 1 && start.childNodes[tmpRange.startOffset]) { + start = start.childNodes[tmpRange.startOffset]; + var pre = start.previousSibling; + while (pre && domUtils.isFillChar(pre)) { + start = pre; + pre = pre.previousSibling; + } + } + if (this.isFillChar(start, true) && tmpRange.startOffset == 1) { + tmpRange.setStartBefore(start); + start = tmpRange.startContainer; + } + + while (start && domUtils.isFillChar(start)) { + tmp = start; + start = start.previousSibling + } + if (tmp) { + tmpRange.setStartBefore(tmp); + start = tmpRange.startContainer; + } + if (start.nodeType == 1 && domUtils.isEmptyNode(start) && tmpRange.startOffset == 1) { + tmpRange.setStart(start, 0).collapse(true); + } + while (!tmpRange.startOffset) { + start = tmpRange.startContainer; + if (domUtils.isBlockElm(start) || domUtils.isBody(start)) { + flag = 1; + break; + } + var pre = tmpRange.startContainer.previousSibling, + tmpNode; + if (!pre) { + tmpRange.setStartBefore(tmpRange.startContainer); + } else { + while (pre && domUtils.isFillChar(pre)) { + tmpNode = pre; + pre = pre.previousSibling; + } + if (tmpNode) { + tmpRange.setStartBefore(tmpNode); + } else { + tmpRange.setStartBefore(tmpRange.startContainer); + } + } + } + return flag && !domUtils.isBody(tmpRange.startContainer) ? 1 : 0; + }, + + /** + * 判断给定的元素是否是一个空元素 + * @method isEmptyBlock + * @param { Element } node 需要判断的元素 + * @return { Boolean } 是否是空元素 + * @example + * ```html + *
      + * + * + * ``` + */ + + /** + * 根据指定的判断规则判断给定的元素是否是一个空元素 + * @method isEmptyBlock + * @param { Element } node 需要判断的元素 + * @param { RegExp } reg 对内容执行判断的正则表达式对象 + * @return { Boolean } 是否是空元素 + */ + isEmptyBlock: function (node, reg) { + if (node.nodeType != 1) + return 0; + reg = reg || new RegExp('[ \xa0\t\r\n' + domUtils.fillChar + ']', 'g'); + + if (node[browser.ie ? 'innerText' : 'textContent'].replace(reg, '').length > 0) { + return 0; + } + for (var n in dtd.$isNotEmpty) { + if (node.getElementsByTagName(n).length) { + return 0; + } + } + return 1; + }, + + /** + * 移动元素使得该元素的位置移动指定的偏移量的距离 + * @method setViewportOffset + * @param { Element } element 需要设置偏移量的元素 + * @param { Object } offset 偏移量, 形如{ left: 100, top: 50 }的一个键值对, 表示该元素将在 + * 现有的位置上向水平方向偏移offset.left的距离, 在竖直方向上偏移 + * offset.top的距离 + * @example + * ```html + *
      + * + * + * ``` + */ + setViewportOffset: function (element, offset) { + var left = parseInt(element.style.left) | 0; + var top = parseInt(element.style.top) | 0; + var rect = element.getBoundingClientRect(); + var offsetLeft = offset.left - rect.left; + var offsetTop = offset.top - rect.top; + if (offsetLeft) { + element.style.left = left + offsetLeft + 'px'; + } + if (offsetTop) { + element.style.top = top + offsetTop + 'px'; + } + }, + + /** + * 用“填充字符”填充节点 + * @method fillNode + * @private + * @param { DomDocument } doc 填充的节点所在的docment对象 + * @param { Node } node 需要填充的节点对象 + * @example + * ```html + *
      + * + * + * ``` + */ + fillNode: function (doc, node) { + var tmpNode = browser.ie ? doc.createTextNode(domUtils.fillChar) : doc.createElement('br'); + node.innerHTML = ''; + node.appendChild(tmpNode); + }, + + /** + * 把节点src的所有子节点追加到另一个节点tag上去 + * @method moveChild + * @param { Node } src 源节点, 该节点下的所有子节点将被移除 + * @param { Node } tag 目标节点, 从源节点移除的子节点将被追加到该节点下 + * @example + * ```html + *
      + * + *
      + *
      + *
      + *
      + * + * + * ``` + */ + + /** + * 把节点src的所有子节点移动到另一个节点tag上去, 可以通过dir参数控制附加的行为是“追加”还是“插入顶部” + * @method moveChild + * @param { Node } src 源节点, 该节点下的所有子节点将被移除 + * @param { Node } tag 目标节点, 从源节点移除的子节点将被附加到该节点下 + * @param { Boolean } dir 附加方式, 如果为true, 则附加进去的节点将被放到目标节点的顶部, 反之,则放到末尾 + * @example + * ```html + *
      + * + *
      + *
      + *
      + *
      + * + * + * ``` + */ + moveChild: function (src, tag, dir) { + while (src.firstChild) { + if (dir && tag.firstChild) { + tag.insertBefore(src.lastChild, tag.firstChild); + } else { + tag.appendChild(src.firstChild); + } + } + }, + + /** + * 判断节点的标签上是否不存在任何属性 + * @method hasNoAttributes + * @private + * @param { Node } node 需要检测的节点对象 + * @return { Boolean } 节点是否不包含任何属性 + * @example + * ```html + *
      xxxx
      + * + * + * ``` + */ + hasNoAttributes: function (node) { + return browser.ie ? /^<\w+\s*?>/.test(node.outerHTML) : node.attributes.length == 0; + }, + + /** + * 检测节点是否是UEditor所使用的辅助节点 + * @method isCustomeNode + * @private + * @param { Node } node 需要检测的节点 + * @remind 辅助节点是指编辑器要完成工作临时添加的节点, 在输出的时候将会从编辑器内移除, 不会影响最终的结果。 + * @return { Boolean } 给定的节点是否是一个辅助节点 + */ + isCustomeNode: function (node) { + return node.nodeType == 1 && node.getAttribute('_ue_custom_node_'); + }, + + /** + * 检测节点的标签是否是给定的标签 + * @method isTagNode + * @param { Node } node 需要检测的节点对象 + * @param { String } tagName 标签 + * @return { Boolean } 节点的标签是否是给定的标签 + * @example + * ```html + *
      + * + * + * ``` + */ + isTagNode: function (node, tagNames) { + return node.nodeType == 1 && new RegExp('\\b' + node.tagName + '\\b', 'i').test(tagNames) + }, + + /** + * 给定一个节点数组,在通过指定的过滤器过滤后, 获取其中满足过滤条件的第一个节点 + * @method filterNodeList + * @param { Array } nodeList 需要过滤的节点数组 + * @param { Function } fn 过滤器, 对符合条件的节点, 执行结果返回true, 反之则返回false + * @return { Node | NULL } 如果找到符合过滤条件的节点, 则返回该节点, 否则返回NULL + * @example + * ```javascript + * var divNodes = document.getElementsByTagName("div"); + * divNodes = [].slice.call( divNodes, 0 ); + * + * //output: null + * console.log( UE.dom.domUtils.filterNodeList( divNodes, function ( node ) { + * return node.tagName.toLowerCase() !== 'div'; + * } ) ); + * ``` + */ + + /** + * 给定一个节点数组nodeList和一组标签名tagNames, 获取其中能够匹配标签名的节点集合中的第一个节点 + * @method filterNodeList + * @param { Array } nodeList 需要过滤的节点数组 + * @param { String } tagNames 需要匹配的标签名, 多个标签名之间用空格分割 + * @return { Node | NULL } 如果找到标签名匹配的节点, 则返回该节点, 否则返回NULL + * @example + * ```javascript + * var divNodes = document.getElementsByTagName("div"); + * divNodes = [].slice.call( divNodes, 0 ); + * + * //output: null + * console.log( UE.dom.domUtils.filterNodeList( divNodes, 'a span' ) ); + * ``` + */ + + /** + * 给定一个节点数组,在通过指定的过滤器过滤后, 如果参数forAll为true, 则会返回所有满足过滤 + * 条件的节点集合, 否则, 返回满足条件的节点集合中的第一个节点 + * @method filterNodeList + * @param { Array } nodeList 需要过滤的节点数组 + * @param { Function } fn 过滤器, 对符合条件的节点, 执行结果返回true, 反之则返回false + * @param { Boolean } forAll 是否返回整个节点数组, 如果该参数为false, 则返回节点集合中的第一个节点 + * @return { Array | Node | NULL } 如果找到符合过滤条件的节点, 则根据参数forAll的值决定返回满足 + * 过滤条件的节点数组或第一个节点, 否则返回NULL + * @example + * ```javascript + * var divNodes = document.getElementsByTagName("div"); + * divNodes = [].slice.call( divNodes, 0 ); + * + * //output: 3(假定有3个div) + * console.log( divNodes.length ); + * + * var nodes = UE.dom.domUtils.filterNodeList( divNodes, function ( node ) { + * return node.tagName.toLowerCase() === 'div'; + * }, true ); + * + * //output: 3 + * console.log( nodes.length ); + * + * var node = UE.dom.domUtils.filterNodeList( divNodes, function ( node ) { + * return node.tagName.toLowerCase() === 'div'; + * }, false ); + * + * //output: div + * console.log( node.nodeName ); + * ``` + */ + filterNodeList: function (nodelist, filter, forAll) { + var results = []; + if (!utils.isFunction(filter)) { + var str = filter; + filter = function (n) { + return utils.indexOf(utils.isArray(str) ? str : str.split(' '), n.tagName.toLowerCase()) != -1 + }; + } + utils.each(nodelist, function (n) { + filter(n) && results.push(n) + }); + return results.length == 0 ? null : results.length == 1 || !forAll ? results[0] : results + }, + + /** + * 查询给定的range选区是否在给定的node节点内,且在该节点的最末尾 + * @method isInNodeEndBoundary + * @param { UE.dom.Range } rng 需要判断的range对象, 该对象的startContainer不能为NULL + * @param node 需要检测的节点对象 + * @return { Number } 如果给定的选取range对象是在node内部的最末端, 则返回1, 否则返回0 + */ + isInNodeEndBoundary: function (rng, node) { + var start = rng.startContainer; + if (start.nodeType == 3 && rng.startOffset != start.nodeValue.length) { + return 0; + } + if (start.nodeType == 1 && rng.startOffset != start.childNodes.length) { + return 0; + } + while (start !== node) { + if (start.nextSibling) { + return 0 + } + ; + start = start.parentNode; + } + return 1; + }, + isBoundaryNode: function (node, dir) { + var tmp; + while (!domUtils.isBody(node)) { + tmp = node; + node = node.parentNode; + if (tmp !== node[dir]) { + return false; + } + } + return true; + }, + fillHtml: browser.ie11below ? ' ' : '
      ' + }; + var fillCharReg = new RegExp(domUtils.fillChar, 'g'); + +// core/Range.js + /** + * Range封装 + * @file + * @module UE.dom + * @class Range + * @since 1.2.6.1 + */ + + /** + * dom操作封装 + * @unfile + * @module UE.dom + */ + + /** + * Range实现类,本类是UEditor底层核心类,封装不同浏览器之间的Range操作。 + * @unfile + * @module UE.dom + * @class Range + */ + + + (function () { + var guid = 0, + fillChar = domUtils.fillChar, + fillData; + + /** + * 更新range的collapse状态 + * @param {Range} range range对象 + */ + function updateCollapse(range) { + range.collapsed = + range.startContainer && range.endContainer && + range.startContainer === range.endContainer && + range.startOffset == range.endOffset; + } + + function selectOneNode(rng) { + return !rng.collapsed && rng.startContainer.nodeType == 1 && rng.startContainer === rng.endContainer && rng.endOffset - rng.startOffset == 1 + } + + function setEndPoint(toStart, node, offset, range) { + //如果node是自闭合标签要处理 + if (node.nodeType == 1 && (dtd.$empty[node.tagName] || dtd.$nonChild[node.tagName])) { + offset = domUtils.getNodeIndex(node) + (toStart ? 0 : 1); + node = node.parentNode; + } + if (toStart) { + range.startContainer = node; + range.startOffset = offset; + if (!range.endContainer) { + range.collapse(true); + } + } else { + range.endContainer = node; + range.endOffset = offset; + if (!range.startContainer) { + range.collapse(false); + } + } + updateCollapse(range); + return range; + } + + function execContentsAction(range, action) { + //调整边界 + //range.includeBookmark(); + var start = range.startContainer, + end = range.endContainer, + startOffset = range.startOffset, + endOffset = range.endOffset, + doc = range.document, + frag = doc.createDocumentFragment(), + tmpStart, tmpEnd; + if (start.nodeType == 1) { + start = start.childNodes[startOffset] || (tmpStart = start.appendChild(doc.createTextNode(''))); + } + if (end.nodeType == 1) { + end = end.childNodes[endOffset] || (tmpEnd = end.appendChild(doc.createTextNode(''))); + } + if (start === end && start.nodeType == 3) { + frag.appendChild(doc.createTextNode(start.substringData(startOffset, endOffset - startOffset))); + //is not clone + if (action) { + start.deleteData(startOffset, endOffset - startOffset); + range.collapse(true); + } + return frag; + } + var current, currentLevel, clone = frag, + startParents = domUtils.findParents(start, true), endParents = domUtils.findParents(end, true); + for (var i = 0; startParents[i] == endParents[i];) { + i++; + } + for (var j = i, si; si = startParents[j]; j++) { + current = si.nextSibling; + if (si == start) { + if (!tmpStart) { + if (range.startContainer.nodeType == 3) { + clone.appendChild(doc.createTextNode(start.nodeValue.slice(startOffset))); + //is not clone + if (action) { + start.deleteData(startOffset, start.nodeValue.length - startOffset); + } + } else { + clone.appendChild(!action ? start.cloneNode(true) : start); + } + } + } else { + currentLevel = si.cloneNode(false); + clone.appendChild(currentLevel); + } + while (current) { + if (current === end || current === endParents[j]) { + break; + } + si = current.nextSibling; + clone.appendChild(!action ? current.cloneNode(true) : current); + current = si; + } + clone = currentLevel; + } + clone = frag; + if (!startParents[i]) { + clone.appendChild(startParents[i - 1].cloneNode(false)); + clone = clone.firstChild; + } + for (var j = i, ei; ei = endParents[j]; j++) { + current = ei.previousSibling; + if (ei == end) { + if (!tmpEnd && range.endContainer.nodeType == 3) { + clone.appendChild(doc.createTextNode(end.substringData(0, endOffset))); + //is not clone + if (action) { + end.deleteData(0, endOffset); + } + } + } else { + currentLevel = ei.cloneNode(false); + clone.appendChild(currentLevel); + } + //如果两端同级,右边第一次已经被开始做了 + if (j != i || !startParents[i]) { + while (current) { + if (current === start) { + break; + } + ei = current.previousSibling; + clone.insertBefore(!action ? current.cloneNode(true) : current, clone.firstChild); + current = ei; + } + } + clone = currentLevel; + } + if (action) { + range.setStartBefore(!endParents[i] ? endParents[i - 1] : !startParents[i] ? startParents[i - 1] : endParents[i]).collapse(true); + } + tmpStart && domUtils.remove(tmpStart); + tmpEnd && domUtils.remove(tmpEnd); + return frag; + } + + /** + * 创建一个跟document绑定的空的Range实例 + * @constructor + * @param { Document } document 新建的选区所属的文档对象 + */ + + /** + * @property { Node } startContainer 当前Range的开始边界的容器节点, 可以是一个元素节点或者是文本节点 + */ + + /** + * @property { Node } startOffset 当前Range的开始边界容器节点的偏移量, 如果是元素节点, + * 该值就是childNodes中的第几个节点, 如果是文本节点就是文本内容的第几个字符 + */ + + /** + * @property { Node } endContainer 当前Range的结束边界的容器节点, 可以是一个元素节点或者是文本节点 + */ + + /** + * @property { Node } endOffset 当前Range的结束边界容器节点的偏移量, 如果是元素节点, + * 该值就是childNodes中的第几个节点, 如果是文本节点就是文本内容的第几个字符 + */ + + /** + * @property { Boolean } collapsed 当前Range是否闭合 + * @default true + * @remind Range是闭合的时候, startContainer === endContainer && startOffset === endOffset + */ + + /** + * @property { Document } document 当前Range所属的Document对象 + * @remind 不同range的的document属性可以是不同的 + */ + var Range = dom.Range = function (document) { + var me = this; + me.startContainer = + me.startOffset = + me.endContainer = + me.endOffset = null; + me.document = document; + me.collapsed = true; + }; + + /** + * 删除fillData + * @param doc + * @param excludeNode + */ + function removeFillData(doc, excludeNode) { + try { + if (fillData && domUtils.inDoc(fillData, doc)) { + if (!fillData.nodeValue.replace(fillCharReg, '').length) { + var tmpNode = fillData.parentNode; + domUtils.remove(fillData); + while (tmpNode && domUtils.isEmptyInlineElement(tmpNode) && + //safari的contains有bug + (browser.safari ? !(domUtils.getPosition(tmpNode, excludeNode) & domUtils.POSITION_CONTAINS) : !tmpNode.contains(excludeNode)) + ) { + fillData = tmpNode.parentNode; + domUtils.remove(tmpNode); + tmpNode = fillData; + } + } else { + fillData.nodeValue = fillData.nodeValue.replace(fillCharReg, ''); + } + } + } catch (e) { + } + } + + /** + * @param node + * @param dir + */ + function mergeSibling(node, dir) { + var tmpNode; + node = node[dir]; + while (node && domUtils.isFillChar(node)) { + tmpNode = node[dir]; + domUtils.remove(node); + node = tmpNode; + } + } + + Range.prototype = { + + /** + * 克隆选区的内容到一个DocumentFragment里 + * @method cloneContents + * @return { DocumentFragment | NULL } 如果选区是闭合的将返回null, 否则, 返回包含所clone内容的DocumentFragment元素 + * @example + * ```html + * + * + * xx[xxx]x + * + * + * + * ``` + */ + cloneContents: function () { + return this.collapsed ? null : execContentsAction(this, 0); + }, + + /** + * 删除当前选区范围中的所有内容 + * @method deleteContents + * @remind 执行完该操作后, 当前Range对象变成了闭合状态 + * @return { UE.dom.Range } 当前操作的Range对象 + * @example + * ```html + * + * + * xx[xxx]x + * + * + * + * ``` + */ + deleteContents: function () { + var txt; + if (!this.collapsed) { + execContentsAction(this, 1); + } + if (browser.webkit) { + txt = this.startContainer; + if (txt.nodeType == 3 && !txt.nodeValue.length) { + this.setStartBefore(txt).collapse(true); + domUtils.remove(txt); + } + } + return this; + }, + + /** + * 将当前选区的内容提取到一个DocumentFragment里 + * @method extractContents + * @remind 执行该操作后, 选区将变成闭合状态 + * @warning 执行该操作后, 原来选区所选中的内容将从dom树上剥离出来 + * @return { DocumentFragment } 返回包含所提取内容的DocumentFragment对象 + * @example + * ```html + * + * + * xx[xxx]x + * + * + * + */ + extractContents: function () { + return this.collapsed ? null : execContentsAction(this, 2); + }, + + /** + * 设置Range的开始容器节点和偏移量 + * @method setStart + * @remind 如果给定的节点是元素节点,那么offset指的是其子元素中索引为offset的元素, + * 如果是文本节点,那么offset指的是其文本内容的第offset个字符 + * @remind 如果提供的容器节点是一个不能包含子元素的节点, 则该选区的开始容器将被设置 + * 为该节点的父节点, 此时, 其距离开始容器的偏移量也变成了该节点在其父节点 + * 中的索引 + * @param { Node } node 将被设为当前选区开始边界容器的节点对象 + * @param { int } offset 选区的开始位置偏移量 + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * xxxxxxxxxxxxx[xxx] + * + * + * ``` + * @example + * ```html + * + * xxx[xx]x + * + * + * ``` + */ + setStart: function (node, offset) { + return setEndPoint(true, node, offset, this); + }, + + /** + * 设置Range的结束容器和偏移量 + * @method setEnd + * @param { Node } node 作为当前选区结束边界容器的节点对象 + * @param { int } offset 结束边界的偏移量 + * @see UE.dom.Range:setStart(Node,int) + * @return { UE.dom.Range } 当前range对象 + */ + setEnd: function (node, offset) { + return setEndPoint(false, node, offset, this); + }, + + /** + * 将Range开始位置设置到node节点之后 + * @method setStartAfter + * @remind 该操作将会把给定节点的父节点作为range的开始容器, 且偏移量是该节点在其父节点中的位置索引+1 + * @param { Node } node 选区的开始边界将紧接着该节点之后 + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * xxxxxxx[xxxx] + * + * + * ``` + */ + setStartAfter: function (node) { + return this.setStart(node.parentNode, domUtils.getNodeIndex(node) + 1); + }, + + /** + * 将Range开始位置设置到node节点之前 + * @method setStartBefore + * @remind 该操作将会把给定节点的父节点作为range的开始容器, 且偏移量是该节点在其父节点中的位置索引 + * @param { Node } node 新的选区开始位置在该节点之前 + * @see UE.dom.Range:setStartAfter(Node) + * @return { UE.dom.Range } 当前range对象 + */ + setStartBefore: function (node) { + return this.setStart(node.parentNode, domUtils.getNodeIndex(node)); + }, + + /** + * 将Range结束位置设置到node节点之后 + * @method setEndAfter + * @remind 该操作将会把给定节点的父节点作为range的结束容器, 且偏移量是该节点在其父节点中的位置索引+1 + * @param { Node } node 目标节点 + * @see UE.dom.Range:setStartAfter(Node) + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * [xxxxxxx]xxxx + * + * + * ``` + */ + setEndAfter: function (node) { + return this.setEnd(node.parentNode, domUtils.getNodeIndex(node) + 1); + }, + + /** + * 将Range结束位置设置到node节点之前 + * @method setEndBefore + * @remind 该操作将会把给定节点的父节点作为range的结束容器, 且偏移量是该节点在其父节点中的位置索引 + * @param { Node } node 目标节点 + * @see UE.dom.Range:setEndAfter(Node) + * @return { UE.dom.Range } 当前range对象 + */ + setEndBefore: function (node) { + return this.setEnd(node.parentNode, domUtils.getNodeIndex(node)); + }, + + /** + * 设置Range的开始位置到node节点内的第一个子节点之前 + * @method setStartAtFirst + * @remind 选区的开始容器将变成给定的节点, 且偏移量为0 + * @remind 如果给定的节点是元素节点, 则该节点必须是允许包含子节点的元素。 + * @param { Node } node 目标节点 + * @see UE.dom.Range:setStartBefore(Node) + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * xxxxx[xx]xxxx + * + * + * ``` + */ + setStartAtFirst: function (node) { + return this.setStart(node, 0); + }, + + /** + * 设置Range的开始位置到node节点内的最后一个节点之后 + * @method setStartAtLast + * @remind 选区的开始容器将变成给定的节点, 且偏移量为该节点的子节点数 + * @remind 如果给定的节点是元素节点, 则该节点必须是允许包含子节点的元素。 + * @param { Node } node 目标节点 + * @see UE.dom.Range:setStartAtFirst(Node) + * @return { UE.dom.Range } 当前range对象 + */ + setStartAtLast: function (node) { + return this.setStart(node, node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length); + }, + + /** + * 设置Range的结束位置到node节点内的第一个节点之前 + * @method setEndAtFirst + * @param { Node } node 目标节点 + * @remind 选区的结束容器将变成给定的节点, 且偏移量为0 + * @remind node必须是一个元素节点, 且必须是允许包含子节点的元素。 + * @see UE.dom.Range:setStartAtFirst(Node) + * @return { UE.dom.Range } 当前range对象 + */ + setEndAtFirst: function (node) { + return this.setEnd(node, 0); + }, + + /** + * 设置Range的结束位置到node节点内的最后一个节点之后 + * @method setEndAtLast + * @param { Node } node 目标节点 + * @remind 选区的结束容器将变成给定的节点, 且偏移量为该节点的子节点数量 + * @remind node必须是一个元素节点, 且必须是允许包含子节点的元素。 + * @see UE.dom.Range:setStartAtFirst(Node) + * @return { UE.dom.Range } 当前range对象 + */ + setEndAtLast: function (node) { + return this.setEnd(node, node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length); + }, + + /** + * 选中给定节点 + * @method selectNode + * @remind 此时, 选区的开始容器和结束容器都是该节点的父节点, 其startOffset是该节点在父节点中的位置索引, + * 而endOffset为startOffset+1 + * @param { Node } node 需要选中的节点 + * @return { UE.dom.Range } 当前range对象,此时的range仅包含当前给定的节点对象 + * @example + * ```html + * + * xxxxx[xx]xxxx + * + * + * ``` + */ + selectNode: function (node) { + return this.setStartBefore(node).setEndAfter(node); + }, + + /** + * 选中给定节点内部的所有节点 + * @method selectNodeContents + * @remind 此时, 选区的开始容器和结束容器都是该节点, 其startOffset为0, + * 而endOffset是该节点的子节点数。 + * @param { Node } node 目标节点, 当前range将包含该节点内的所有节点 + * @return { UE.dom.Range } 当前range对象, 此时range仅包含给定节点的所有子节点 + * @example + * ```html + * + * xxxxx[xx]xxxx + * + * + * ``` + */ + selectNodeContents: function (node) { + return this.setStart(node, 0).setEndAtLast(node); + }, + + /** + * clone当前Range对象 + * @method cloneRange + * @remind 返回的range是一个全新的range对象, 其内部所有属性与当前被clone的range相同。 + * @return { UE.dom.Range } 当前range对象的一个副本 + */ + cloneRange: function () { + var me = this; + return new Range(me.document).setStart(me.startContainer, me.startOffset).setEnd(me.endContainer, me.endOffset); + + }, + + /** + * 向当前选区的结束处闭合选区 + * @method collapse + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * xxxxx[xx]xxxx + * + * + * ``` + */ + + /** + * 闭合当前选区,根据给定的toStart参数项决定是向当前选区开始处闭合还是向结束处闭合, + * 如果toStart的值为true,则向开始位置闭合, 反之,向结束位置闭合。 + * @method collapse + * @param { Boolean } toStart 是否向选区开始处闭合 + * @return { UE.dom.Range } 当前range对象,此时range对象处于闭合状态 + * @see UE.dom.Range:collapse() + * @example + * ```html + * + * xxxxx[xx]xxxx + * + * + * ``` + */ + collapse: function (toStart) { + var me = this; + if (toStart) { + me.endContainer = me.startContainer; + me.endOffset = me.startOffset; + } else { + me.startContainer = me.endContainer; + me.startOffset = me.endOffset; + } + me.collapsed = true; + return me; + }, + + /** + * 调整range的开始位置和结束位置,使其"收缩"到最小的位置 + * @method shrinkBoundary + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * xxxx[xxxxx] => xxxx[xxxxx] + * ``` + * + * @example + * ```html + * + * x[xx]xxx + * + * + * ``` + * + * @example + * ```html + * [xxxxxxxxxxx] => [xxxxxxxxxxx] + * ``` + */ + + /** + * 调整range的开始位置和结束位置,使其"收缩"到最小的位置, + * 如果ignoreEnd的值为true,则忽略对结束位置的调整 + * @method shrinkBoundary + * @param { Boolean } ignoreEnd 是否忽略对结束位置的调整 + * @return { UE.dom.Range } 当前range对象 + * @see UE.dom.domUtils.Range:shrinkBoundary() + */ + shrinkBoundary: function (ignoreEnd) { + var me = this, child, + collapsed = me.collapsed; + + function check(node) { + return node.nodeType == 1 && !domUtils.isBookmarkNode(node) && !dtd.$empty[node.tagName] && !dtd.$nonChild[node.tagName] + } + + while (me.startContainer.nodeType == 1 //是element + && (child = me.startContainer.childNodes[me.startOffset]) //子节点也是element + && check(child)) { + me.setStart(child, 0); + } + if (collapsed) { + return me.collapse(true); + } + if (!ignoreEnd) { + while (me.endContainer.nodeType == 1//是element + && me.endOffset > 0 //如果是空元素就退出 endOffset=0那么endOffst-1为负值,childNodes[endOffset]报错 + && (child = me.endContainer.childNodes[me.endOffset - 1]) //子节点也是element + && check(child)) { + me.setEnd(child, child.childNodes.length); + } + } + return me; + }, + + /** + * 获取离当前选区内包含的所有节点最近的公共祖先节点, + * @method getCommonAncestor + * @remind 返回的公共祖先节点一定不是range自身的容器节点, 但有可能是一个文本节点 + * @return { Node } 当前range对象内所有节点的公共祖先节点 + * @example + * ```html + * //选区示例 + * xxxx[xxx]xxxxxx + * + * ``` + */ + + /** + * 获取当前选区所包含的所有节点的公共祖先节点, 可以根据给定的参数 includeSelf 决定获取到 + * 的公共祖先节点是否可以是当前选区的startContainer或endContainer节点, 如果 includeSelf + * 的取值为true, 则返回的节点可以是自身的容器节点, 否则, 则不能是容器节点 + * @method getCommonAncestor + * @param { Boolean } includeSelf 是否允许获取到的公共祖先节点是当前range对象的容器节点 + * @return { Node } 当前range对象内所有节点的公共祖先节点 + * @see UE.dom.Range:getCommonAncestor() + * @example + * ```html + * + * + * + * xxxxxxxxx[xxx]xxxxxxxx + * + * + * + * + * ``` + */ + + /** + * 获取当前选区所包含的所有节点的公共祖先节点, 可以根据给定的参数 includeSelf 决定获取到 + * 的公共祖先节点是否可以是当前选区的startContainer或endContainer节点, 如果 includeSelf + * 的取值为true, 则返回的节点可以是自身的容器节点, 否则, 则不能是容器节点; 同时可以根据 + * ignoreTextNode 参数的取值决定是否忽略类型为文本节点的祖先节点。 + * @method getCommonAncestor + * @param { Boolean } includeSelf 是否允许获取到的公共祖先节点是当前range对象的容器节点 + * @param { Boolean } ignoreTextNode 获取祖先节点的过程中是否忽略类型为文本节点的祖先节点 + * @return { Node } 当前range对象内所有节点的公共祖先节点 + * @see UE.dom.Range:getCommonAncestor() + * @see UE.dom.Range:getCommonAncestor(Boolean) + * @example + * ```html + * + * + * + * xxxxxxxx[x]xxxxxxxxxxx + * + * + * + * + * ``` + */ + getCommonAncestor: function (includeSelf, ignoreTextNode) { + var me = this, + start = me.startContainer, + end = me.endContainer; + if (start === end) { + if (includeSelf && selectOneNode(this)) { + start = start.childNodes[me.startOffset]; + if (start.nodeType == 1) + return start; + } + //只有在上来就相等的情况下才会出现是文本的情况 + return ignoreTextNode && start.nodeType == 3 ? start.parentNode : start; + } + return domUtils.getCommonAncestor(start, end); + }, + + /** + * 调整当前Range的开始和结束边界容器,如果是容器节点是文本节点,就调整到包含该文本节点的父节点上 + * @method trimBoundary + * @remind 该操作有可能会引起文本节点被切开 + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * //选区示例 + * xxx[xxxxx]xxx + * + * + * ``` + */ + + /** + * 调整当前Range的开始和结束边界容器,如果是容器节点是文本节点,就调整到包含该文本节点的父节点上, + * 可以根据 ignoreEnd 参数的值决定是否调整对结束边界的调整 + * @method trimBoundary + * @param { Boolean } ignoreEnd 是否忽略对结束边界的调整 + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * //选区示例 + * xxx[xxxxx]xxx + * + * + * ``` + */ + trimBoundary: function (ignoreEnd) { + this.txtToElmBoundary(); + var start = this.startContainer, + offset = this.startOffset, + collapsed = this.collapsed, + end = this.endContainer; + if (start.nodeType == 3) { + if (offset == 0) { + this.setStartBefore(start); + } else { + if (offset >= start.nodeValue.length) { + this.setStartAfter(start); + } else { + var textNode = domUtils.split(start, offset); + //跟新结束边界 + if (start === end) { + this.setEnd(textNode, this.endOffset - offset); + } else if (start.parentNode === end) { + this.endOffset += 1; + } + this.setStartBefore(textNode); + } + } + if (collapsed) { + return this.collapse(true); + } + } + if (!ignoreEnd) { + offset = this.endOffset; + end = this.endContainer; + if (end.nodeType == 3) { + if (offset == 0) { + this.setEndBefore(end); + } else { + offset < end.nodeValue.length && domUtils.split(end, offset); + this.setEndAfter(end); + } + } + } + return this; + }, + + /** + * 如果选区在文本的边界上,就扩展选区到文本的父节点上, 如果当前选区是闭合的, 则什么也不做 + * @method txtToElmBoundary + * @remind 该操作不会修改dom节点 + * @return { UE.dom.Range } 当前range对象 + */ + + /** + * 如果选区在文本的边界上,就扩展选区到文本的父节点上, 如果当前选区是闭合的, 则根据参数项 + * ignoreCollapsed 的值决定是否执行该调整 + * @method txtToElmBoundary + * @param { Boolean } ignoreCollapsed 是否忽略选区的闭合状态, 如果该参数取值为true, 则 + * 不论选区是否闭合, 都会执行该操作, 反之, 则不会对闭合的选区执行该操作 + * @return { UE.dom.Range } 当前range对象 + */ + txtToElmBoundary: function (ignoreCollapsed) { + function adjust(r, c) { + var container = r[c + 'Container'], + offset = r[c + 'Offset']; + if (container.nodeType == 3) { + if (!offset) { + r['set' + c.replace(/(\w)/, function (a) { + return a.toUpperCase(); + }) + 'Before'](container); + } else if (offset >= container.nodeValue.length) { + r['set' + c.replace(/(\w)/, function (a) { + return a.toUpperCase(); + }) + 'After'](container); + } + } + } + + if (ignoreCollapsed || !this.collapsed) { + adjust(this, 'start'); + adjust(this, 'end'); + } + return this; + }, + + /** + * 在当前选区的开始位置前插入节点,新插入的节点会被该range包含 + * @method insertNode + * @param { Node } node 需要插入的节点 + * @remind 插入的节点可以是一个DocumentFragment依次插入多个节点 + * @return { UE.dom.Range } 当前range对象 + */ + insertNode: function (node) { + var first = node, length = 1; + if (node.nodeType == 11) { + first = node.firstChild; + length = node.childNodes.length; + } + this.trimBoundary(true); + var start = this.startContainer, + offset = this.startOffset; + var nextNode = start.childNodes[offset]; + if (nextNode) { + start.insertBefore(node, nextNode); + } else { + start.appendChild(node); + } + if (first.parentNode === this.endContainer) { + this.endOffset = this.endOffset + length; + } + return this.setStartBefore(first); + }, + + /** + * 闭合选区到当前选区的开始位置, 并且定位光标到闭合后的位置 + * @method setCursor + * @return { UE.dom.Range } 当前range对象 + * @see UE.dom.Range:collapse() + */ + + /** + * 闭合选区,可以根据参数toEnd的值控制选区是向前闭合还是向后闭合, 并且定位光标到闭合后的位置。 + * @method setCursor + * @param { Boolean } toEnd 是否向后闭合, 如果为true, 则闭合选区时, 将向结束容器方向闭合, + * 反之,则向开始容器方向闭合 + * @return { UE.dom.Range } 当前range对象 + * @see UE.dom.Range:collapse(Boolean) + */ + setCursor: function (toEnd, noFillData) { + return this.collapse(!toEnd).select(noFillData); + }, + + /** + * 创建当前range的一个书签,记录下当前range的位置,方便当dom树改变时,还能找回原来的选区位置 + * @method createBookmark + * @param { Boolean } serialize 控制返回的标记位置是对当前位置的引用还是ID,如果该值为true,则 + * 返回标记位置的ID, 反之则返回标记位置节点的引用 + * @return { Object } 返回一个书签记录键值对, 其包含的key有: start => 开始标记的ID或者引用, + * end => 结束标记的ID或引用, id => 当前标记的类型, 如果为true,则表示 + * 返回的记录的类型为ID, 反之则为引用 + */ + createBookmark: function (serialize, same) { + var endNode, + startNode = this.document.createElement('span'); + startNode.style.cssText = 'display:none;line-height:0px;'; + startNode.appendChild(this.document.createTextNode('\u200D')); + startNode.id = '_baidu_bookmark_start_' + (same ? '' : guid++); + + if (!this.collapsed) { + endNode = startNode.cloneNode(true); + endNode.id = '_baidu_bookmark_end_' + (same ? '' : guid++); + } + this.insertNode(startNode); + if (endNode) { + this.collapse().insertNode(endNode).setEndBefore(endNode); + } + this.setStartAfter(startNode); + return { + start: serialize ? startNode.id : startNode, + end: endNode ? serialize ? endNode.id : endNode : null, + id: serialize + } + }, + + /** + * 调整当前range的边界到书签位置,并删除该书签对象所标记的位置内的节点 + * @method moveToBookmark + * @param { BookMark } bookmark createBookmark所创建的标签对象 + * @return { UE.dom.Range } 当前range对象 + * @see UE.dom.Range:createBookmark(Boolean) + */ + moveToBookmark: function (bookmark) { + var start = bookmark.id ? this.document.getElementById(bookmark.start) : bookmark.start, + end = bookmark.end && bookmark.id ? this.document.getElementById(bookmark.end) : bookmark.end; + this.setStartBefore(start); + domUtils.remove(start); + if (end) { + this.setEndBefore(end); + domUtils.remove(end); + } else { + this.collapse(true); + } + return this; + }, + + /** + * 调整range的边界,使其"放大"到最近的父节点 + * @method enlarge + * @remind 会引起选区的变化 + * @return { UE.dom.Range } 当前range对象 + */ + + /** + * 调整range的边界,使其"放大"到最近的父节点,根据参数 toBlock 的取值, 可以 + * 要求扩大之后的父节点是block节点 + * @method enlarge + * @param { Boolean } toBlock 是否要求扩大之后的父节点必须是block节点 + * @return { UE.dom.Range } 当前range对象 + */ + enlarge: function (toBlock, stopFn) { + var isBody = domUtils.isBody, + pre, node, tmp = this.document.createTextNode(''); + if (toBlock) { + node = this.startContainer; + if (node.nodeType == 1) { + if (node.childNodes[this.startOffset]) { + pre = node = node.childNodes[this.startOffset] + } else { + node.appendChild(tmp); + pre = node = tmp; + } + } else { + pre = node; + } + while (1) { + if (domUtils.isBlockElm(node)) { + node = pre; + while ((pre = node.previousSibling) && !domUtils.isBlockElm(pre)) { + node = pre; + } + this.setStartBefore(node); + break; + } + pre = node; + node = node.parentNode; + } + node = this.endContainer; + if (node.nodeType == 1) { + if (pre = node.childNodes[this.endOffset]) { + node.insertBefore(tmp, pre); + } else { + node.appendChild(tmp); + } + pre = node = tmp; + } else { + pre = node; + } + while (1) { + if (domUtils.isBlockElm(node)) { + node = pre; + while ((pre = node.nextSibling) && !domUtils.isBlockElm(pre)) { + node = pre; + } + this.setEndAfter(node); + break; + } + pre = node; + node = node.parentNode; + } + if (tmp.parentNode === this.endContainer) { + this.endOffset--; + } + domUtils.remove(tmp); + } + + // 扩展边界到最大 + if (!this.collapsed) { + while (this.startOffset == 0) { + if (stopFn && stopFn(this.startContainer)) { + break; + } + if (isBody(this.startContainer)) { + break; + } + this.setStartBefore(this.startContainer); + } + while (this.endOffset == (this.endContainer.nodeType == 1 ? this.endContainer.childNodes.length : this.endContainer.nodeValue.length)) { + if (stopFn && stopFn(this.endContainer)) { + break; + } + if (isBody(this.endContainer)) { + break; + } + this.setEndAfter(this.endContainer); + } + } + return this; + }, + enlargeToBlockElm: function (ignoreEnd) { + while (!domUtils.isBlockElm(this.startContainer)) { + this.setStartBefore(this.startContainer); + } + if (!ignoreEnd) { + while (!domUtils.isBlockElm(this.endContainer)) { + this.setEndAfter(this.endContainer); + } + } + return this; + }, + /** + * 调整Range的边界,使其"缩小"到最合适的位置 + * @method adjustmentBoundary + * @return { UE.dom.Range } 当前range对象 + * @see UE.dom.Range:shrinkBoundary() + */ + adjustmentBoundary: function () { + if (!this.collapsed) { + while (!domUtils.isBody(this.startContainer) && + this.startOffset == this.startContainer[this.startContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length && + this.startContainer[this.startContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length + ) { + + this.setStartAfter(this.startContainer); + } + while (!domUtils.isBody(this.endContainer) && !this.endOffset && + this.endContainer[this.endContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length + ) { + this.setEndBefore(this.endContainer); + } + } + return this; + }, + + /** + * 给range选区中的内容添加给定的inline标签 + * @method applyInlineStyle + * @param { String } tagName 需要添加的标签名 + * @example + * ```html + *

      xxxx[xxxx]x

      ==> range.applyInlineStyle("strong") ==>

      xxxx[xxxx]x

      + * ``` + */ + + /** + * 给range选区中的内容添加给定的inline标签, 并且为标签附加上一些初始化属性。 + * @method applyInlineStyle + * @param { String } tagName 需要添加的标签名 + * @param { Object } attrs 跟随新添加的标签的属性 + * @return { UE.dom.Range } 当前选区 + * @example + * ```html + *

      xxxx[xxxx]x

      + * + * ==> + * + * + * range.applyInlineStyle("strong",{"style":"font-size:12px"}) + * + * ==> + * + *

      xxxx[xxxx]x

      + * ``` + */ + applyInlineStyle: function (tagName, attrs, list) { + if (this.collapsed) return this; + this.trimBoundary().enlarge(false, + function (node) { + return node.nodeType == 1 && domUtils.isBlockElm(node) + }).adjustmentBoundary(); + var bookmark = this.createBookmark(), + end = bookmark.end, + filterFn = function (node) { + return node.nodeType == 1 ? node.tagName.toLowerCase() != 'br' : !domUtils.isWhitespace(node); + }, + current = domUtils.getNextDomNode(bookmark.start, false, filterFn), + node, + pre, + range = this.cloneRange(); + while (current && (domUtils.getPosition(current, end) & domUtils.POSITION_PRECEDING)) { + if (current.nodeType == 3 || dtd[tagName][current.tagName]) { + range.setStartBefore(current); + node = current; + while (node && (node.nodeType == 3 || dtd[tagName][node.tagName]) && node !== end) { + pre = node; + node = domUtils.getNextDomNode(node, node.nodeType == 1, null, function (parent) { + return dtd[tagName][parent.tagName]; + }); + } + var frag = range.setEndAfter(pre).extractContents(), elm; + if (list && list.length > 0) { + var level, top; + top = level = list[0].cloneNode(false); + for (var i = 1, ci; ci = list[i++];) { + level.appendChild(ci.cloneNode(false)); + level = level.firstChild; + } + elm = level; + } else { + elm = range.document.createElement(tagName); + } + if (attrs) { + domUtils.setAttributes(elm, attrs); + } + elm.appendChild(frag); + range.insertNode(list ? top : elm); + //处理下滑线在a上的情况 + var aNode; + if (tagName == 'span' && attrs.style && /text\-decoration/.test(attrs.style) && (aNode = domUtils.findParentByTagName(elm, 'a', true))) { + domUtils.setAttributes(aNode, attrs); + domUtils.remove(elm, true); + elm = aNode; + } else { + domUtils.mergeSibling(elm); + domUtils.clearEmptySibling(elm); + } + //去除子节点相同的 + domUtils.mergeChild(elm, attrs); + current = domUtils.getNextDomNode(elm, false, filterFn); + domUtils.mergeToParent(elm); + if (node === end) { + break; + } + } else { + current = domUtils.getNextDomNode(current, true, filterFn); + } + } + return this.moveToBookmark(bookmark); + }, + + /** + * 移除当前选区内指定的inline标签,但保留其中的内容 + * @method removeInlineStyle + * @param { String } tagName 需要移除的标签名 + * @return { UE.dom.Range } 当前的range对象 + * @example + * ```html + * xx[xxxxyyyzz]z => range.removeInlineStyle(["em"]) => xx[xxxxyyyzz]z + * ``` + */ + + /** + * 移除当前选区内指定的一组inline标签,但保留其中的内容 + * @method removeInlineStyle + * @param { Array } tagNameArr 需要移除的标签名的数组 + * @return { UE.dom.Range } 当前的range对象 + * @see UE.dom.Range:removeInlineStyle(String) + */ + removeInlineStyle: function (tagNames) { + if (this.collapsed) return this; + tagNames = utils.isArray(tagNames) ? tagNames : [tagNames]; + this.shrinkBoundary().adjustmentBoundary(); + var start = this.startContainer, end = this.endContainer; + while (1) { + if (start.nodeType == 1) { + if (utils.indexOf(tagNames, start.tagName.toLowerCase()) > -1) { + break; + } + if (start.tagName.toLowerCase() == 'body') { + start = null; + break; + } + } + start = start.parentNode; + } + while (1) { + if (end.nodeType == 1) { + if (utils.indexOf(tagNames, end.tagName.toLowerCase()) > -1) { + break; + } + if (end.tagName.toLowerCase() == 'body') { + end = null; + break; + } + } + end = end.parentNode; + } + var bookmark = this.createBookmark(), + frag, + tmpRange; + if (start) { + tmpRange = this.cloneRange().setEndBefore(bookmark.start).setStartBefore(start); + frag = tmpRange.extractContents(); + tmpRange.insertNode(frag); + domUtils.clearEmptySibling(start, true); + start.parentNode.insertBefore(bookmark.start, start); + } + if (end) { + tmpRange = this.cloneRange().setStartAfter(bookmark.end).setEndAfter(end); + frag = tmpRange.extractContents(); + tmpRange.insertNode(frag); + domUtils.clearEmptySibling(end, false, true); + end.parentNode.insertBefore(bookmark.end, end.nextSibling); + } + var current = domUtils.getNextDomNode(bookmark.start, false, function (node) { + return node.nodeType == 1; + }), next; + while (current && current !== bookmark.end) { + next = domUtils.getNextDomNode(current, true, function (node) { + return node.nodeType == 1; + }); + if (utils.indexOf(tagNames, current.tagName.toLowerCase()) > -1) { + domUtils.remove(current, true); + } + current = next; + } + return this.moveToBookmark(bookmark); + }, + + /** + * 获取当前选中的自闭合的节点 + * @method getClosedNode + * @return { Node | NULL } 如果当前选中的是自闭合节点, 则返回该节点, 否则返回NULL + */ + getClosedNode: function () { + var node; + if (!this.collapsed) { + var range = this.cloneRange().adjustmentBoundary().shrinkBoundary(); + if (selectOneNode(range)) { + var child = range.startContainer.childNodes[range.startOffset]; + if (child && child.nodeType == 1 && (dtd.$empty[child.tagName] || dtd.$nonChild[child.tagName])) { + node = child; + } + } + } + return node; + }, + + /** + * 在页面上高亮range所表示的选区 + * @method select + * @return { UE.dom.Range } 返回当前Range对象 + */ + //这里不区分ie9以上,trace:3824 + select: browser.ie ? function (noFillData, textRange) { + var nativeRange; + if (!this.collapsed) + this.shrinkBoundary(); + var node = this.getClosedNode(); + if (node && !textRange) { + try { + nativeRange = this.document.body.createControlRange(); + nativeRange.addElement(node); + nativeRange.select(); + } catch (e) { + } + return this; + } + var bookmark = this.createBookmark(), + start = bookmark.start, + end; + nativeRange = this.document.body.createTextRange(); + nativeRange.moveToElementText(start); + nativeRange.moveStart('character', 1); + if (!this.collapsed) { + var nativeRangeEnd = this.document.body.createTextRange(); + end = bookmark.end; + nativeRangeEnd.moveToElementText(end); + nativeRange.setEndPoint('EndToEnd', nativeRangeEnd); + } else { + if (!noFillData && this.startContainer.nodeType != 3) { + //使用|x固定住光标 + var tmpText = this.document.createTextNode(fillChar), + tmp = this.document.createElement('span'); + tmp.appendChild(this.document.createTextNode(fillChar)); + start.parentNode.insertBefore(tmp, start); + start.parentNode.insertBefore(tmpText, start); + //当点b,i,u时,不能清除i上边的b + removeFillData(this.document, tmpText); + fillData = tmpText; + mergeSibling(tmp, 'previousSibling'); + mergeSibling(start, 'nextSibling'); + nativeRange.moveStart('character', -1); + nativeRange.collapse(true); + } + } + this.moveToBookmark(bookmark); + tmp && domUtils.remove(tmp); + //IE在隐藏状态下不支持range操作,catch一下 + try { + nativeRange.select(); + } catch (e) { + } + return this; + } : function (notInsertFillData) { + function checkOffset(rng) { + + function check(node, offset, dir) { + if (node.nodeType == 3 && node.nodeValue.length < offset) { + rng[dir + 'Offset'] = node.nodeValue.length + } + } + + check(rng.startContainer, rng.startOffset, 'start'); + check(rng.endContainer, rng.endOffset, 'end'); + } + + var win = domUtils.getWindow(this.document), + sel = win.getSelection(), + txtNode; + //FF下关闭自动长高时滚动条在关闭dialog时会跳 + //ff下如果不body.focus将不能定位闭合光标到编辑器内 + browser.gecko ? this.document.body.focus() : win.focus(); + if (sel) { + sel.removeAllRanges(); + // trace:870 chrome/safari后边是br对于闭合得range不能定位 所以去掉了判断 + // this.startContainer.nodeType != 3 &&! ((child = this.startContainer.childNodes[this.startOffset]) && child.nodeType == 1 && child.tagName == 'BR' + if (this.collapsed && !notInsertFillData) { +// //opear如果没有节点接着,原生的不能够定位,不能在body的第一级插入空白节点 +// if (notInsertFillData && browser.opera && !domUtils.isBody(this.startContainer) && this.startContainer.nodeType == 1) { +// var tmp = this.document.createTextNode(''); +// this.insertNode(tmp).setStart(tmp, 0).collapse(true); +// } +// + //处理光标落在文本节点的情况 + //处理以下的情况 + //|xxxx + //xxxx|xxxx + //xxxx| + var start = this.startContainer, child = start; + if (start.nodeType == 1) { + child = start.childNodes[this.startOffset]; + + } + if (!(start.nodeType == 3 && this.startOffset) && + (child ? + (!child.previousSibling || child.previousSibling.nodeType != 3) + : + (!start.lastChild || start.lastChild.nodeType != 3) + ) + ) { + txtNode = this.document.createTextNode(fillChar); + //跟着前边走 + this.insertNode(txtNode); + removeFillData(this.document, txtNode); + mergeSibling(txtNode, 'previousSibling'); + mergeSibling(txtNode, 'nextSibling'); + fillData = txtNode; + this.setStart(txtNode, browser.webkit ? 1 : 0).collapse(true); + } + } + var nativeRange = this.document.createRange(); + if (this.collapsed && browser.opera && this.startContainer.nodeType == 1) { + var child = this.startContainer.childNodes[this.startOffset]; + if (!child) { + //往前靠拢 + child = this.startContainer.lastChild; + if (child && domUtils.isBr(child)) { + this.setStartBefore(child).collapse(true); + } + } else { + //向后靠拢 + while (child && domUtils.isBlockElm(child)) { + if (child.nodeType == 1 && child.childNodes[0]) { + child = child.childNodes[0] + } else { + break; + } + } + child && this.setStartBefore(child).collapse(true) + } + + } + //是createAddress最后一位算的不准,现在这里进行微调 + checkOffset(this); + nativeRange.setStart(this.startContainer, this.startOffset); + nativeRange.setEnd(this.endContainer, this.endOffset); + sel.addRange(nativeRange); + } + return this; + }, + + /** + * 滚动到当前range开始的位置 + * @method scrollToView + * @param { Window } win 当前range对象所属的window对象 + * @return { UE.dom.Range } 当前Range对象 + */ + + /** + * 滚动到距离当前range开始位置 offset 的位置处 + * @method scrollToView + * @param { Window } win 当前range对象所属的window对象 + * @param { Number } offset 距离range开始位置处的偏移量, 如果为正数, 则向下偏移, 反之, 则向上偏移 + * @return { UE.dom.Range } 当前Range对象 + */ + scrollToView: function (win, offset) { + win = win ? window : domUtils.getWindow(this.document); + var me = this, + span = me.document.createElement('span'); + //trace:717 + span.innerHTML = ' '; + me.cloneRange().insertNode(span); + domUtils.scrollToView(span, win, offset); + domUtils.remove(span); + return me; + }, + + /** + * 判断当前选区内容是否占位符 + * @private + * @method inFillChar + * @return { Boolean } 如果是占位符返回true,否则返回false + */ + inFillChar: function () { + var start = this.startContainer; + if (this.collapsed && start.nodeType == 3 + && start.nodeValue.replace(new RegExp('^' + domUtils.fillChar), '').length + 1 == start.nodeValue.length + ) { + return true; + } + return false; + }, + + /** + * 保存 + * @method createAddress + * @private + * @return { Boolean } 返回开始和结束的位置 + * @example + * ```html + * + *

      + * aaaa + * + * + * bbbb + * + * + *

      + * + * + * + * ``` + */ + createAddress: function (ignoreEnd, ignoreTxt) { + var addr = {}, me = this; + + function getAddress(isStart) { + var node = isStart ? me.startContainer : me.endContainer; + var parents = domUtils.findParents(node, true, function (node) { + return !domUtils.isBody(node) + }), + addrs = []; + for (var i = 0, ci; ci = parents[i++];) { + addrs.push(domUtils.getNodeIndex(ci, ignoreTxt)); + } + var firstIndex = 0; + + if (ignoreTxt) { + if (node.nodeType == 3) { + var tmpNode = node.previousSibling; + while (tmpNode && tmpNode.nodeType == 3) { + firstIndex += tmpNode.nodeValue.replace(fillCharReg, '').length; + tmpNode = tmpNode.previousSibling; + } + firstIndex += (isStart ? me.startOffset : me.endOffset)// - (fillCharReg.test(node.nodeValue) ? 1 : 0 ) + } else { + node = node.childNodes[isStart ? me.startOffset : me.endOffset]; + if (node) { + firstIndex = domUtils.getNodeIndex(node, ignoreTxt); + } else { + node = isStart ? me.startContainer : me.endContainer; + var first = node.firstChild; + while (first) { + if (domUtils.isFillChar(first)) { + first = first.nextSibling; + continue; + } + firstIndex++; + if (first.nodeType == 3) { + while (first && first.nodeType == 3) { + first = first.nextSibling; + } + } else { + first = first.nextSibling; + } + } + } + } + + } else { + firstIndex = isStart ? domUtils.isFillChar(node) ? 0 : me.startOffset : me.endOffset + } + if (firstIndex < 0) { + firstIndex = 0; + } + addrs.push(firstIndex); + return addrs; + } + + addr.startAddress = getAddress(true); + if (!ignoreEnd) { + addr.endAddress = me.collapsed ? [].concat(addr.startAddress) : getAddress(); + } + return addr; + }, + + /** + * 保存 + * @method createAddress + * @private + * @return { Boolean } 返回开始和结束的位置 + * @example + * ```html + * + *

      + * aaaa + * + * + * bbbb + * + * + *

      + * + * + * + * ``` + */ + moveToAddress: function (addr, ignoreEnd) { + var me = this; + + function getNode(address, isStart) { + var tmpNode = me.document.body, + parentNode, offset; + for (var i = 0, ci, l = address.length; i < l; i++) { + ci = address[i]; + parentNode = tmpNode; + tmpNode = tmpNode.childNodes[ci]; + if (!tmpNode) { + offset = ci; + break; + } + } + if (isStart) { + if (tmpNode) { + me.setStartBefore(tmpNode) + } else { + me.setStart(parentNode, offset) + } + } else { + if (tmpNode) { + me.setEndBefore(tmpNode) + } else { + me.setEnd(parentNode, offset) + } + } + } + + getNode(addr.startAddress, true); + !ignoreEnd && addr.endAddress && getNode(addr.endAddress); + return me; + }, + + /** + * 判断给定的Range对象是否和当前Range对象表示的是同一个选区 + * @method equals + * @param { UE.dom.Range } 需要判断的Range对象 + * @return { Boolean } 如果给定的Range对象与当前Range对象表示的是同一个选区, 则返回true, 否则返回false + */ + equals: function (rng) { + for (var p in this) { + if (this.hasOwnProperty(p)) { + if (this[p] !== rng[p]) + return false + } + } + return true; + + }, + + /** + * 遍历range内的节点。每当遍历一个节点时, 都会执行参数项 doFn 指定的函数, 该函数的接受当前遍历的节点 + * 作为其参数。 + * @method traversal + * @param { Function } doFn 对每个遍历的节点要执行的方法, 该方法接受当前遍历的节点作为其参数 + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * + * + * + * + * + * + * + * + * + * ``` + */ + + /** + * 遍历range内的节点。 + * 每当遍历一个节点时, 都会执行参数项 doFn 指定的函数, 该函数的接受当前遍历的节点 + * 作为其参数。 + * 可以通过参数项 filterFn 来指定一个过滤器, 只有符合该过滤器过滤规则的节点才会触 + * 发doFn函数的执行 + * @method traversal + * @param { Function } doFn 对每个遍历的节点要执行的方法, 该方法接受当前遍历的节点作为其参数 + * @param { Function } filterFn 过滤器, 该函数接受当前遍历的节点作为参数, 如果该节点满足过滤 + * 规则, 请返回true, 该节点会触发doFn, 否则, 请返回false, 则该节点不 + * 会触发doFn。 + * @return { UE.dom.Range } 当前range对象 + * @see UE.dom.Range:traversal(Function) + * @example + * ```html + * + * + * + * + * + * + * + * + * + * + * ``` + */ + traversal: function (doFn, filterFn) { + if (this.collapsed) + return this; + var bookmark = this.createBookmark(), + end = bookmark.end, + current = domUtils.getNextDomNode(bookmark.start, false, filterFn); + while (current && current !== end && (domUtils.getPosition(current, end) & domUtils.POSITION_PRECEDING)) { + var tmpNode = domUtils.getNextDomNode(current, false, filterFn); + doFn(current); + current = tmpNode; + } + return this.moveToBookmark(bookmark); + } + }; + })(); + +// core/Selection.js + /** + * 选集 + * @file + * @module UE.dom + * @class Selection + * @since 1.2.6.1 + */ + + /** + * 选区集合 + * @unfile + * @module UE.dom + * @class Selection + */ + (function () { + + function getBoundaryInformation(range, start) { + var getIndex = domUtils.getNodeIndex; + range = range.duplicate(); + range.collapse(start); + var parent = range.parentElement(); + //如果节点里没有子节点,直接退出 + if (!parent.hasChildNodes()) { + return {container: parent, offset: 0}; + } + var siblings = parent.children, + child, + testRange = range.duplicate(), + startIndex = 0, endIndex = siblings.length - 1, index = -1, + distance; + while (startIndex <= endIndex) { + index = Math.floor((startIndex + endIndex) / 2); + child = siblings[index]; + testRange.moveToElementText(child); + var position = testRange.compareEndPoints('StartToStart', range); + if (position > 0) { + endIndex = index - 1; + } else if (position < 0) { + startIndex = index + 1; + } else { + //trace:1043 + return {container: parent, offset: getIndex(child)}; + } + } + if (index == -1) { + testRange.moveToElementText(parent); + testRange.setEndPoint('StartToStart', range); + distance = testRange.text.replace(/(\r\n|\r)/g, '\n').length; + siblings = parent.childNodes; + if (!distance) { + child = siblings[siblings.length - 1]; + return {container: child, offset: child.nodeValue.length}; + } + + var i = siblings.length; + while (distance > 0) { + distance -= siblings[--i].nodeValue.length; + } + return {container: siblings[i], offset: -distance}; + } + testRange.collapse(position > 0); + testRange.setEndPoint(position > 0 ? 'StartToStart' : 'EndToStart', range); + distance = testRange.text.replace(/(\r\n|\r)/g, '\n').length; + if (!distance) { + return dtd.$empty[child.tagName] || dtd.$nonChild[child.tagName] ? + {container: parent, offset: getIndex(child) + (position > 0 ? 0 : 1)} : + {container: child, offset: position > 0 ? 0 : child.childNodes.length} + } + while (distance > 0) { + try { + var pre = child; + child = child[position > 0 ? 'previousSibling' : 'nextSibling']; + distance -= child.nodeValue.length; + } catch (e) { + return {container: parent, offset: getIndex(pre)}; + } + } + return {container: child, offset: position > 0 ? -distance : child.nodeValue.length + distance} + } + + /** + * 将ieRange转换为Range对象 + * @param {Range} ieRange ieRange对象 + * @param {Range} range Range对象 + * @return {Range} range 返回转换后的Range对象 + */ + function transformIERangeToRange(ieRange, range) { + if (ieRange.item) { + range.selectNode(ieRange.item(0)); + } else { + var bi = getBoundaryInformation(ieRange, true); + range.setStart(bi.container, bi.offset); + if (ieRange.compareEndPoints('StartToEnd', ieRange) != 0) { + bi = getBoundaryInformation(ieRange, false); + range.setEnd(bi.container, bi.offset); + } + } + return range; + } + + /** + * 获得ieRange + * @param {Selection} sel Selection对象 + * @return {ieRange} 得到ieRange + */ + function _getIERange(sel) { + var ieRange; + //ie下有可能报错 + try { + ieRange = sel.getNative().createRange(); + } catch (e) { + return null; + } + var el = ieRange.item ? ieRange.item(0) : ieRange.parentElement(); + if ((el.ownerDocument || el) === sel.document) { + return ieRange; + } + return null; + } + + var Selection = dom.Selection = function (doc) { + var me = this, iframe; + me.document = doc; + if (browser.ie9below) { + iframe = domUtils.getWindow(doc).frameElement; + domUtils.on(iframe, 'beforedeactivate', function () { + me._bakIERange = me.getIERange(); + }); + domUtils.on(iframe, 'activate', function () { + try { + if (!_getIERange(me) && me._bakIERange) { + me._bakIERange.select(); + } + } catch (ex) { + } + me._bakIERange = null; + }); + } + iframe = doc = null; + }; + + Selection.prototype = { + + rangeInBody: function (rng, txtRange) { + var node = browser.ie9below || txtRange ? rng.item ? rng.item() : rng.parentElement() : rng.startContainer; + + return node === this.document.body || domUtils.inDoc(node, this.document); + }, + + /** + * 获取原生seleciton对象 + * @method getNative + * @return { Object } 获得selection对象 + * @example + * ```javascript + * editor.selection.getNative(); + * ``` + */ + getNative: function () { + var doc = this.document; + try { + return !doc ? null : browser.ie9below ? doc.selection : domUtils.getWindow(doc).getSelection(); + } catch (e) { + return null; + } + }, + + /** + * 获得ieRange + * @method getIERange + * @return { Object } 返回ie原生的Range + * @example + * ```javascript + * editor.selection.getIERange(); + * ``` + */ + getIERange: function () { + var ieRange = _getIERange(this); + if (!ieRange) { + if (this._bakIERange) { + return this._bakIERange; + } + } + return ieRange; + }, + + /** + * 缓存当前选区的range和选区的开始节点 + * @method cache + */ + cache: function () { + this.clear(); + this._cachedRange = this.getRange(); + this._cachedStartElement = this.getStart(); + this._cachedStartElementPath = this.getStartElementPath(); + }, + + /** + * 获取选区开始位置的父节点到body + * @method getStartElementPath + * @return { Array } 返回父节点集合 + * @example + * ```javascript + * editor.selection.getStartElementPath(); + * ``` + */ + getStartElementPath: function () { + if (this._cachedStartElementPath) { + return this._cachedStartElementPath; + } + var start = this.getStart(); + if (start) { + return domUtils.findParents(start, true, null, true) + } + return []; + }, + + /** + * 清空缓存 + * @method clear + */ + clear: function () { + this._cachedStartElementPath = this._cachedRange = this._cachedStartElement = null; + }, + + /** + * 编辑器是否得到了选区 + * @method isFocus + */ + isFocus: function () { + try { + if (browser.ie9below) { + + var nativeRange = _getIERange(this); + return !!(nativeRange && this.rangeInBody(nativeRange)); + } else { + return !!this.getNative().rangeCount; + } + } catch (e) { + return false; + } + + }, + + /** + * 获取选区对应的Range + * @method getRange + * @return { Object } 得到Range对象 + * @example + * ```javascript + * editor.selection.getRange(); + * ``` + */ + getRange: function () { + var me = this; + + function optimze(range) { + var child = me.document.body.firstChild, + collapsed = range.collapsed; + while (child && child.firstChild) { + range.setStart(child, 0); + child = child.firstChild; + } + if (!range.startContainer) { + range.setStart(me.document.body, 0) + } + if (collapsed) { + range.collapse(true); + } + } + + if (me._cachedRange != null) { + return this._cachedRange; + } + var range = new baidu.editor.dom.Range(me.document); + + if (browser.ie9below) { + var nativeRange = me.getIERange(); + if (nativeRange) { + //备份的_bakIERange可能已经实效了,dom树发生了变化比如从源码模式切回来,所以try一下,实效就放到body开始位置 + try { + transformIERangeToRange(nativeRange, range); + } catch (e) { + optimze(range); + } + + } else { + optimze(range); + } + } else { + var sel = me.getNative(); + if (sel && sel.rangeCount) { + var firstRange = sel.getRangeAt(0); + var lastRange = sel.getRangeAt(sel.rangeCount - 1); + range.setStart(firstRange.startContainer, firstRange.startOffset).setEnd(lastRange.endContainer, lastRange.endOffset); + if (range.collapsed && domUtils.isBody(range.startContainer) && !range.startOffset) { + optimze(range); + } + } else { + //trace:1734 有可能已经不在dom树上了,标识的节点 + if (this._bakRange && domUtils.inDoc(this._bakRange.startContainer, this.document)) { + return this._bakRange; + } + optimze(range); + } + } + return this._bakRange = range; + }, + + /** + * 获取开始元素,用于状态反射 + * @method getStart + * @return { Element } 获得开始元素 + * @example + * ```javascript + * editor.selection.getStart(); + * ``` + */ + getStart: function () { + if (this._cachedStartElement) { + return this._cachedStartElement; + } + var range = browser.ie9below ? this.getIERange() : this.getRange(), + tmpRange, + start, tmp, parent; + if (browser.ie9below) { + if (!range) { + //todo 给第一个值可能会有问题 + return this.document.body.firstChild; + } + //control元素 + if (range.item) { + return range.item(0); + } + tmpRange = range.duplicate(); + //修正ie下x[xx] 闭合后 x|xx + tmpRange.text.length > 0 && tmpRange.moveStart('character', 1); + tmpRange.collapse(1); + start = tmpRange.parentElement(); + parent = tmp = range.parentElement(); + while (tmp = tmp.parentNode) { + if (tmp == start) { + start = parent; + break; + } + } + } else { + range.shrinkBoundary(); + start = range.startContainer; + if (start.nodeType == 1 && start.hasChildNodes()) { + start = start.childNodes[Math.min(start.childNodes.length - 1, range.startOffset)]; + } + if (start.nodeType == 3) { + return start.parentNode; + } + } + return start; + }, + + /** + * 得到选区中的文本 + * @method getText + * @return { String } 选区中包含的文本 + * @example + * ```javascript + * editor.selection.getText(); + * ``` + */ + getText: function () { + var nativeSel, nativeRange; + if (this.isFocus() && (nativeSel = this.getNative())) { + nativeRange = browser.ie9below ? nativeSel.createRange() : nativeSel.getRangeAt(0); + return browser.ie9below ? nativeRange.text : nativeRange.toString(); + } + return ''; + }, + + /** + * 清除选区 + * @method clearRange + * @example + * ```javascript + * editor.selection.clearRange(); + * ``` + */ + clearRange: function () { + this.getNative()[browser.ie9below ? 'empty' : 'removeAllRanges'](); + } + }; + })(); + +// core/Editor.js + /** + * 编辑器主类,包含编辑器提供的大部分公用接口 + * @file + * @module UE + * @class Editor + * @since 1.2.6.1 + */ + + /** + * UEditor公用空间,UEditor所有的功能都挂载在该空间下 + * @unfile + * @module UE + */ + + /** + * UEditor的核心类,为用户提供与编辑器交互的接口。 + * @unfile + * @module UE + * @class Editor + */ + + (function () { + var uid = 0, _selectionChangeTimer; + + /** + * 获取编辑器的html内容,赋值到编辑器所在表单的textarea文本域里面 + * @private + * @method setValue + * @param { UE.Editor } editor 编辑器事例 + */ + function setValue(form, editor) { + var textarea; + if (editor.textarea) { + if (utils.isString(editor.textarea)) { + for (var i = 0, ti, tis = domUtils.getElementsByTagName(form, 'textarea'); ti = tis[i++];) { + if (ti.id == 'ueditor_textarea_' + editor.options.textarea) { + textarea = ti; + break; + } + } + } else { + textarea = editor.textarea; + } + } + if (!textarea) { + form.appendChild(textarea = domUtils.createElement(document, 'textarea', { + 'name': editor.options.textarea, + 'id': 'ueditor_textarea_' + editor.options.textarea, + 'style': "display:none" + })); + //不要产生多个textarea + editor.textarea = textarea; + } + !textarea.getAttribute('name') && textarea.setAttribute('name', editor.options.textarea); + textarea.value = editor.hasContents() ? + (editor.options.allHtmlEnabled ? editor.getAllHtml() : editor.getContent(null, null, true)) : + '' + } + + function loadPlugins(me) { + //初始化插件 + for (var pi in UE.plugins) { + UE.plugins[pi].call(me); + } + + } + + function checkCurLang(I18N) { + for (var lang in I18N) { + return lang + } + } + + function langReadied(me) { + me.langIsReady = true; + + me.fireEvent("langReady"); + } + + /** + * 编辑器准备就绪后会触发该事件 + * @module UE + * @class Editor + * @event ready + * @remind render方法执行完成之后,会触发该事件 + * @remind + * @example + * ```javascript + * editor.addListener( 'ready', function( editor ) { + * editor.execCommand( 'focus' ); //编辑器家在完成后,让编辑器拿到焦点 + * } ); + * ``` + */ + /** + * 执行destroy方法,会触发该事件 + * @module UE + * @class Editor + * @event destroy + * @see UE.Editor:destroy() + */ + /** + * 执行reset方法,会触发该事件 + * @module UE + * @class Editor + * @event reset + * @see UE.Editor:reset() + */ + /** + * 执行focus方法,会触发该事件 + * @module UE + * @class Editor + * @event focus + * @see UE.Editor:focus(Boolean) + */ + /** + * 语言加载完成会触发该事件 + * @module UE + * @class Editor + * @event langReady + */ + /** + * 运行命令之后会触发该命令 + * @module UE + * @class Editor + * @event beforeExecCommand + */ + /** + * 运行命令之后会触发该命令 + * @module UE + * @class Editor + * @event afterExecCommand + */ + /** + * 运行命令之前会触发该命令 + * @module UE + * @class Editor + * @event firstBeforeExecCommand + */ + /** + * 在getContent方法执行之前会触发该事件 + * @module UE + * @class Editor + * @event beforeGetContent + * @see UE.Editor:getContent() + */ + /** + * 在getContent方法执行之后会触发该事件 + * @module UE + * @class Editor + * @event afterGetContent + * @see UE.Editor:getContent() + */ + /** + * 在getAllHtml方法执行时会触发该事件 + * @module UE + * @class Editor + * @event getAllHtml + * @see UE.Editor:getAllHtml() + */ + /** + * 在setContent方法执行之前会触发该事件 + * @module UE + * @class Editor + * @event beforeSetContent + * @see UE.Editor:setContent(String) + */ + /** + * 在setContent方法执行之后会触发该事件 + * @module UE + * @class Editor + * @event afterSetContent + * @see UE.Editor:setContent(String) + */ + /** + * 每当编辑器内部选区发生改变时,将触发该事件 + * @event selectionchange + * @warning 该事件的触发非常频繁,不建议在该事件的处理过程中做重量级的处理 + * @example + * ```javascript + * editor.addListener( 'selectionchange', function( editor ) { + * console.log('选区发生改变'); + * } + */ + /** + * 在所有selectionchange的监听函数执行之前,会触发该事件 + * @module UE + * @class Editor + * @event beforeSelectionChange + * @see UE.Editor:selectionchange + */ + /** + * 在所有selectionchange的监听函数执行完之后,会触发该事件 + * @module UE + * @class Editor + * @event afterSelectionChange + * @see UE.Editor:selectionchange + */ + /** + * 编辑器内容发生改变时会触发该事件 + * @module UE + * @class Editor + * @event contentChange + */ + + + /** + * 以默认参数构建一个编辑器实例 + * @constructor + * @remind 通过 改构造方法实例化的编辑器,不带ui层.需要render到一个容器,编辑器实例才能正常渲染到页面 + * @example + * ```javascript + * var editor = new UE.Editor(); + * editor.execCommand('blod'); + * ``` + * @see UE.Config + */ + + /** + * 以给定的参数集合创建一个编辑器实例,对于未指定的参数,将应用默认参数。 + * @constructor + * @remind 通过 改构造方法实例化的编辑器,不带ui层.需要render到一个容器,编辑器实例才能正常渲染到页面 + * @param { Object } setting 创建编辑器的参数 + * @example + * ```javascript + * var editor = new UE.Editor(); + * editor.execCommand('blod'); + * ``` + * @see UE.Config + */ + var Editor = UE.Editor = function (options) { + var me = this; + me.uid = uid++; + EventBase.call(me); + me.commands = {}; + me.options = utils.extend(utils.clone(options || {}), UEDITOR_CONFIG, true); + me.shortcutkeys = {}; + me.inputRules = []; + me.outputRules = []; + //设置默认的常用属性 + me.setOpt(Editor.defaultOptions(me)); + + /* 尝试异步加载后台配置 */ + me.loadServerConfig(); + + if (!utils.isEmptyObject(UE.I18N)) { + //修改默认的语言类型 + me.options.lang = checkCurLang(UE.I18N); + UE.plugin.load(me); + langReadied(me); + + } else { + utils.loadFile(document, { + src: me.options.langPath + me.options.lang + "/" + me.options.lang + ".js", + tag: "script", + type: "text/javascript", + defer: "defer" + }, function () { + UE.plugin.load(me); + langReadied(me); + }); + } + + UE.instants['ueditorInstant' + me.uid] = me; + }; + Editor.prototype = { + registerCommand: function (name, obj) { + this.commands[name] = obj; + }, + /** + * 编辑器对外提供的监听ready事件的接口, 通过调用该方法,达到的效果与监听ready事件是一致的 + * @method ready + * @param { Function } fn 编辑器ready之后所执行的回调, 如果在注册事件之前编辑器已经ready,将会 + * 立即触发该回调。 + * @remind 需要等待编辑器加载完成后才能执行的代码,可以使用该方法传入 + * @example + * ```javascript + * editor.ready( function( editor ) { + * editor.setContent('初始化完毕'); + * } ); + * ``` + * @see UE.Editor.event:ready + */ + ready: function (fn) { + var me = this; + if (fn) { + me.isReady ? fn.apply(me) : me.addListener('ready', fn); + } + }, + + /** + * 该方法是提供给插件里面使用,设置配置项默认值 + * @method setOpt + * @warning 三处设置配置项的优先级: 实例化时传入参数 > setOpt()设置 > config文件里设置 + * @warning 该方法仅供编辑器插件内部和编辑器初始化时调用,其他地方不能调用。 + * @param { String } key 编辑器的可接受的选项名称 + * @param { * } val 该选项可接受的值 + * @example + * ```javascript + * editor.setOpt( 'initContent', '欢迎使用编辑器' ); + * ``` + */ + + /** + * 该方法是提供给插件里面使用,以{key:value}集合的方式设置插件内用到的配置项默认值 + * @method setOpt + * @warning 三处设置配置项的优先级: 实例化时传入参数 > setOpt()设置 > config文件里设置 + * @warning 该方法仅供编辑器插件内部和编辑器初始化时调用,其他地方不能调用。 + * @param { Object } options 将要设置的选项的键值对对象 + * @example + * ```javascript + * editor.setOpt( { + * 'initContent': '欢迎使用编辑器' + * } ); + * ``` + */ + setOpt: function (key, val) { + var obj = {}; + if (utils.isString(key)) { + obj[key] = val + } else { + obj = key; + } + utils.extend(this.options, obj, true); + }, + getOpt: function (key) { + return this.options[key] + }, + /** + * 销毁编辑器实例,使用textarea代替 + * @method destroy + * @example + * ```javascript + * editor.destroy(); + * ``` + */ + destroy: function () { + + var me = this; + me.fireEvent('destroy'); + var container = me.container.parentNode; + var textarea = me.textarea; + if (!textarea) { + textarea = document.createElement('textarea'); + container.parentNode.insertBefore(textarea, container); + } else { + textarea.style.display = '' + } + + textarea.style.width = me.iframe.offsetWidth + 'px'; + textarea.style.height = me.iframe.offsetHeight + 'px'; + textarea.value = me.getContent(); + textarea.id = me.key; + container.innerHTML = ''; + domUtils.remove(container); + var key = me.key; + //trace:2004 + for (var p in me) { + if (me.hasOwnProperty(p)) { + delete this[p]; + } + } + UE.delEditor(key); + }, + + /** + * 渲染编辑器的DOM到指定容器 + * @method render + * @param { String } containerId 指定一个容器ID + * @remind 执行该方法,会触发ready事件 + * @warning 必须且只能调用一次 + */ + + /** + * 渲染编辑器的DOM到指定容器 + * @method render + * @param { Element } containerDom 直接指定容器对象 + * @remind 执行该方法,会触发ready事件 + * @warning 必须且只能调用一次 + */ + render: function (container) { + var me = this, + options = me.options, + getStyleValue = function (attr) { + return parseInt(domUtils.getComputedStyle(container, attr)); + }; + if (utils.isString(container)) { + container = document.getElementById(container); + } + if (container) { + if (options.initialFrameWidth) { + options.minFrameWidth = options.initialFrameWidth + } else { + options.minFrameWidth = options.initialFrameWidth = container.offsetWidth; + } + if (options.initialFrameHeight) { + options.minFrameHeight = options.initialFrameHeight + } else { + options.initialFrameHeight = options.minFrameHeight = container.offsetHeight; + } + + container.style.width = /%$/.test(options.initialFrameWidth) ? '100%' : options.initialFrameWidth - + getStyleValue("padding-left") - getStyleValue("padding-right") + 'px'; + container.style.height = /%$/.test(options.initialFrameHeight) ? '100%' : options.initialFrameHeight - + getStyleValue("padding-top") - getStyleValue("padding-bottom") + 'px'; + + container.style.zIndex = options.zIndex; + + var html = (ie && browser.version < 9 ? '' : '') + + '' + + '' + + (options.iframeCssUrl ? '' : '') + + (options.initialStyle ? '' : '') + + '' + + ''; + container.appendChild(domUtils.createElement(document, 'iframe', { + id: 'ueditor_' + me.uid, + width: "100%", + height: "100%", + frameborder: "0", + //先注释掉了,加的原因忘记了,但开启会直接导致全屏模式下内容多时不会出现滚动条 +// scrolling :'no', + src: 'javascript:void(function(){document.open();' + (options.customDomain && document.domain != location.hostname ? 'document.domain="' + document.domain + '";' : '') + + 'document.write("' + html + '");document.close();}())' + })); + container.style.overflow = 'hidden'; + //解决如果是给定的百分比,会导致高度算不对的问题 + setTimeout(function () { + if (/%$/.test(options.initialFrameWidth)) { + options.minFrameWidth = options.initialFrameWidth = container.offsetWidth; + //如果这里给定宽度,会导致ie在拖动窗口大小时,编辑区域不随着变化 +// container.style.width = options.initialFrameWidth + 'px'; + } + if (/%$/.test(options.initialFrameHeight)) { + options.minFrameHeight = options.initialFrameHeight = container.offsetHeight; + container.style.height = options.initialFrameHeight + 'px'; + } + }) + } + }, + + /** + * 编辑器初始化 + * @method _setup + * @private + * @param { Element } doc 编辑器Iframe中的文档对象 + */ + _setup: function (doc) { + + var me = this, + options = me.options; + if (ie) { + doc.body.disabled = true; + doc.body.contentEditable = true; + doc.body.disabled = false; + } else { + doc.body.contentEditable = true; + } + doc.body.spellcheck = false; + me.document = doc; + me.window = doc.defaultView || doc.parentWindow; + me.iframe = me.window.frameElement; + me.body = doc.body; + me.selection = new dom.Selection(doc); + //gecko初始化就能得到range,无法判断isFocus了 + var geckoSel; + if (browser.gecko && (geckoSel = this.selection.getNative())) { + geckoSel.removeAllRanges(); + } + this._initEvents(); + //为form提交提供一个隐藏的textarea + for (var form = this.iframe.parentNode; !domUtils.isBody(form); form = form.parentNode) { + if (form.tagName == 'FORM') { + me.form = form; + if (me.options.autoSyncData) { + domUtils.on(me.window, 'blur', function () { + setValue(form, me); + }); + } else { + domUtils.on(form, 'submit', function () { + setValue(this, me); + }); + } + break; + } + } + if (options.initialContent) { + if (options.autoClearinitialContent) { + var oldExecCommand = me.execCommand; + me.execCommand = function () { + me.fireEvent('firstBeforeExecCommand'); + return oldExecCommand.apply(me, arguments); + }; + this._setDefaultContent(options.initialContent); + } else + this.setContent(options.initialContent, false, true); + } + + //编辑器不能为空内容 + + if (domUtils.isEmptyNode(me.body)) { + me.body.innerHTML = '

      ' + (browser.ie ? '' : '
      ') + '

      '; + } + //如果要求focus, 就把光标定位到内容开始 + if (options.focus) { + setTimeout(function () { + me.focus(me.options.focusInEnd); + //如果自动清除开着,就不需要做selectionchange; + !me.options.autoClearinitialContent && me._selectionChange(); + }, 0); + } + if (!me.container) { + me.container = this.iframe.parentNode; + } + if (options.fullscreen && me.ui) { + me.ui.setFullScreen(true); + } + + try { + me.document.execCommand('2D-position', false, false); + } catch (e) { + } + try { + me.document.execCommand('enableInlineTableEditing', false, false); + } catch (e) { + } + try { + me.document.execCommand('enableObjectResizing', false, false); + } catch (e) { + } + + //挂接快捷键 + me._bindshortcutKeys(); + me.isReady = 1; + me.fireEvent('ready'); + options.onready && options.onready.call(me); + if (!browser.ie9below) { + domUtils.on(me.window, ['blur', 'focus'], function (e) { + //chrome下会出现alt+tab切换时,导致选区位置不对 + if (e.type == 'blur') { + me._bakRange = me.selection.getRange(); + try { + me._bakNativeRange = me.selection.getNative().getRangeAt(0); + me.selection.getNative().removeAllRanges(); + } catch (e) { + me._bakNativeRange = null; + } + + } else { + try { + me._bakRange && me._bakRange.select(); + } catch (e) { + } + } + }); + } + //trace:1518 ff3.6body不够寛,会导致点击空白处无法获得焦点 + if (browser.gecko && browser.version <= 10902) { + //修复ff3.6初始化进来,不能点击获得焦点 + me.body.contentEditable = false; + setTimeout(function () { + me.body.contentEditable = true; + }, 100); + setInterval(function () { + me.body.style.height = me.iframe.offsetHeight - 20 + 'px' + }, 100) + } + + !options.isShow && me.setHide(); + options.readonly && me.setDisabled(); + }, + + /** + * 同步数据到编辑器所在的form + * 从编辑器的容器节点向上查找form元素,若找到,就同步编辑内容到找到的form里,为提交数据做准备,主要用于是手动提交的情况 + * 后台取得数据的键值,使用你容器上的name属性,如果没有就使用参数里的textarea项 + * @method sync + * @example + * ```javascript + * editor.sync(); + * form.sumbit(); //form变量已经指向了form元素 + * ``` + */ + + /** + * 根据传入的formId,在页面上查找要同步数据的表单,若找到,就同步编辑内容到找到的form里,为提交数据做准备 + * 后台取得数据的键值,该键值默认使用给定的编辑器容器的name属性,如果没有name属性则使用参数项里给定的“textarea”项 + * @method sync + * @param { String } formID 指定一个要同步数据的form的id,编辑器的数据会同步到你指定form下 + */ + sync: function (formId) { + var me = this, + form = formId ? document.getElementById(formId) : + domUtils.findParent(me.iframe.parentNode, function (node) { + return node.tagName == 'FORM' + }, true); + form && setValue(form, me); + }, + + /** + * 设置编辑器高度 + * @method setHeight + * @remind 当配置项autoHeightEnabled为真时,该方法无效 + * @param { Number } number 设置的高度值,纯数值,不带单位 + * @example + * ```javascript + * editor.setHeight(number); + * ``` + */ + setHeight: function (height, notSetHeight) { + if (height !== parseInt(this.iframe.parentNode.style.height)) { + this.iframe.parentNode.style.height = height + 'px'; + } + !notSetHeight && (this.options.minFrameHeight = this.options.initialFrameHeight = height); + this.body.style.height = height + 'px'; + !notSetHeight && this.trigger('setHeight') + }, + + /** + * 为编辑器的编辑命令提供快捷键 + * 这个接口是为插件扩展提供的接口,主要是为新添加的插件,如果需要添加快捷键,所提供的接口 + * @method addshortcutkey + * @param { Object } keyset 命令名和快捷键键值对对象,多个按钮的快捷键用“+”分隔 + * @example + * ```javascript + * editor.addshortcutkey({ + * "Bold" : "ctrl+66",//^B + * "Italic" : "ctrl+73", //^I + * }); + * ``` + */ + /** + * 这个接口是为插件扩展提供的接口,主要是为新添加的插件,如果需要添加快捷键,所提供的接口 + * @method addshortcutkey + * @param { String } cmd 触发快捷键时,响应的命令 + * @param { String } keys 快捷键的字符串,多个按钮用“+”分隔 + * @example + * ```javascript + * editor.addshortcutkey("Underline", "ctrl+85"); //^U + * ``` + */ + addshortcutkey: function (cmd, keys) { + var obj = {}; + if (keys) { + obj[cmd] = keys + } else { + obj = cmd; + } + utils.extend(this.shortcutkeys, obj) + }, + + /** + * 对编辑器设置keydown事件监听,绑定快捷键和命令,当快捷键组合触发成功,会响应对应的命令 + * @method _bindshortcutKeys + * @private + */ + _bindshortcutKeys: function () { + var me = this, shortcutkeys = this.shortcutkeys; + me.addListener('keydown', function (type, e) { + var keyCode = e.keyCode || e.which; + for (var i in shortcutkeys) { + var tmp = shortcutkeys[i].split(','); + for (var t = 0, ti; ti = tmp[t++];) { + ti = ti.split(':'); + var key = ti[0], param = ti[1]; + if (/^(ctrl)(\+shift)?\+(\d+)$/.test(key.toLowerCase()) || /^(\d+)$/.test(key)) { + if (((RegExp.$1 == 'ctrl' ? (e.ctrlKey || e.metaKey) : 0) + && (RegExp.$2 != "" ? e[RegExp.$2.slice(1) + "Key"] : 1) + && keyCode == RegExp.$3 + ) || + keyCode == RegExp.$1 + ) { + if (me.queryCommandState(i, param) != -1) + me.execCommand(i, param); + domUtils.preventDefault(e); + } + } + } + + } + }); + }, + + /** + * 获取编辑器的内容 + * @method getContent + * @warning 该方法获取到的是经过编辑器内置的过滤规则进行过滤后得到的内容 + * @return { String } 编辑器的内容字符串, 如果编辑器的内容为空,或者是空的标签内容(如:”<p><br/></p>“), 则返回空字符串 + * @example + * ```javascript + * //编辑器html内容:

      123456

      + * var content = editor.getContent(); //返回值:

      123456

      + * ``` + */ + + /** + * 获取编辑器的内容。 可以通过参数定义编辑器内置的判空规则 + * @method getContent + * @param { Function } fn 自定的判空规则, 要求该方法返回一个boolean类型的值, + * 代表当前编辑器的内容是否空, + * 如果返回true, 则该方法将直接返回空字符串;如果返回false,则编辑器将返回 + * 经过内置过滤规则处理后的内容。 + * @remind 该方法在处理包含有初始化内容的时候能起到很好的作用。 + * @warning 该方法获取到的是经过编辑器内置的过滤规则进行过滤后得到的内容 + * @return { String } 编辑器的内容字符串 + * @example + * ```javascript + * // editor 是一个编辑器的实例 + * var content = editor.getContent( function ( editor ) { + * return editor.body.innerHTML === '欢迎使用UEditor'; //返回空字符串 + * } ); + * ``` + */ + getContent: function (cmd, fn, notSetCursor, ignoreBlank, formatter) { + var me = this; + if (cmd && utils.isFunction(cmd)) { + fn = cmd; + cmd = ''; + } + if (fn ? !fn() : !this.hasContents()) { + return ''; + } + me.fireEvent('beforegetcontent'); + var root = UE.htmlparser(me.body.innerHTML, ignoreBlank); + me.filterOutputRule(root); + me.fireEvent('aftergetcontent', cmd, root); + return root.toHtml(formatter); + }, + + /** + * 取得完整的html代码,可以直接显示成完整的html文档 + * @method getAllHtml + * @return { String } 编辑器的内容html文档字符串 + * @eaxmple + * ```javascript + * editor.getAllHtml(); //返回格式大致是: ...... + * ``` + */ + getAllHtml: function () { + var me = this, + headHtml = [], + html = ''; + me.fireEvent('getAllHtml', headHtml); + if (browser.ie && browser.version > 8) { + var headHtmlForIE9 = ''; + utils.each(me.document.styleSheets, function (si) { + headHtmlForIE9 += (si.href ? '' : ''); + }); + utils.each(me.document.getElementsByTagName('script'), function (si) { + headHtmlForIE9 += si.outerHTML; + }); + + } + return '' + (me.options.charset ? '' : '') + + (headHtmlForIE9 || me.document.getElementsByTagName('head')[0].innerHTML) + headHtml.join('\n') + '' + + '' + me.getContent(null, null, true) + ''; + }, + + /** + * 得到编辑器的纯文本内容,但会保留段落格式 + * @method getPlainTxt + * @return { String } 编辑器带段落格式的纯文本内容字符串 + * @example + * ```javascript + * //编辑器html内容:

      1

      2

      + * console.log(editor.getPlainTxt()); //输出:"1\n2\n + * ``` + */ + getPlainTxt: function () { + var reg = new RegExp(domUtils.fillChar, 'g'), + html = this.body.innerHTML.replace(/[\n\r]/g, '');//ie要先去了\n在处理 + html = html.replace(/<(p|div)[^>]*>(| )<\/\1>/gi, '\n') + .replace(//gi, '\n') + .replace(/<[^>/]+>/g, '') + .replace(/(\n)?<\/([^>]+)>/g, function (a, b, c) { + return dtd.$block[c] ? '\n' : b ? b : ''; + }); + //取出来的空格会有c2a0会变成乱码,处理这种情况\u00a0 + return html.replace(reg, '').replace(/\u00a0/g, ' ').replace(/ /g, ' '); + }, + + /** + * 获取编辑器中的纯文本内容,没有段落格式 + * @method getContentTxt + * @return { String } 编辑器不带段落格式的纯文本内容字符串 + * @example + * ```javascript + * //编辑器html内容:

      1

      2

      + * console.log(editor.getPlainTxt()); //输出:"12 + * ``` + */ + getContentTxt: function () { + var reg = new RegExp(domUtils.fillChar, 'g'); + //取出来的空格会有c2a0会变成乱码,处理这种情况\u00a0 + return this.body[browser.ie ? 'innerText' : 'textContent'].replace(reg, '').replace(/\u00a0/g, ' '); + }, + + /** + * 设置编辑器的内容,可修改编辑器当前的html内容 + * @method setContent + * @warning 通过该方法插入的内容,是经过编辑器内置的过滤规则进行过滤后得到的内容 + * @warning 该方法会触发selectionchange事件 + * @param { String } html 要插入的html内容 + * @example + * ```javascript + * editor.getContent('

      test

      '); + * ``` + */ + + /** + * 设置编辑器的内容,可修改编辑器当前的html内容 + * @method setContent + * @warning 通过该方法插入的内容,是经过编辑器内置的过滤规则进行过滤后得到的内容 + * @warning 该方法会触发selectionchange事件 + * @param { String } html 要插入的html内容 + * @param { Boolean } isAppendTo 若传入true,不清空原来的内容,在最后插入内容,否则,清空内容再插入 + * @example + * ```javascript + * //假设设置前的编辑器内容是

      old text

      + * editor.setContent('

      new text

      ', true); //插入的结果是

      old text

      new text

      + * ``` + */ + setContent: function (html, isAppendTo, notFireSelectionchange) { + var me = this; + + me.fireEvent('beforesetcontent', html); + var root = UE.htmlparser(html); + me.filterInputRule(root); + html = root.toHtml(); + + me.body.innerHTML = (isAppendTo ? me.body.innerHTML : '') + html; + + + function isCdataDiv(node) { + return node.tagName == 'DIV' && node.getAttribute('cdata_tag'); + } + + //给文本或者inline节点套p标签 + if (me.options.enterTag == 'p') { + + var child = this.body.firstChild, tmpNode; + if (!child || child.nodeType == 1 && + (dtd.$cdata[child.tagName] || isCdataDiv(child) || + domUtils.isCustomeNode(child) + ) + && child === this.body.lastChild) { + this.body.innerHTML = '

      ' + (browser.ie ? ' ' : '
      ') + '

      ' + this.body.innerHTML; + + } else { + var p = me.document.createElement('p'); + while (child) { + while (child && (child.nodeType == 3 || child.nodeType == 1 && dtd.p[child.tagName] && !dtd.$cdata[child.tagName])) { + tmpNode = child.nextSibling; + p.appendChild(child); + child = tmpNode; + } + if (p.firstChild) { + if (!child) { + me.body.appendChild(p); + break; + } else { + child.parentNode.insertBefore(p, child); + p = me.document.createElement('p'); + } + } + child = child.nextSibling; + } + } + } + me.fireEvent('aftersetcontent'); + me.fireEvent('contentchange'); + + !notFireSelectionchange && me._selectionChange(); + //清除保存的选区 + me._bakRange = me._bakIERange = me._bakNativeRange = null; + //trace:1742 setContent后gecko能得到焦点问题 + var geckoSel; + if (browser.gecko && (geckoSel = this.selection.getNative())) { + geckoSel.removeAllRanges(); + } + if (me.options.autoSyncData) { + me.form && setValue(me.form, me); + } + }, + + /** + * 让编辑器获得焦点,默认focus到编辑器头部 + * @method focus + * @example + * ```javascript + * editor.focus() + * ``` + */ + + /** + * 让编辑器获得焦点,toEnd确定focus位置 + * @method focus + * @param { Boolean } toEnd 默认focus到编辑器头部,toEnd为true时focus到内容尾部 + * @example + * ```javascript + * editor.focus(true) + * ``` + */ + focus: function (toEnd) { + try { + var me = this, + rng = me.selection.getRange(); + if (toEnd) { + var node = me.body.lastChild; + if (node && node.nodeType == 1 && !dtd.$empty[node.tagName]) { + if (domUtils.isEmptyBlock(node)) { + rng.setStartAtFirst(node) + } else { + rng.setStartAtLast(node) + } + rng.collapse(true); + } + rng.setCursor(true); + } else { + if (!rng.collapsed && domUtils.isBody(rng.startContainer) && rng.startOffset == 0) { + + var node = me.body.firstChild; + if (node && node.nodeType == 1 && !dtd.$empty[node.tagName]) { + rng.setStartAtFirst(node).collapse(true); + } + } + + rng.select(true); + + } + this.fireEvent('focus selectionchange'); + } catch (e) { + } + + }, + isFocus: function () { + return this.selection.isFocus(); + }, + blur: function () { + var sel = this.selection.getNative(); + if (sel.empty && browser.ie) { + var nativeRng = document.body.createTextRange(); + nativeRng.moveToElementText(document.body); + nativeRng.collapse(true); + nativeRng.select(); + sel.empty() + } else { + sel.removeAllRanges() + } + + //this.fireEvent('blur selectionchange'); + }, + /** + * 初始化UE事件及部分事件代理 + * @method _initEvents + * @private + */ + _initEvents: function () { + var me = this, + doc = me.document, + win = me.window; + me._proxyDomEvent = utils.bind(me._proxyDomEvent, me); + domUtils.on(doc, ['click', 'contextmenu', 'mousedown', 'keydown', 'keyup', 'keypress', 'mouseup', 'mouseover', 'mouseout', 'selectstart'], me._proxyDomEvent); + domUtils.on(win, ['focus', 'blur'], me._proxyDomEvent); + domUtils.on(me.body, 'drop', function (e) { + //阻止ff下默认的弹出新页面打开图片 + if (browser.gecko && e.stopPropagation) { + e.stopPropagation(); + } + me.fireEvent('contentchange') + }); + domUtils.on(doc, ['mouseup', 'keydown'], function (evt) { + //特殊键不触发selectionchange + if (evt.type == 'keydown' && (evt.ctrlKey || evt.metaKey || evt.shiftKey || evt.altKey)) { + return; + } + if (evt.button == 2) return; + me._selectionChange(250, evt); + }); + }, + /** + * 触发事件代理 + * @method _proxyDomEvent + * @private + * @return { * } fireEvent的返回值 + * @see UE.EventBase:fireEvent(String) + */ + _proxyDomEvent: function (evt) { + if (this.fireEvent('before' + evt.type.replace(/^on/, '').toLowerCase()) === false) { + return false; + } + if (this.fireEvent(evt.type.replace(/^on/, ''), evt) === false) { + return false; + } + return this.fireEvent('after' + evt.type.replace(/^on/, '').toLowerCase()) + }, + /** + * 变化选区 + * @method _selectionChange + * @private + */ + _selectionChange: function (delay, evt) { + var me = this; + //有光标才做selectionchange 为了解决未focus时点击source不能触发更改工具栏状态的问题(source命令notNeedUndo=1) +// if ( !me.selection.isFocus() ){ +// return; +// } + + + var hackForMouseUp = false; + var mouseX, mouseY; + if (browser.ie && browser.version < 9 && evt && evt.type == 'mouseup') { + var range = this.selection.getRange(); + if (!range.collapsed) { + hackForMouseUp = true; + mouseX = evt.clientX; + mouseY = evt.clientY; + } + } + clearTimeout(_selectionChangeTimer); + _selectionChangeTimer = setTimeout(function () { + if (!me.selection || !me.selection.getNative()) { + return; + } + //修复一个IE下的bug: 鼠标点击一段已选择的文本中间时,可能在mouseup后的一段时间内取到的range是在selection的type为None下的错误值. + //IE下如果用户是拖拽一段已选择文本,则不会触发mouseup事件,所以这里的特殊处理不会对其有影响 + var ieRange; + if (hackForMouseUp && me.selection.getNative().type == 'None') { + ieRange = me.document.body.createTextRange(); + try { + ieRange.moveToPoint(mouseX, mouseY); + } catch (ex) { + ieRange = null; + } + } + var bakGetIERange; + if (ieRange) { + bakGetIERange = me.selection.getIERange; + me.selection.getIERange = function () { + return ieRange; + }; + } + me.selection.cache(); + if (bakGetIERange) { + me.selection.getIERange = bakGetIERange; + } + if (me.selection._cachedRange && me.selection._cachedStartElement) { + me.fireEvent('beforeselectionchange'); + // 第二个参数causeByUi为true代表由用户交互造成的selectionchange. + me.fireEvent('selectionchange', !!evt); + me.fireEvent('afterselectionchange'); + me.selection.clear(); + } + }, delay || 50); + }, + + /** + * 执行编辑命令 + * @method _callCmdFn + * @private + * @param { String } fnName 函数名称 + * @param { * } args 传给命令函数的参数 + * @return { * } 返回命令函数运行的返回值 + */ + _callCmdFn: function (fnName, args) { + var cmdName = args[0].toLowerCase(), + cmd, cmdFn; + cmd = this.commands[cmdName] || UE.commands[cmdName]; + cmdFn = cmd && cmd[fnName]; + //没有querycommandstate或者没有command的都默认返回0 + if ((!cmd || !cmdFn) && fnName == 'queryCommandState') { + return 0; + } else if (cmdFn) { + return cmdFn.apply(this, args); + } + }, + + /** + * 执行编辑命令cmdName,完成富文本编辑效果 + * @method execCommand + * @param { String } cmdName 需要执行的命令 + * @remind 具体命令的使用请参考命令列表 + * @return { * } 返回命令函数运行的返回值 + * @example + * ```javascript + * editor.execCommand(cmdName); + * ``` + */ + execCommand: function (cmdName) { + cmdName = cmdName.toLowerCase(); + var me = this, + result, + cmd = me.commands[cmdName] || UE.commands[cmdName]; + if (!cmd || !cmd.execCommand) { + return null; + } + if (!cmd.notNeedUndo && !me.__hasEnterExecCommand) { + me.__hasEnterExecCommand = true; + if (me.queryCommandState.apply(me, arguments) != -1) { + me.fireEvent('saveScene'); + me.fireEvent.apply(me, ['beforeexeccommand', cmdName].concat(arguments)); + result = this._callCmdFn('execCommand', arguments); + //保存场景时,做了内容对比,再看是否进行contentchange触发,这里多触发了一次,去掉 +// (!cmd.ignoreContentChange && !me._ignoreContentChange) && me.fireEvent('contentchange'); + me.fireEvent.apply(me, ['afterexeccommand', cmdName].concat(arguments)); + me.fireEvent('saveScene'); + } + me.__hasEnterExecCommand = false; + } else { + result = this._callCmdFn('execCommand', arguments); + (!me.__hasEnterExecCommand && !cmd.ignoreContentChange && !me._ignoreContentChange) && me.fireEvent('contentchange') + } + (!me.__hasEnterExecCommand && !cmd.ignoreContentChange && !me._ignoreContentChange) && me._selectionChange(); + return result; + }, + + /** + * 根据传入的command命令,查选编辑器当前的选区,返回命令的状态 + * @method queryCommandState + * @param { String } cmdName 需要查询的命令名称 + * @remind 具体命令的使用请参考命令列表 + * @return { Number } number 返回放前命令的状态,返回值三种情况:(-1|0|1) + * @example + * ```javascript + * editor.queryCommandState(cmdName) => (-1|0|1) + * ``` + * @see COMMAND.LIST + */ + queryCommandState: function (cmdName) { + return this._callCmdFn('queryCommandState', arguments); + }, + + /** + * 根据传入的command命令,查选编辑器当前的选区,根据命令返回相关的值 + * @method queryCommandValue + * @param { String } cmdName 需要查询的命令名称 + * @remind 具体命令的使用请参考命令列表 + * @remind 只有部分插件有此方法 + * @return { * } 返回每个命令特定的当前状态值 + * @grammar editor.queryCommandValue(cmdName) => {*} + * @see COMMAND.LIST + */ + queryCommandValue: function (cmdName) { + return this._callCmdFn('queryCommandValue', arguments); + }, + + /** + * 检查编辑区域中是否有内容 + * @method hasContents + * @remind 默认有文本内容,或者有以下节点都不认为是空 + * table,ul,ol,dl,iframe,area,base,col,hr,img,embed,input,link,meta,param + * @return { Boolean } 检查有内容返回true,否则返回false + * @example + * ```javascript + * editor.hasContents() + * ``` + */ + + /** + * 检查编辑区域中是否有内容,若包含参数tags中的节点类型,直接返回true + * @method hasContents + * @param { Array } tags 传入数组判断时用到的节点类型 + * @return { Boolean } 若文档中包含tags数组里对应的tag,返回true,否则返回false + * @example + * ```javascript + * editor.hasContents(['span']); + * ``` + */ + hasContents: function (tags) { + if (tags) { + for (var i = 0, ci; ci = tags[i++];) { + if (this.document.getElementsByTagName(ci).length > 0) { + return true; + } + } + } + if (!domUtils.isEmptyBlock(this.body)) { + return true + } + //随时添加,定义的特殊标签如果存在,不能认为是空 + tags = ['div']; + for (i = 0; ci = tags[i++];) { + var nodes = domUtils.getElementsByTagName(this.document, ci); + for (var n = 0, cn; cn = nodes[n++];) { + if (domUtils.isCustomeNode(cn)) { + return true; + } + } + } + return false; + }, + + /** + * 重置编辑器,可用来做多个tab使用同一个编辑器实例 + * @method reset + * @remind 此方法会清空编辑器内容,清空回退列表,会触发reset事件 + * @example + * ```javascript + * editor.reset() + * ``` + */ + reset: function () { + this.fireEvent('reset'); + }, + + /** + * 设置当前编辑区域可以编辑 + * @method setEnabled + * @example + * ```javascript + * editor.setEnabled() + * ``` + */ + setEnabled: function () { + var me = this, range; + if (me.body.contentEditable == 'false') { + me.body.contentEditable = true; + range = me.selection.getRange(); + //有可能内容丢失了 + try { + range.moveToBookmark(me.lastBk); + delete me.lastBk + } catch (e) { + range.setStartAtFirst(me.body).collapse(true) + } + range.select(true); + if (me.bkqueryCommandState) { + me.queryCommandState = me.bkqueryCommandState; + delete me.bkqueryCommandState; + } + if (me.bkqueryCommandValue) { + me.queryCommandValue = me.bkqueryCommandValue; + delete me.bkqueryCommandValue; + } + me.fireEvent('selectionchange'); + } + }, + enable: function () { + return this.setEnabled(); + }, + + /** 设置当前编辑区域不可编辑 + * @method setDisabled + */ + + /** 设置当前编辑区域不可编辑,except中的命令除外 + * @method setDisabled + * @param { String } except 例外命令的字符串 + * @remind 即使设置了disable,此处配置的例外命令仍然可以执行 + * @example + * ```javascript + * editor.setDisabled('bold'); //禁用工具栏中除加粗之外的所有功能 + * ``` + */ + + /** 设置当前编辑区域不可编辑,except中的命令除外 + * @method setDisabled + * @param { Array } except 例外命令的字符串数组,数组中的命令仍然可以执行 + * @remind 即使设置了disable,此处配置的例外命令仍然可以执行 + * @example + * ```javascript + * editor.setDisabled(['bold','insertimage']); //禁用工具栏中除加粗和插入图片之外的所有功能 + * ``` + */ + setDisabled: function (except) { + var me = this; + except = except ? utils.isArray(except) ? except : [except] : []; + if (me.body.contentEditable == 'true') { + if (!me.lastBk) { + me.lastBk = me.selection.getRange().createBookmark(true); + } + me.body.contentEditable = false; + me.bkqueryCommandState = me.queryCommandState; + me.bkqueryCommandValue = me.queryCommandValue; + me.queryCommandState = function (type) { + if (utils.indexOf(except, type) != -1) { + return me.bkqueryCommandState.apply(me, arguments); + } + return -1; + }; + me.queryCommandValue = function (type) { + if (utils.indexOf(except, type) != -1) { + return me.bkqueryCommandValue.apply(me, arguments); + } + return null; + }; + me.fireEvent('selectionchange'); + } + }, + disable: function (except) { + return this.setDisabled(except); + }, + + /** + * 设置默认内容 + * @method _setDefaultContent + * @private + * @param { String } cont 要存入的内容 + */ + _setDefaultContent: function () { + function clear() { + var me = this; + if (me.document.getElementById('initContent')) { + me.body.innerHTML = '

      ' + (ie ? '' : '
      ') + '

      '; + me.removeListener('firstBeforeExecCommand focus', clear); + setTimeout(function () { + me.focus(); + me._selectionChange(); + }, 0) + } + } + + return function (cont) { + var me = this; + me.body.innerHTML = '

      ' + cont + '

      '; + + me.addListener('firstBeforeExecCommand focus', clear); + } + }(), + + /** + * 显示编辑器 + * @method setShow + * @example + * ```javascript + * editor.setShow() + * ``` + */ + setShow: function () { + var me = this, range = me.selection.getRange(); + if (me.container.style.display == 'none') { + //有可能内容丢失了 + try { + range.moveToBookmark(me.lastBk); + delete me.lastBk + } catch (e) { + range.setStartAtFirst(me.body).collapse(true) + } + //ie下focus实效,所以做了个延迟 + setTimeout(function () { + range.select(true); + }, 100); + me.container.style.display = ''; + } + + }, + show: function () { + return this.setShow(); + }, + /** + * 隐藏编辑器 + * @method setHide + * @example + * ```javascript + * editor.setHide() + * ``` + */ + setHide: function () { + var me = this; + if (!me.lastBk) { + me.lastBk = me.selection.getRange().createBookmark(true); + } + me.container.style.display = 'none' + }, + hide: function () { + return this.setHide(); + }, + + /** + * 根据指定的路径,获取对应的语言资源 + * @method getLang + * @param { String } path 路径根据的是lang目录下的语言文件的路径结构 + * @return { Object | String } 根据路径返回语言资源的Json格式对象或者语言字符串 + * @example + * ```javascript + * editor.getLang('contextMenu.delete'); //如果当前是中文,那返回是的是'删除' + * ``` + */ + getLang: function (path) { + var lang = UE.I18N[this.options.lang]; + if (!lang) { + throw Error("not import language file"); + } + path = (path || "").split("."); + for (var i = 0, ci; ci = path[i++];) { + lang = lang[ci]; + if (!lang) break; + } + return lang; + }, + + /** + * 计算编辑器html内容字符串的长度 + * @method getContentLength + * @return { Number } 返回计算的长度 + * @example + * ```javascript + * //编辑器html内容

      132

      + * editor.getContentLength() //返回27 + * ``` + */ + /** + * 计算编辑器当前纯文本内容的长度 + * @method getContentLength + * @param { Boolean } ingoneHtml 传入true时,只按照纯文本来计算 + * @return { Number } 返回计算的长度,内容中有hr/img/iframe标签,长度加1 + * @example + * ```javascript + * //编辑器html内容

      132

      + * editor.getContentLength() //返回3 + * ``` + */ + getContentLength: function (ingoneHtml, tagNames) { + var count = this.getContent(false, false, true).length; + if (ingoneHtml) { + tagNames = (tagNames || []).concat(['hr', 'img', 'iframe']); + count = this.getContentTxt().replace(/[\t\r\n]+/g, '').length; + for (var i = 0, ci; ci = tagNames[i++];) { + count += this.document.getElementsByTagName(ci).length; + } + } + return count; + }, + + /** + * 注册输入过滤规则 + * @method addInputRule + * @param { Function } rule 要添加的过滤规则 + * @example + * ```javascript + * editor.addInputRule(function(root){ + * $.each(root.getNodesByTagName('div'),function(i,node){ + * node.tagName="p"; + * }); + * }); + * ``` + */ + addInputRule: function (rule) { + this.inputRules.push(rule); + }, + + /** + * 执行注册的过滤规则 + * @method filterInputRule + * @param { UE.uNode } root 要过滤的uNode节点 + * @remind 执行editor.setContent方法和执行'inserthtml'命令后,会运行该过滤函数 + * @example + * ```javascript + * editor.filterInputRule(editor.body); + * ``` + * @see UE.Editor:addInputRule + */ + filterInputRule: function (root) { + for (var i = 0, ci; ci = this.inputRules[i++];) { + ci.call(this, root) + } + }, + + /** + * 注册输出过滤规则 + * @method addOutputRule + * @param { Function } rule 要添加的过滤规则 + * @example + * ```javascript + * editor.addOutputRule(function(root){ + * $.each(root.getNodesByTagName('p'),function(i,node){ + * node.tagName="div"; + * }); + * }); + * ``` + */ + addOutputRule: function (rule) { + this.outputRules.push(rule) + }, + + /** + * 根据输出过滤规则,过滤编辑器内容 + * @method filterOutputRule + * @remind 执行editor.getContent方法的时候,会先运行该过滤函数 + * @param { UE.uNode } root 要过滤的uNode节点 + * @example + * ```javascript + * editor.filterOutputRule(editor.body); + * ``` + * @see UE.Editor:addOutputRule + */ + filterOutputRule: function (root) { + for (var i = 0, ci; ci = this.outputRules[i++];) { + ci.call(this, root) + } + }, + + /** + * 根据action名称获取请求的路径 + * @method getActionUrl + * @remind 假如没有设置serverUrl,会根据imageUrl设置默认的controller路径 + * @param { String } action action名称 + * @example + * ```javascript + * editor.getActionUrl('config'); //返回 "/ueditor/php/controller.php?action=config" + * editor.getActionUrl('image'); //返回 "/ueditor/php/controller.php?action=uplaodimage" + * editor.getActionUrl('scrawl'); //返回 "/ueditor/php/controller.php?action=uplaodscrawl" + * editor.getActionUrl('imageManager'); //返回 "/ueditor/php/controller.php?action=listimage" + * ``` + */ + getActionUrl: function (action) { + var actionName = this.getOpt(action) || action, + imageUrl = this.getOpt('imageUrl'), + serverUrl = this.getOpt('serverUrl'); + + if (!serverUrl && imageUrl) { + serverUrl = imageUrl.replace(/^(.*[\/]).+([\.].+)$/, '$1controller$2'); + } + + if (serverUrl) { + serverUrl = serverUrl + (serverUrl.indexOf('?') == -1 ? '?' : '&') + 'action=' + (actionName || ''); + return utils.formatUrl(serverUrl); + } else { + return ''; + } + } + }; + utils.inherits(Editor, EventBase); + })(); + + +// core/Editor.defaultoptions.js +//维护编辑器一下默认的不在插件中的配置项 + UE.Editor.defaultOptions = function (editor) { + + var _url = editor.options.UEDITOR_HOME_URL; + return { + isShow: true, + initialContent: '', + initialStyle: '', + autoClearinitialContent: false, + iframeCssUrl: _url + 'themes/iframe.css', + textarea: 'editorValue', + focus: false, + focusInEnd: true, + autoClearEmptyNode: true, + fullscreen: false, + readonly: false, + zIndex: 999, + imagePopup: true, + enterTag: 'p', + customDomain: false, + lang: 'zh-cn', + langPath: _url + 'lang/', + theme: 'default', + themePath: _url + 'themes/', + allHtmlEnabled: false, + scaleEnabled: false, + tableNativeEditInFF: false, + autoSyncData: true, + fileNameFormat: '{time}{rand:6}' + } + }; + +// core/loadconfig.js + (function () { + + UE.Editor.prototype.loadServerConfig = function () { + var me = this; + setTimeout(function () { + try { + me.options.imageUrl && me.setOpt('serverUrl', me.options.imageUrl.replace(/^(.*[\/]).+([\.].+)$/, '$1controller$2')); + + var configUrl = me.getActionUrl('config'), + isJsonp = utils.isCrossDomainUrl(configUrl); + + /* 发出ajax请求 */ + me._serverConfigLoaded = false; + + configUrl && UE.ajax.request(configUrl, { + 'method': 'GET', + 'dataType': isJsonp ? 'jsonp' : '', + 'onsuccess': function (r) { + try { + var config = isJsonp ? r : eval("(" + r.responseText + ")"); + utils.extend(me.options, config); + me.fireEvent('serverConfigLoaded'); + me._serverConfigLoaded = true; + } catch (e) { + showErrorMsg(me.getLang('loadconfigFormatError')); + } + }, + 'onerror': function () { + showErrorMsg(me.getLang('loadconfigHttpError')); + } + }); + } catch (e) { + showErrorMsg(me.getLang('loadconfigError')); + } + }); + + function showErrorMsg(msg) { + console && console.error(msg); + //me.fireEvent('showMessage', { + // 'title': msg, + // 'type': 'error' + //}); + } + }; + + UE.Editor.prototype.isServerConfigLoaded = function () { + var me = this; + return me._serverConfigLoaded || false; + }; + + UE.Editor.prototype.afterConfigReady = function (handler) { + if (!handler || !utils.isFunction(handler)) return; + var me = this; + var readyHandler = function () { + handler.apply(me, arguments); + me.removeListener('serverConfigLoaded', readyHandler); + }; + + if (me.isServerConfigLoaded()) { + handler.call(me, 'serverConfigLoaded'); + } else { + me.addListener('serverConfigLoaded', readyHandler); + } + }; + + })(); + + +// core/ajax.js + /** + * @file + * @module UE.ajax + * @since 1.2.6.1 + */ + + /** + * 提供对ajax请求的支持 + * @module UE.ajax + */ + UE.ajax = function () { + + //创建一个ajaxRequest对象 + var fnStr = 'XMLHttpRequest()'; + try { + new ActiveXObject("Msxml2.XMLHTTP"); + fnStr = 'ActiveXObject(\'Msxml2.XMLHTTP\')'; + } catch (e) { + try { + new ActiveXObject("Microsoft.XMLHTTP"); + fnStr = 'ActiveXObject(\'Microsoft.XMLHTTP\')' + } catch (e) { + } + } + var creatAjaxRequest = new Function('return new ' + fnStr); + + + /** + * 将json参数转化成适合ajax提交的参数列表 + * @param json + */ + function json2str(json) { + var strArr = []; + for (var i in json) { + //忽略默认的几个参数 + if (i == "method" || i == "timeout" || i == "async" || i == "dataType" || i == "callback") continue; + //忽略控制 + if (json[i] == undefined || json[i] == null) continue; + //传递过来的对象和函数不在提交之列 + if (!((typeof json[i]).toLowerCase() == "function" || (typeof json[i]).toLowerCase() == "object")) { + strArr.push(encodeURIComponent(i) + "=" + encodeURIComponent(json[i])); + } else if (utils.isArray(json[i])) { + //支持传数组内容 + for (var j = 0; j < json[i].length; j++) { + strArr.push(encodeURIComponent(i) + "[]=" + encodeURIComponent(json[i][j])); + } + } + } + return strArr.join("&"); + } + + function doAjax(url, ajaxOptions) { + var xhr = creatAjaxRequest(), + //是否超时 + timeIsOut = false, + //默认参数 + defaultAjaxOptions = { + method: "POST", + timeout: 5000, + async: true, + data: {},//需要传递对象的话只能覆盖 + onsuccess: function () { + }, + onerror: function () { + } + }; + + if (typeof url === "object") { + ajaxOptions = url; + url = ajaxOptions.url; + } + if (!xhr || !url) return; + var ajaxOpts = ajaxOptions ? utils.extend(defaultAjaxOptions, ajaxOptions) : defaultAjaxOptions; + + var submitStr = json2str(ajaxOpts); // { name:"Jim",city:"Beijing" } --> "name=Jim&city=Beijing" + //如果用户直接通过data参数传递json对象过来,则也要将此json对象转化为字符串 + if (!utils.isEmptyObject(ajaxOpts.data)) { + submitStr += (submitStr ? "&" : "") + json2str(ajaxOpts.data); + } + //超时检测 + var timerID = setTimeout(function () { + if (xhr.readyState != 4) { + timeIsOut = true; + xhr.abort(); + clearTimeout(timerID); + } + }, ajaxOpts.timeout); + + var method = ajaxOpts.method.toUpperCase(); + var str = url + (url.indexOf("?") == -1 ? "?" : "&") + (method == "POST" ? "" : submitStr + "&noCache=" + +new Date); + xhr.open(method, str, ajaxOpts.async); + xhr.onreadystatechange = function () { + if (xhr.readyState == 4) { + if (!timeIsOut && xhr.status == 200) { + ajaxOpts.onsuccess(xhr); + } else { + ajaxOpts.onerror(xhr); + } + } + }; + if (method == "POST") { + xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + xhr.send(submitStr); + } else { + xhr.send(null); + } + } + + function doJsonp(url, opts) { + + var successhandler = opts.onsuccess || function () { + }, + scr = document.createElement('SCRIPT'), + options = opts || {}, + charset = options['charset'], + callbackField = options['jsonp'] || 'callback', + callbackFnName, + timeOut = options['timeOut'] || 0, + timer, + reg = new RegExp('(\\?|&)' + callbackField + '=([^&]*)'), + matches; + + if (utils.isFunction(successhandler)) { + callbackFnName = 'bd__editor__' + Math.floor(Math.random() * 2147483648).toString(36); + window[callbackFnName] = getCallBack(0); + } else if (utils.isString(successhandler)) { + callbackFnName = successhandler; + } else { + if (matches = reg.exec(url)) { + callbackFnName = matches[2]; + } + } + + url = url.replace(reg, '\x241' + callbackField + '=' + callbackFnName); + + if (url.search(reg) < 0) { + url += (url.indexOf('?') < 0 ? '?' : '&') + callbackField + '=' + callbackFnName; + } + + var queryStr = json2str(opts); // { name:"Jim",city:"Beijing" } --> "name=Jim&city=Beijing" + //如果用户直接通过data参数传递json对象过来,则也要将此json对象转化为字符串 + if (!utils.isEmptyObject(opts.data)) { + queryStr += (queryStr ? "&" : "") + json2str(opts.data); + } + if (queryStr) { + url = url.replace(/\?/, '?' + queryStr + '&'); + } + + scr.onerror = getCallBack(1); + if (timeOut) { + timer = setTimeout(getCallBack(1), timeOut); + } + createScriptTag(scr, url, charset); + + function createScriptTag(scr, url, charset) { + scr.setAttribute('type', 'text/javascript'); + scr.setAttribute('defer', 'defer'); + charset && scr.setAttribute('charset', charset); + scr.setAttribute('src', url); + document.getElementsByTagName('head')[0].appendChild(scr); + } + + function getCallBack(onTimeOut) { + return function () { + try { + if (onTimeOut) { + options.onerror && options.onerror(); + } else { + try { + clearTimeout(timer); + successhandler.apply(window, arguments); + } catch (e) { + } + } + } catch (exception) { + options.onerror && options.onerror.call(window, exception); + } finally { + options.oncomplete && options.oncomplete.apply(window, arguments); + scr.parentNode && scr.parentNode.removeChild(scr); + window[callbackFnName] = null; + try { + delete window[callbackFnName]; + } catch (e) { + } + } + } + } + } + + return { + /** + * 根据给定的参数项,向指定的url发起一个ajax请求。 ajax请求完成后,会根据请求结果调用相应回调: 如果请求 + * 成功, 则调用onsuccess回调, 失败则调用 onerror 回调 + * @method request + * @param { URLString } url ajax请求的url地址 + * @param { Object } ajaxOptions ajax请求选项的键值对,支持的选项如下: + * @example + * ```javascript + * //向sayhello.php发起一个异步的Ajax GET请求, 请求超时时间为10s, 请求完成后执行相应的回调。 + * UE.ajax.requeset( 'sayhello.php', { + * + * //请求方法。可选值: 'GET', 'POST',默认值是'POST' + * method: 'GET', + * + * //超时时间。 默认为5000, 单位是ms + * timeout: 10000, + * + * //是否是异步请求。 true为异步请求, false为同步请求 + * async: true, + * + * //请求携带的数据。如果请求为GET请求, data会经过stringify后附加到请求url之后。 + * data: { + * name: 'ueditor' + * }, + * + * //请求成功后的回调, 该回调接受当前的XMLHttpRequest对象作为参数。 + * onsuccess: function ( xhr ) { + * console.log( xhr.responseText ); + * }, + * + * //请求失败或者超时后的回调。 + * onerror: function ( xhr ) { + * alert( 'Ajax请求失败' ); + * } + * + * } ); + * ``` + */ + + /** + * 根据给定的参数项发起一个ajax请求, 参数项里必须包含一个url地址。 ajax请求完成后,会根据请求结果调用相应回调: 如果请求 + * 成功, 则调用onsuccess回调, 失败则调用 onerror 回调。 + * @method request + * @warning 如果在参数项里未提供一个key为“url”的地址值,则该请求将直接退出。 + * @param { Object } ajaxOptions ajax请求选项的键值对,支持的选项如下: + * @example + * ```javascript + * + * //向sayhello.php发起一个异步的Ajax POST请求, 请求超时时间为5s, 请求完成后不执行任何回调。 + * UE.ajax.requeset( 'sayhello.php', { + * + * //请求的地址, 该项是必须的。 + * url: 'sayhello.php' + * + * } ); + * ``` + */ + request: function (url, opts) { + if (opts && opts.dataType == 'jsonp') { + doJsonp(url, opts); + } else { + doAjax(url, opts); + } + }, + getJSONP: function (url, data, fn) { + var opts = { + 'data': data, + 'oncomplete': fn + }; + doJsonp(url, opts); + } + }; + + + }(); + + +// core/filterword.js + /** + * UE过滤word的静态方法 + * @file + */ + + /** + * UEditor公用空间,UEditor所有的功能都挂载在该空间下 + * @module UE + */ + + + /** + * 根据传入html字符串过滤word + * @module UE + * @since 1.2.6.1 + * @method filterWord + * @param { String } html html字符串 + * @return { String } 已过滤后的结果字符串 + * @example + * ```javascript + * UE.filterWord(html); + * ``` + */ + var filterWord = UE.filterWord = function () { + + //是否是word过来的内容 + function isWordDocument(str) { + return /(class="?Mso|style="[^"]*\bmso\-|w:WordDocument|<(v|o):|lang=)/ig.test(str); + } + + //去掉小数 + function transUnit(v) { + v = v.replace(/[\d.]+\w+/g, function (m) { + return utils.transUnitToPx(m); + }); + return v; + } + + function filterPasteWord(str) { + return str.replace(/[\t\r\n]+/g, ' ') + .replace(//ig, "") + //转换图片 + .replace(/]*>[\s\S]*?.<\/v:shape>/gi, function (str) { + //opera能自己解析出image所这里直接返回空 + if (browser.opera) { + return ''; + } + try { + //有可能是bitmap占为图,无用,直接过滤掉,主要体现在粘贴excel表格中 + if (/Bitmap/i.test(str)) { + return ''; + } + var width = str.match(/width:([ \d.]*p[tx])/i)[1], + height = str.match(/height:([ \d.]*p[tx])/i)[1], + src = str.match(/src=\s*"([^"]*)"/i)[1]; + return ''; + } catch (e) { + return ''; + } + }) + //针对wps添加的多余标签处理 + .replace(/<\/?div[^>]*>/g, '') + //去掉多余的属性 + .replace(/v:\w+=(["']?)[^'"]+\1/g, '') + .replace(/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|xml|meta|link|style|\w+:\w+)(?=[\s\/>]))[^>]*>/gi, "") + .replace(/

      ]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi, "

      $1

      ") + //去掉多余的属性 + .replace(/\s+(class|lang|align)\s*=\s*(['"]?)([\w-]+)\2/ig, function (str, name, marks, val) { + //保留list的标示 + return name == 'class' && val == 'MsoListParagraph' ? str : '' + }) + //清除多余的font/span不能匹配 有可能是空格 + .replace(/<(font|span)[^>]*>(\s*)<\/\1>/gi, function (a, b, c) { + return c.replace(/[\t\r\n ]+/g, ' ') + }) + //处理style的问题 + .replace(/(<[a-z][^>]*)\sstyle=(["'])([^\2]*?)\2/gi, function (str, tag, tmp, style) { + var n = [], + s = style.replace(/^\s+|\s+$/, '') + .replace(/'/g, '\'') + .replace(/"/gi, "'") + .replace(/[\d.]+(cm|pt)/g, function (str) { + return utils.transUnitToPx(str) + }) + .split(/;\s*/g); + + for (var i = 0, v; v = s[i]; i++) { + + var name, value, + parts = v.split(":"); + + if (parts.length == 2) { + name = parts[0].toLowerCase(); + value = parts[1].toLowerCase(); + if (/^(background)\w*/.test(name) && value.replace(/(initial|\s)/g, '').length == 0 + || + /^(margin)\w*/.test(name) && /^0\w+$/.test(value) + ) { + continue; + } + + switch (name) { + case "mso-padding-alt": + case "mso-padding-top-alt": + case "mso-padding-right-alt": + case "mso-padding-bottom-alt": + case "mso-padding-left-alt": + case "mso-margin-alt": + case "mso-margin-top-alt": + case "mso-margin-right-alt": + case "mso-margin-bottom-alt": + case "mso-margin-left-alt": + //ie下会出现挤到一起的情况 + //case "mso-table-layout-alt": + case "mso-height": + case "mso-width": + case "mso-vertical-align-alt": + //trace:1819 ff下会解析出padding在table上 + if (!/]/.test(html)) { + return UE.htmlparser(html).children[0] + } else { + return new uNode({ + type: 'element', + children: [], + tagName: html + }) + } + }; + uNode.createText = function (data, noTrans) { + return new UE.uNode({ + type: 'text', + 'data': noTrans ? data : utils.unhtml(data || '') + }) + }; + + function nodeToHtml(node, arr, formatter, current) { + switch (node.type) { + case 'root': + for (var i = 0, ci; ci = node.children[i++];) { + //插入新行 + if (formatter && ci.type == 'element' && !dtd.$inlineWithA[ci.tagName] && i > 1) { + insertLine(arr, current, true); + insertIndent(arr, current) + } + nodeToHtml(ci, arr, formatter, current) + } + break; + case 'text': + isText(node, arr); + break; + case 'element': + isElement(node, arr, formatter, current); + break; + case 'comment': + isComment(node, arr, formatter); + } + return arr; + } + + function isText(node, arr) { + if (node.parentNode.tagName == 'pre') { + //源码模式下输入html标签,不能做转换处理,直接输出 + arr.push(node.data) + } else { + arr.push(notTransTagName[node.parentNode.tagName] ? utils.html(node.data) : node.data.replace(/[ ]{2}/g, '  ')) + } + + } + + function isElement(node, arr, formatter, current) { + var attrhtml = ''; + if (node.attrs) { + attrhtml = []; + var attrs = node.attrs; + for (var a in attrs) { + //这里就针对 + //

      '

      + //这里边的\"做转换,要不用innerHTML直接被截断了,属性src + //有可能做的不够 + attrhtml.push(a + (attrs[a] !== undefined ? '="' + (notTransAttrs[a] ? utils.html(attrs[a]).replace(/["]/g, function (a) { + return '"' + }) : utils.unhtml(attrs[a])) + '"' : '')) + } + attrhtml = attrhtml.join(' '); + } + arr.push('<' + node.tagName + + (attrhtml ? ' ' + attrhtml : '') + + (dtd.$empty[node.tagName] ? '\/' : '') + '>' + ); + //插入新行 + if (formatter && !dtd.$inlineWithA[node.tagName] && node.tagName != 'pre') { + if (node.children && node.children.length) { + current = insertLine(arr, current, true); + insertIndent(arr, current) + } + + } + if (node.children && node.children.length) { + for (var i = 0, ci; ci = node.children[i++];) { + if (formatter && ci.type == 'element' && !dtd.$inlineWithA[ci.tagName] && i > 1) { + insertLine(arr, current); + insertIndent(arr, current) + } + nodeToHtml(ci, arr, formatter, current) + } + } + if (!dtd.$empty[node.tagName]) { + if (formatter && !dtd.$inlineWithA[node.tagName] && node.tagName != 'pre') { + + if (node.children && node.children.length) { + current = insertLine(arr, current); + insertIndent(arr, current) + } + } + arr.push('<\/' + node.tagName + '>'); + } + + } + + function isComment(node, arr) { + arr.push(''); + } + + function getNodeById(root, id) { + var node; + if (root.type == 'element' && root.getAttr('id') == id) { + return root; + } + if (root.children && root.children.length) { + for (var i = 0, ci; ci = root.children[i++];) { + if (node = getNodeById(ci, id)) { + return node; + } + } + } + } + + function getNodesByTagName(node, tagName, arr) { + if (node.type == 'element' && node.tagName == tagName) { + arr.push(node); + } + if (node.children && node.children.length) { + for (var i = 0, ci; ci = node.children[i++];) { + getNodesByTagName(ci, tagName, arr) + } + } + } + + function nodeTraversal(root, fn) { + if (root.children && root.children.length) { + for (var i = 0, ci; ci = root.children[i];) { + nodeTraversal(ci, fn); + //ci被替换的情况,这里就不再走 fn了 + if (ci.parentNode) { + if (ci.children && ci.children.length) { + fn(ci) + } + if (ci.parentNode) i++ + } + } + } else { + fn(root) + } + + } + + uNode.prototype = { + + /** + * 当前节点对象,转换成html文本 + * @method toHtml + * @return { String } 返回转换后的html字符串 + * @example + * ```javascript + * node.toHtml(); + * ``` + */ + + /** + * 当前节点对象,转换成html文本 + * @method toHtml + * @param { Boolean } formatter 是否格式化返回值 + * @return { String } 返回转换后的html字符串 + * @example + * ```javascript + * node.toHtml( true ); + * ``` + */ + toHtml: function (formatter) { + var arr = []; + nodeToHtml(this, arr, formatter, 0); + return arr.join('') + }, + + /** + * 获取节点的html内容 + * @method innerHTML + * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 + * @return { String } 返回节点的html内容 + * @example + * ```javascript + * var htmlstr = node.innerHTML(); + * ``` + */ + + /** + * 设置节点的html内容 + * @method innerHTML + * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 + * @param { String } htmlstr 传入要设置的html内容 + * @return { UE.uNode } 返回节点本身 + * @example + * ```javascript + * node.innerHTML('text'); + * ``` + */ + innerHTML: function (htmlstr) { + if (this.type != 'element' || dtd.$empty[this.tagName]) { + return this; + } + if (utils.isString(htmlstr)) { + if (this.children) { + for (var i = 0, ci; ci = this.children[i++];) { + ci.parentNode = null; + } + } + this.children = []; + var tmpRoot = UE.htmlparser(htmlstr); + for (var i = 0, ci; ci = tmpRoot.children[i++];) { + this.children.push(ci); + ci.parentNode = this; + } + return this; + } else { + var tmpRoot = new UE.uNode({ + type: 'root', + children: this.children + }); + return tmpRoot.toHtml(); + } + }, + + /** + * 获取节点的纯文本内容 + * @method innerText + * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 + * @return { String } 返回节点的存文本内容 + * @example + * ```javascript + * var textStr = node.innerText(); + * ``` + */ + + /** + * 设置节点的纯文本内容 + * @method innerText + * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 + * @param { String } textStr 传入要设置的文本内容 + * @return { UE.uNode } 返回节点本身 + * @example + * ```javascript + * node.innerText('text'); + * ``` + */ + innerText: function (textStr, noTrans) { + if (this.type != 'element' || dtd.$empty[this.tagName]) { + return this; + } + if (textStr) { + if (this.children) { + for (var i = 0, ci; ci = this.children[i++];) { + ci.parentNode = null; + } + } + this.children = []; + this.appendChild(uNode.createText(textStr, noTrans)); + return this; + } else { + return this.toHtml().replace(/<[^>]+>/g, ''); + } + }, + + /** + * 获取当前对象的data属性 + * @method getData + * @return { Object } 若节点的type值是elemenet,返回空字符串,否则返回节点的data属性 + * @example + * ```javascript + * node.getData(); + * ``` + */ + getData: function () { + if (this.type == 'element') + return ''; + return this.data + }, + + /** + * 获取当前节点下的第一个子节点 + * @method firstChild + * @return { UE.uNode } 返回第一个子节点 + * @example + * ```javascript + * node.firstChild(); //返回第一个子节点 + * ``` + */ + firstChild: function () { +// if (this.type != 'element' || dtd.$empty[this.tagName]) { +// return this; +// } + return this.children ? this.children[0] : null; + }, + + /** + * 获取当前节点下的最后一个子节点 + * @method lastChild + * @return { UE.uNode } 返回最后一个子节点 + * @example + * ```javascript + * node.lastChild(); //返回最后一个子节点 + * ``` + */ + lastChild: function () { +// if (this.type != 'element' || dtd.$empty[this.tagName] ) { +// return this; +// } + return this.children ? this.children[this.children.length - 1] : null; + }, + + /** + * 获取和当前节点有相同父亲节点的前一个节点 + * @method previousSibling + * @return { UE.uNode } 返回前一个节点 + * @example + * ```javascript + * node.children[2].previousSibling(); //返回子节点node.children[1] + * ``` + */ + previousSibling: function () { + var parent = this.parentNode; + for (var i = 0, ci; ci = parent.children[i]; i++) { + if (ci === this) { + return i == 0 ? null : parent.children[i - 1]; + } + } + + }, + + /** + * 获取和当前节点有相同父亲节点的后一个节点 + * @method nextSibling + * @return { UE.uNode } 返回后一个节点,找不到返回null + * @example + * ```javascript + * node.children[2].nextSibling(); //如果有,返回子节点node.children[3] + * ``` + */ + nextSibling: function () { + var parent = this.parentNode; + for (var i = 0, ci; ci = parent.children[i++];) { + if (ci === this) { + return parent.children[i]; + } + } + }, + + /** + * 用新的节点替换当前节点 + * @method replaceChild + * @param { UE.uNode } target 要替换成该节点参数 + * @param { UE.uNode } source 要被替换掉的节点 + * @return { UE.uNode } 返回替换之后的节点对象 + * @example + * ```javascript + * node.replaceChild(newNode, childNode); //用newNode替换childNode,childNode是node的子节点 + * ``` + */ + replaceChild: function (target, source) { + if (this.children) { + if (target.parentNode) { + target.parentNode.removeChild(target); + } + for (var i = 0, ci; ci = this.children[i]; i++) { + if (ci === source) { + this.children.splice(i, 1, target); + source.parentNode = null; + target.parentNode = this; + return target; + } + } + } + }, + + /** + * 在节点的子节点列表最后位置插入一个节点 + * @method appendChild + * @param { UE.uNode } node 要插入的节点 + * @return { UE.uNode } 返回刚插入的子节点 + * @example + * ```javascript + * node.appendChild( newNode ); //在node内插入子节点newNode + * ``` + */ + appendChild: function (node) { + if (this.type == 'root' || (this.type == 'element' && !dtd.$empty[this.tagName])) { + if (!this.children) { + this.children = [] + } + if (node.parentNode) { + node.parentNode.removeChild(node); + } + for (var i = 0, ci; ci = this.children[i]; i++) { + if (ci === node) { + this.children.splice(i, 1); + break; + } + } + this.children.push(node); + node.parentNode = this; + return node; + } + + + }, + + /** + * 在传入节点的前面插入一个节点 + * @method insertBefore + * @param { UE.uNode } target 要插入的节点 + * @param { UE.uNode } source 在该参数节点前面插入 + * @return { UE.uNode } 返回刚插入的子节点 + * @example + * ```javascript + * node.parentNode.insertBefore(newNode, node); //在node节点后面插入newNode + * ``` + */ + insertBefore: function (target, source) { + if (this.children) { + if (target.parentNode) { + target.parentNode.removeChild(target); + } + for (var i = 0, ci; ci = this.children[i]; i++) { + if (ci === source) { + this.children.splice(i, 0, target); + target.parentNode = this; + return target; + } + } + + } + }, + + /** + * 在传入节点的后面插入一个节点 + * @method insertAfter + * @param { UE.uNode } target 要插入的节点 + * @param { UE.uNode } source 在该参数节点后面插入 + * @return { UE.uNode } 返回刚插入的子节点 + * @example + * ```javascript + * node.parentNode.insertAfter(newNode, node); //在node节点后面插入newNode + * ``` + */ + insertAfter: function (target, source) { + if (this.children) { + if (target.parentNode) { + target.parentNode.removeChild(target); + } + for (var i = 0, ci; ci = this.children[i]; i++) { + if (ci === source) { + this.children.splice(i + 1, 0, target); + target.parentNode = this; + return target; + } + + } + } + }, + + /** + * 从当前节点的子节点列表中,移除节点 + * @method removeChild + * @param { UE.uNode } node 要移除的节点引用 + * @param { Boolean } keepChildren 是否保留移除节点的子节点,若传入true,自动把移除节点的子节点插入到移除的位置 + * @return { * } 返回刚移除的子节点 + * @example + * ```javascript + * node.removeChild(childNode,true); //在node的子节点列表中移除child节点,并且吧child的子节点插入到移除的位置 + * ``` + */ + removeChild: function (node, keepChildren) { + if (this.children) { + for (var i = 0, ci; ci = this.children[i]; i++) { + if (ci === node) { + this.children.splice(i, 1); + ci.parentNode = null; + if (keepChildren && ci.children && ci.children.length) { + for (var j = 0, cj; cj = ci.children[j]; j++) { + this.children.splice(i + j, 0, cj); + cj.parentNode = this; + + } + } + return ci; + } + } + } + }, + + /** + * 获取当前节点所代表的元素属性,即获取attrs对象下的属性值 + * @method getAttr + * @param { String } attrName 要获取的属性名称 + * @return { * } 返回attrs对象下的属性值 + * @example + * ```javascript + * node.getAttr('title'); + * ``` + */ + getAttr: function (attrName) { + return this.attrs && this.attrs[attrName.toLowerCase()] + }, + + /** + * 设置当前节点所代表的元素属性,即设置attrs对象下的属性值 + * @method setAttr + * @param { String } attrName 要设置的属性名称 + * @param { * } attrVal 要设置的属性值,类型视设置的属性而定 + * @return { * } 返回attrs对象下的属性值 + * @example + * ```javascript + * node.setAttr('title','标题'); + * ``` + */ + setAttr: function (attrName, attrVal) { + if (!attrName) { + delete this.attrs; + return; + } + if (!this.attrs) { + this.attrs = {}; + } + if (utils.isObject(attrName)) { + for (var a in attrName) { + if (!attrName[a]) { + delete this.attrs[a] + } else { + this.attrs[a.toLowerCase()] = attrName[a]; + } + } + } else { + if (!attrVal) { + delete this.attrs[attrName] + } else { + this.attrs[attrName.toLowerCase()] = attrVal; + } + + } + }, + + /** + * 获取当前节点在父节点下的位置索引 + * @method getIndex + * @return { Number } 返回索引数值,如果没有父节点,返回-1 + * @example + * ```javascript + * node.getIndex(); + * ``` + */ + getIndex: function () { + var parent = this.parentNode; + for (var i = 0, ci; ci = parent.children[i]; i++) { + if (ci === this) { + return i; + } + } + return -1; + }, + + /** + * 在当前节点下,根据id查找节点 + * @method getNodeById + * @param { String } id 要查找的id + * @return { UE.uNode } 返回找到的节点 + * @example + * ```javascript + * node.getNodeById('textId'); + * ``` + */ + getNodeById: function (id) { + var node; + if (this.children && this.children.length) { + for (var i = 0, ci; ci = this.children[i++];) { + if (node = getNodeById(ci, id)) { + return node; + } + } + } + }, + + /** + * 在当前节点下,根据元素名称查找节点列表 + * @method getNodesByTagName + * @param { String } tagNames 要查找的元素名称 + * @return { Array } 返回找到的节点列表 + * @example + * ```javascript + * node.getNodesByTagName('span'); + * ``` + */ + getNodesByTagName: function (tagNames) { + tagNames = utils.trim(tagNames).replace(/[ ]{2,}/g, ' ').split(' '); + var arr = [], me = this; + utils.each(tagNames, function (tagName) { + if (me.children && me.children.length) { + for (var i = 0, ci; ci = me.children[i++];) { + getNodesByTagName(ci, tagName, arr) + } + } + }); + return arr; + }, + + /** + * 根据样式名称,获取节点的样式值 + * @method getStyle + * @param { String } name 要获取的样式名称 + * @return { String } 返回样式值 + * @example + * ```javascript + * node.getStyle('font-size'); + * ``` + */ + getStyle: function (name) { + var cssStyle = this.getAttr('style'); + if (!cssStyle) { + return '' + } + var reg = new RegExp('(^|;)\\s*' + name + ':([^;]+)', 'i'); + var match = cssStyle.match(reg); + if (match && match[0]) { + return match[2] + } + return ''; + }, + + /** + * 给节点设置样式 + * @method setStyle + * @param { String } name 要设置的的样式名称 + * @param { String } val 要设置的的样值 + * @example + * ```javascript + * node.setStyle('font-size', '12px'); + * ``` + */ + setStyle: function (name, val) { + function exec(name, val) { + var reg = new RegExp('(^|;)\\s*' + name + ':([^;]+;?)', 'gi'); + cssStyle = cssStyle.replace(reg, '$1'); + if (val) { + cssStyle = name + ':' + utils.unhtml(val) + ';' + cssStyle + } + + } + + var cssStyle = this.getAttr('style'); + if (!cssStyle) { + cssStyle = ''; + } + if (utils.isObject(name)) { + for (var a in name) { + exec(a, name[a]) + } + } else { + exec(name, val) + } + this.setAttr('style', utils.trim(cssStyle)) + }, + + /** + * 传入一个函数,递归遍历当前节点下的所有节点 + * @method traversal + * @param { Function } fn 遍历到节点的时,传入节点作为参数,运行此函数 + * @example + * ```javascript + * traversal(node, function(){ + * console.log(node.type); + * }); + * ``` + */ + traversal: function (fn) { + if (this.children && this.children.length) { + nodeTraversal(this, fn); + } + return this; + } + } + })(); + + +// core/htmlparser.js + /** + * html字符串转换成uNode节点 + * @file + * @module UE + * @since 1.2.6.1 + */ + + /** + * UEditor公用空间,UEditor所有的功能都挂载在该空间下 + * @unfile + * @module UE + */ + + /** + * html字符串转换成uNode节点的静态方法 + * @method htmlparser + * @param { String } htmlstr 要转换的html代码 + * @param { Boolean } ignoreBlank 若设置为true,转换的时候忽略\n\r\t等空白字符 + * @return { uNode } 给定的html片段转换形成的uNode对象 + * @example + * ```javascript + * var root = UE.htmlparser('

      htmlparser

      ', true); + * ``` + */ + + var htmlparser = UE.htmlparser = function (htmlstr, ignoreBlank) { + //todo 原来的方式 [^"'<>\/] 有\/就不能配对上 ') + } + html.push('') + } + //禁止指定table-width + return '
      这样的标签了 + //先去掉了,加上的原因忘了,这里先记录 + var re_tag = /<(?:(?:\/([^>]+)>)|(?:!--([\S|\s]*?)-->)|(?:([^\s\/<>]+)\s*((?:(?:"[^"]*")|(?:'[^']*')|[^"'<>])*)\/?>))/g, + re_attr = /([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g; + + //ie下取得的html可能会有\n存在,要去掉,在处理replace(/[\t\r\n]*/g,'');代码高量的\n不能去除 + var allowEmptyTags = { + b: 1, code: 1, i: 1, u: 1, strike: 1, s: 1, tt: 1, strong: 1, q: 1, samp: 1, em: 1, span: 1, + sub: 1, img: 1, sup: 1, font: 1, big: 1, small: 1, iframe: 1, a: 1, br: 1, pre: 1 + }; + htmlstr = htmlstr.replace(new RegExp(domUtils.fillChar, 'g'), ''); + if (!ignoreBlank) { + htmlstr = htmlstr.replace(new RegExp('[\\r\\t\\n' + (ignoreBlank ? '' : ' ') + ']*<\/?(\\w+)\\s*(?:[^>]*)>[\\r\\t\\n' + (ignoreBlank ? '' : ' ') + ']*', 'g'), function (a, b) { + //br暂时单独处理 + if (b && allowEmptyTags[b.toLowerCase()]) { + return a.replace(/(^[\n\r]+)|([\n\r]+$)/g, ''); + } + return a.replace(new RegExp('^[\\r\\n' + (ignoreBlank ? '' : ' ') + ']+'), '').replace(new RegExp('[\\r\\n' + (ignoreBlank ? '' : ' ') + ']+$'), ''); + }); + } + + var notTransAttrs = { + 'href': 1, + 'src': 1 + }; + + var uNode = UE.uNode, + needParentNode = { + 'td': 'tr', + 'tr': ['tbody', 'thead', 'tfoot'], + 'tbody': 'table', + 'th': 'tr', + 'thead': 'table', + 'tfoot': 'table', + 'caption': 'table', + 'li': ['ul', 'ol'], + 'dt': 'dl', + 'dd': 'dl', + 'option': 'select' + }, + needChild = { + 'ol': 'li', + 'ul': 'li' + }; + + function text(parent, data) { + + if (needChild[parent.tagName]) { + var tmpNode = uNode.createElement(needChild[parent.tagName]); + parent.appendChild(tmpNode); + tmpNode.appendChild(uNode.createText(data)); + parent = tmpNode; + } else { + + parent.appendChild(uNode.createText(data)); + } + } + + function element(parent, tagName, htmlattr) { + var needParentTag; + if (needParentTag = needParentNode[tagName]) { + var tmpParent = parent, hasParent; + while (tmpParent.type != 'root') { + if (utils.isArray(needParentTag) ? utils.indexOf(needParentTag, tmpParent.tagName) != -1 : needParentTag == tmpParent.tagName) { + parent = tmpParent; + hasParent = true; + break; + } + tmpParent = tmpParent.parentNode; + } + if (!hasParent) { + parent = element(parent, utils.isArray(needParentTag) ? needParentTag[0] : needParentTag) + } + } + //按dtd处理嵌套 +// if(parent.type != 'root' && !dtd[parent.tagName][tagName]) +// parent = parent.parentNode; + var elm = new uNode({ + parentNode: parent, + type: 'element', + tagName: tagName.toLowerCase(), + //是自闭合的处理一下 + children: dtd.$empty[tagName] ? null : [] + }); + //如果属性存在,处理属性 + if (htmlattr) { + var attrs = {}, match; + while (match = re_attr.exec(htmlattr)) { + attrs[match[1].toLowerCase()] = notTransAttrs[match[1].toLowerCase()] ? (match[2] || match[3] || match[4]) : utils.unhtml(match[2] || match[3] || match[4]) + } + elm.attrs = attrs; + } + //trace:3970 +// //如果parent下不能放elm +// if(dtd.$inline[parent.tagName] && dtd.$block[elm.tagName] && !dtd[parent.tagName][elm.tagName]){ +// parent = parent.parentNode; +// elm.parentNode = parent; +// } + parent.children.push(elm); + //如果是自闭合节点返回父亲节点 + return dtd.$empty[tagName] ? parent : elm + } + + function comment(parent, data) { + parent.children.push(new uNode({ + type: 'comment', + data: data, + parentNode: parent + })); + } + + var match, currentIndex = 0, nextIndex = 0; + //设置根节点 + var root = new uNode({ + type: 'root', + children: [] + }); + var currentParent = root; + + while (match = re_tag.exec(htmlstr)) { + currentIndex = match.index; + try { + if (currentIndex > nextIndex) { + //text node + text(currentParent, htmlstr.slice(nextIndex, currentIndex)); + } + if (match[3]) { + + if (dtd.$cdata[currentParent.tagName]) { + text(currentParent, match[0]); + } else { + //start tag + currentParent = element(currentParent, match[3].toLowerCase(), match[4]); + } + + + } else if (match[1]) { + if (currentParent.type != 'root') { + if (dtd.$cdata[currentParent.tagName] && !dtd.$cdata[match[1]]) { + text(currentParent, match[0]); + } else { + var tmpParent = currentParent; + while (currentParent.type == 'element' && currentParent.tagName != match[1].toLowerCase()) { + currentParent = currentParent.parentNode; + if (currentParent.type == 'root') { + currentParent = tmpParent; + throw 'break' + } + } + //end tag + currentParent = currentParent.parentNode; + } + + } + + } else if (match[2]) { + //comment + comment(currentParent, match[2]) + } + } catch (e) { + } + + nextIndex = re_tag.lastIndex; + + } + //如果结束是文本,就有可能丢掉,所以这里手动判断一下 + //例如
    • sdfsdfsdf
    • sdfsdfsdfsdf + if (nextIndex < htmlstr.length) { + text(currentParent, htmlstr.slice(nextIndex)); + } + return root; + }; + + +// core/filternode.js + /** + * UE过滤节点的静态方法 + * @file + */ + + /** + * UEditor公用空间,UEditor所有的功能都挂载在该空间下 + * @module UE + */ + + + /** + * 根据传入节点和过滤规则过滤相应节点 + * @module UE + * @since 1.2.6.1 + * @method filterNode + * @param { Object } root 指定root节点 + * @param { Object } rules 过滤规则json对象 + * @example + * ```javascript + * UE.filterNode(root,editor.options.filterRules); + * ``` + */ + var filterNode = UE.filterNode = function () { + function filterNode(node, rules) { + switch (node.type) { + case 'text': + break; + case 'element': + var val; + if (val = rules[node.tagName]) { + if (val === '-') { + node.parentNode.removeChild(node) + } else if (utils.isFunction(val)) { + var parentNode = node.parentNode, + index = node.getIndex(); + val(node); + if (node.parentNode) { + if (node.children) { + for (var i = 0, ci; ci = node.children[i];) { + filterNode(ci, rules); + if (ci.parentNode) { + i++; + } + } + } + } else { + for (var i = index, ci; ci = parentNode.children[i];) { + filterNode(ci, rules); + if (ci.parentNode) { + i++; + } + } + } + + + } else { + var attrs = val['$']; + if (attrs && node.attrs) { + var tmpAttrs = {}, tmpVal; + for (var a in attrs) { + tmpVal = node.getAttr(a); + //todo 只先对style单独处理 + if (a == 'style' && utils.isArray(attrs[a])) { + var tmpCssStyle = []; + utils.each(attrs[a], function (v) { + var tmp; + if (tmp = node.getStyle(v)) { + tmpCssStyle.push(v + ':' + tmp); + } + }); + tmpVal = tmpCssStyle.join(';') + } + if (tmpVal) { + tmpAttrs[a] = tmpVal; + } + + } + node.attrs = tmpAttrs; + } + if (node.children) { + for (var i = 0, ci; ci = node.children[i];) { + filterNode(ci, rules); + if (ci.parentNode) { + i++; + } + } + } + } + } else { + //如果不在名单里扣出子节点并删除该节点,cdata除外 + if (dtd.$cdata[node.tagName]) { + node.parentNode.removeChild(node) + } else { + var parentNode = node.parentNode, + index = node.getIndex(); + node.parentNode.removeChild(node, true); + for (var i = index, ci; ci = parentNode.children[i];) { + filterNode(ci, rules); + if (ci.parentNode) { + i++; + } + } + } + } + break; + case 'comment': + node.parentNode.removeChild(node) + } + + } + + return function (root, rules) { + if (utils.isEmptyObject(rules)) { + return root; + } + var val; + if (val = rules['-']) { + utils.each(val.split(' '), function (k) { + rules[k] = '-' + }) + } + for (var i = 0, ci; ci = root.children[i];) { + filterNode(ci, rules); + if (ci.parentNode) { + i++; + } + } + return root; + } + }(); + +// core/plugin.js + /** + * Created with JetBrains PhpStorm. + * User: campaign + * Date: 10/8/13 + * Time: 6:15 PM + * To change this template use File | Settings | File Templates. + */ + UE.plugin = function () { + var _plugins = {}; + return { + register: function (pluginName, fn, oldOptionName, afterDisabled) { + if (oldOptionName && utils.isFunction(oldOptionName)) { + afterDisabled = oldOptionName; + oldOptionName = null + } + _plugins[pluginName] = { + optionName: oldOptionName || pluginName, + execFn: fn, + //当插件被禁用时执行 + afterDisabled: afterDisabled + } + }, + load: function (editor) { + utils.each(_plugins, function (plugin) { + var _export = plugin.execFn.call(editor); + if (editor.options[plugin.optionName] !== false) { + if (_export) { + //后边需要再做扩展 + utils.each(_export, function (v, k) { + switch (k.toLowerCase()) { + case 'shortcutkey': + editor.addshortcutkey(v); + break; + case 'bindevents': + utils.each(v, function (fn, eventName) { + editor.addListener(eventName, fn); + }); + break; + case 'bindmultievents': + utils.each(utils.isArray(v) ? v : [v], function (event) { + var types = utils.trim(event.type).split(/\s+/); + utils.each(types, function (eventName) { + editor.addListener(eventName, event.handler); + }); + }); + break; + case 'commands': + utils.each(v, function (execFn, execName) { + editor.commands[execName] = execFn + }); + break; + case 'outputrule': + editor.addOutputRule(v); + break; + case 'inputrule': + editor.addInputRule(v); + break; + case 'defaultoptions': + editor.setOpt(v) + } + }) + } + + } else if (plugin.afterDisabled) { + plugin.afterDisabled.call(editor) + } + + }); + //向下兼容 + utils.each(UE.plugins, function (plugin) { + plugin.call(editor); + }); + }, + run: function (pluginName, editor) { + var plugin = _plugins[pluginName]; + if (plugin) { + plugin.exeFn.call(editor) + } + } + } + }(); + +// core/keymap.js + var keymap = UE.keymap = { + 'Backspace': 8, + 'Tab': 9, + 'Enter': 13, + + 'Shift': 16, + 'Control': 17, + 'Alt': 18, + 'CapsLock': 20, + + 'Esc': 27, + + 'Spacebar': 32, + + 'PageUp': 33, + 'PageDown': 34, + 'End': 35, + 'Home': 36, + + 'Left': 37, + 'Up': 38, + 'Right': 39, + 'Down': 40, + + 'Insert': 45, + + 'Del': 46, + + 'NumLock': 144, + + 'Cmd': 91, + + '=': 187, + '-': 189, + + "b": 66, + 'i': 73, + //回退 + 'z': 90, + 'y': 89, + //粘贴 + 'v': 86, + 'x': 88, + + 's': 83, + + 'n': 78 + }; + +// core/localstorage.js +//存储媒介封装 + var LocalStorage = UE.LocalStorage = (function () { + + var storage = window.localStorage || getUserData() || null, + LOCAL_FILE = 'localStorage'; + + return { + + saveLocalData: function (key, data) { + + if (storage && data) { + storage.setItem(key, data); + return true; + } + + return false; + + }, + + getLocalData: function (key) { + + if (storage) { + return storage.getItem(key); + } + + return null; + + }, + + removeItem: function (key) { + + storage && storage.removeItem(key); + + } + + }; + + function getUserData() { + + var container = document.createElement("div"); + container.style.display = "none"; + + if (!container.addBehavior) { + return null; + } + + container.addBehavior("#default#userdata"); + + return { + + getItem: function (key) { + + var result = null; + + try { + document.body.appendChild(container); + container.load(LOCAL_FILE); + result = container.getAttribute(key); + document.body.removeChild(container); + } catch (e) { + } + + return result; + + }, + + setItem: function (key, value) { + + document.body.appendChild(container); + container.setAttribute(key, value); + container.save(LOCAL_FILE); + document.body.removeChild(container); + + }, + + //// 暂时没有用到 + //clear: function () { + // + // var expiresTime = new Date(); + // expiresTime.setFullYear(expiresTime.getFullYear() - 1); + // document.body.appendChild(container); + // container.expires = expiresTime.toUTCString(); + // container.save(LOCAL_FILE); + // document.body.removeChild(container); + // + //}, + + removeItem: function (key) { + + document.body.appendChild(container); + container.removeAttribute(key); + container.save(LOCAL_FILE); + document.body.removeChild(container); + + } + + }; + + } + + })(); + + (function () { + + var ROOTKEY = 'ueditor_preference'; + + UE.Editor.prototype.setPreferences = function (key, value) { + var obj = {}; + if (utils.isString(key)) { + obj[key] = value; + } else { + obj = key; + } + var data = LocalStorage.getLocalData(ROOTKEY); + if (data && (data = utils.str2json(data))) { + utils.extend(data, obj); + } else { + data = obj; + } + data && LocalStorage.saveLocalData(ROOTKEY, utils.json2str(data)); + }; + + UE.Editor.prototype.getPreferences = function (key) { + var data = LocalStorage.getLocalData(ROOTKEY); + if (data && (data = utils.str2json(data))) { + return key ? data[key] : data + } + return null; + }; + + UE.Editor.prototype.removePreferences = function (key) { + var data = LocalStorage.getLocalData(ROOTKEY); + if (data && (data = utils.str2json(data))) { + data[key] = undefined; + delete data[key] + } + data && LocalStorage.saveLocalData(ROOTKEY, utils.json2str(data)); + }; + + })(); + + +// plugins/defaultfilter.js +///import core +///plugin 编辑器默认的过滤转换机制 + + UE.plugins['defaultfilter'] = function () { + var me = this; + me.setOpt({ + 'allowDivTransToP': true, + 'disabledTableInTable': true + }); + //默认的过滤处理 + //进入编辑器的内容处理 + me.addInputRule(function (root) { + var allowDivTransToP = this.options.allowDivTransToP; + var val; + + function tdParent(node) { + while (node && node.type == 'element') { + if (node.tagName == 'td') { + return true; + } + node = node.parentNode; + } + return false; + } + + //进行默认的处理 + root.traversal(function (node) { + if (node.type == 'element') { + if (!dtd.$cdata[node.tagName] && me.options.autoClearEmptyNode && dtd.$inline[node.tagName] && !dtd.$empty[node.tagName] && (!node.attrs || utils.isEmptyObject(node.attrs))) { + if (!node.firstChild()) node.parentNode.removeChild(node); + else if (node.tagName == 'span' && (!node.attrs || utils.isEmptyObject(node.attrs))) { + node.parentNode.removeChild(node, true) + } + return; + } + switch (node.tagName) { + case 'style': + case 'script': + node.setAttr({ + cdata_tag: node.tagName, + cdata_data: (node.innerHTML() || ''), + '_ue_custom_node_': 'true' + }); + node.tagName = 'div'; + node.innerHTML(''); + break; + case 'a': + if (val = node.getAttr('href')) { + node.setAttr('_href', val) + } + break; + case 'img': + //todo base64暂时去掉,后边做远程图片上传后,干掉这个 + if (val = node.getAttr('src')) { + if (/^data:/.test(val)) { + node.parentNode.removeChild(node); + break; + } + } + node.setAttr('_src', node.getAttr('src')); + break; + case 'span': + if (browser.webkit && (val = node.getStyle('white-space'))) { + if (/nowrap|normal/.test(val)) { + node.setStyle('white-space', ''); + if (me.options.autoClearEmptyNode && utils.isEmptyObject(node.attrs)) { + node.parentNode.removeChild(node, true) + } + } + } + val = node.getAttr('id'); + if (val && /^_baidu_bookmark_/i.test(val)) { + node.parentNode.removeChild(node) + } + break; + case 'p': + if (val = node.getAttr('align')) { + node.setAttr('align'); + node.setStyle('text-align', val) + } + //trace:3431 +// var cssStyle = node.getAttr('style'); +// if (cssStyle) { +// cssStyle = cssStyle.replace(/(margin|padding)[^;]+/g, ''); +// node.setAttr('style', cssStyle) +// +// } + //p标签不允许嵌套 + utils.each(node.children, function (n) { + if (n.type == 'element' && n.tagName == 'p') { + var next = n.nextSibling(); + node.parentNode.insertAfter(n, node); + var last = n; + while (next) { + var tmp = next.nextSibling(); + node.parentNode.insertAfter(next, last); + last = next; + next = tmp; + } + return false; + } + }); + if (!node.firstChild()) { + node.innerHTML(browser.ie ? ' ' : '
      ') + } + break; + case 'div': + if (node.getAttr('cdata_tag')) { + break; + } + //针对代码这里不处理插入代码的div + val = node.getAttr('class'); + if (val && /^line number\d+/.test(val)) { + break; + } + if (!allowDivTransToP) { + break; + } + var tmpNode, p = UE.uNode.createElement('p'); + while (tmpNode = node.firstChild()) { + if (tmpNode.type == 'text' || !UE.dom.dtd.$block[tmpNode.tagName]) { + p.appendChild(tmpNode); + } else { + if (p.firstChild()) { + node.parentNode.insertBefore(p, node); + p = UE.uNode.createElement('p'); + } else { + node.parentNode.insertBefore(tmpNode, node); + } + } + } + if (p.firstChild()) { + node.parentNode.insertBefore(p, node); + } + node.parentNode.removeChild(node); + break; + case 'dl': + node.tagName = 'ul'; + break; + case 'dt': + case 'dd': + node.tagName = 'li'; + break; + case 'li': + var className = node.getAttr('class'); + if (!className || !/list\-/.test(className)) { + node.setAttr() + } + var tmpNodes = node.getNodesByTagName('ol ul'); + UE.utils.each(tmpNodes, function (n) { + node.parentNode.insertAfter(n, node); + }); + break; + case 'td': + case 'th': + case 'caption': + if (!node.children || !node.children.length) { + node.appendChild(browser.ie11below ? UE.uNode.createText(' ') : UE.uNode.createElement('br')) + } + break; + case 'table': + if (me.options.disabledTableInTable && tdParent(node)) { + node.parentNode.insertBefore(UE.uNode.createText(node.innerText()), node); + node.parentNode.removeChild(node) + } + } + + } +// if(node.type == 'comment'){ +// node.parentNode.removeChild(node); +// } + }) + + }); + + //从编辑器出去的内容处理 + me.addOutputRule(function (root) { + + var val; + root.traversal(function (node) { + if (node.type == 'element') { + + if (me.options.autoClearEmptyNode && dtd.$inline[node.tagName] && !dtd.$empty[node.tagName] && (!node.attrs || utils.isEmptyObject(node.attrs))) { + + if (!node.firstChild()) node.parentNode.removeChild(node); + else if (node.tagName == 'span' && (!node.attrs || utils.isEmptyObject(node.attrs))) { + node.parentNode.removeChild(node, true) + } + return; + } + switch (node.tagName) { + case 'div': + if (val = node.getAttr('cdata_tag')) { + node.tagName = val; + node.appendChild(UE.uNode.createText(node.getAttr('cdata_data'))); + node.setAttr({cdata_tag: '', cdata_data: '', '_ue_custom_node_': ''}); + } + break; + case 'a': + if (val = node.getAttr('_href')) { + node.setAttr({ + 'href': utils.html(val), + '_href': '' + }) + } + break; + break; + case 'span': + val = node.getAttr('id'); + if (val && /^_baidu_bookmark_/i.test(val)) { + node.parentNode.removeChild(node) + } + break; + case 'img': + if (val = node.getAttr('_src')) { + node.setAttr({ + 'src': node.getAttr('_src'), + '_src': '' + }) + } + + + } + } + + }) + + + }); + }; + + +// plugins/inserthtml.js + /** + * 插入html字符串插件 + * @file + * @since 1.2.6.1 + */ + + /** + * 插入html代码 + * @command inserthtml + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } html 插入的html字符串 + * @remaind 插入的标签内容是在当前的选区位置上插入,如果当前是闭合状态,那直接插入内容, 如果当前是选中状态,将先清除当前选中内容后,再做插入 + * @warning 注意:该命令会对当前选区的位置,对插入的内容进行过滤转换处理。 过滤的规则遵循html语意化的原则。 + * @example + * ```javascript + * //xxx[BB]xxx 当前选区为非闭合选区,选中BB这两个文本 + * //执行命令,插入CC + * //插入后的效果 xxxCCxxx + * //

      xx|xxx

      当前选区为闭合状态 + * //插入

      CC

      + * //结果

      xx

      CC

      xxx

      + * //

      xxxx

      |

      xxx

      当前选区在两个p标签之间 + * //插入 xxxx + * //结果

      xxxx

      xxxx

      xxx

      + * ``` + */ + + UE.commands['inserthtml'] = { + execCommand: function (command, html, notNeedFilter) { + var me = this, + range, + div; + if (!html) { + return; + } + if (me.fireEvent('beforeinserthtml', html) === true) { + return; + } + range = me.selection.getRange(); + div = range.document.createElement('div'); + div.style.display = 'inline'; + + if (!notNeedFilter) { + var root = UE.htmlparser(html); + //如果给了过滤规则就先进行过滤 + if (me.options.filterRules) { + UE.filterNode(root, me.options.filterRules); + } + //执行默认的处理 + me.filterInputRule(root); + html = root.toHtml() + } + div.innerHTML = utils.trim(html); + + if (!range.collapsed) { + var tmpNode = range.startContainer; + if (domUtils.isFillChar(tmpNode)) { + range.setStartBefore(tmpNode) + } + tmpNode = range.endContainer; + if (domUtils.isFillChar(tmpNode)) { + range.setEndAfter(tmpNode) + } + range.txtToElmBoundary(); + //结束边界可能放到了br的前边,要把br包含进来 + // x[xxx]
      + if (range.endContainer && range.endContainer.nodeType == 1) { + tmpNode = range.endContainer.childNodes[range.endOffset]; + if (tmpNode && domUtils.isBr(tmpNode)) { + range.setEndAfter(tmpNode); + } + } + if (range.startOffset == 0) { + tmpNode = range.startContainer; + if (domUtils.isBoundaryNode(tmpNode, 'firstChild')) { + tmpNode = range.endContainer; + if (range.endOffset == (tmpNode.nodeType == 3 ? tmpNode.nodeValue.length : tmpNode.childNodes.length) && domUtils.isBoundaryNode(tmpNode, 'lastChild')) { + me.body.innerHTML = '

      ' + (browser.ie ? '' : '
      ') + '

      '; + range.setStart(me.body.firstChild, 0).collapse(true) + + } + } + } + !range.collapsed && range.deleteContents(); + if (range.startContainer.nodeType == 1) { + var child = range.startContainer.childNodes[range.startOffset], pre; + if (child && domUtils.isBlockElm(child) && (pre = child.previousSibling) && domUtils.isBlockElm(pre)) { + range.setEnd(pre, pre.childNodes.length).collapse(); + while (child.firstChild) { + pre.appendChild(child.firstChild); + } + domUtils.remove(child); + } + } + + } + + + var child, parent, pre, tmp, hadBreak = 0, nextNode; + //如果当前位置选中了fillchar要干掉,要不会产生空行 + if (range.inFillChar()) { + child = range.startContainer; + if (domUtils.isFillChar(child)) { + range.setStartBefore(child).collapse(true); + domUtils.remove(child); + } else if (domUtils.isFillChar(child, true)) { + child.nodeValue = child.nodeValue.replace(fillCharReg, ''); + range.startOffset--; + range.collapsed && range.collapse(true) + } + } + //列表单独处理 + var li = domUtils.findParentByTagName(range.startContainer, 'li', true); + if (li) { + var next, last; + while (child = div.firstChild) { + //针对hr单独处理一下先 + while (child && (child.nodeType == 3 || !domUtils.isBlockElm(child) || child.tagName == 'HR')) { + next = child.nextSibling; + range.insertNode(child).collapse(); + last = child; + child = next; + + } + if (child) { + if (/^(ol|ul)$/i.test(child.tagName)) { + while (child.firstChild) { + last = child.firstChild; + domUtils.insertAfter(li, child.firstChild); + li = li.nextSibling; + } + domUtils.remove(child) + } else { + var tmpLi; + next = child.nextSibling; + tmpLi = me.document.createElement('li'); + domUtils.insertAfter(li, tmpLi); + tmpLi.appendChild(child); + last = child; + child = next; + li = tmpLi; + } + } + } + li = domUtils.findParentByTagName(range.startContainer, 'li', true); + if (domUtils.isEmptyBlock(li)) { + domUtils.remove(li) + } + if (last) { + + range.setStartAfter(last).collapse(true).select(true) + } + } else { + while (child = div.firstChild) { + if (hadBreak) { + var p = me.document.createElement('p'); + while (child && (child.nodeType == 3 || !dtd.$block[child.tagName])) { + nextNode = child.nextSibling; + p.appendChild(child); + child = nextNode; + } + if (p.firstChild) { + + child = p + } + } + range.insertNode(child); + nextNode = child.nextSibling; + if (!hadBreak && child.nodeType == domUtils.NODE_ELEMENT && domUtils.isBlockElm(child)) { + + parent = domUtils.findParent(child, function (node) { + return domUtils.isBlockElm(node); + }); + if (parent && parent.tagName.toLowerCase() != 'body' && !(dtd[parent.tagName][child.nodeName] && child.parentNode === parent)) { + if (!dtd[parent.tagName][child.nodeName]) { + pre = parent; + } else { + tmp = child.parentNode; + while (tmp !== parent) { + pre = tmp; + tmp = tmp.parentNode; + + } + } + + + domUtils.breakParent(child, pre || tmp); + //去掉break后前一个多余的节点

      |<[p> ==>

      |

      + var pre = child.previousSibling; + domUtils.trimWhiteTextNode(pre); + if (!pre.childNodes.length) { + domUtils.remove(pre); + } + //trace:2012,在非ie的情况,切开后剩下的节点有可能不能点入光标添加br占位 + + if (!browser.ie && + (next = child.nextSibling) && + domUtils.isBlockElm(next) && + next.lastChild && + !domUtils.isBr(next.lastChild)) { + next.appendChild(me.document.createElement('br')); + } + hadBreak = 1; + } + } + var next = child.nextSibling; + if (!div.firstChild && next && domUtils.isBlockElm(next)) { + + range.setStart(next, 0).collapse(true); + break; + } + range.setEndAfter(child).collapse(); + + } + + child = range.startContainer; + + if (nextNode && domUtils.isBr(nextNode)) { + domUtils.remove(nextNode) + } + //用chrome可能有空白展位符 + if (domUtils.isBlockElm(child) && domUtils.isEmptyNode(child)) { + if (nextNode = child.nextSibling) { + domUtils.remove(child); + if (nextNode.nodeType == 1 && dtd.$block[nextNode.tagName]) { + + range.setStart(nextNode, 0).collapse(true).shrinkBoundary() + } + } else { + + try { + child.innerHTML = browser.ie ? domUtils.fillChar : '
      '; + } catch (e) { + range.setStartBefore(child); + domUtils.remove(child) + } + + } + + } + //加上true因为在删除表情等时会删两次,第一次是删的fillData + try { + range.select(true); + } catch (e) { + } + + } + + + setTimeout(function () { + range = me.selection.getRange(); + range.scrollToView(me.autoHeightEnabled, me.autoHeightEnabled ? domUtils.getXY(me.iframe).y : 0); + me.fireEvent('afterinserthtml', html); + }, 200); + } + }; + + +// plugins/autotypeset.js + /** + * 自动排版 + * @file + * @since 1.2.6.1 + */ + + /** + * 对当前编辑器的内容执行自动排版, 排版的行为根据config配置文件里的“autotypeset”选项进行控制。 + * @command autotypeset + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'autotypeset' ); + * ``` + */ + + UE.plugins['autotypeset'] = function () { + + this.setOpt({ + 'autotypeset': { + mergeEmptyline: true, //合并空行 + removeClass: true, //去掉冗余的class + removeEmptyline: false, //去掉空行 + textAlign: "left", //段落的排版方式,可以是 left,right,center,justify 去掉这个属性表示不执行排版 + imageBlockLine: 'center', //图片的浮动方式,独占一行剧中,左右浮动,默认: center,left,right,none 去掉这个属性表示不执行排版 + pasteFilter: false, //根据规则过滤没事粘贴进来的内容 + clearFontSize: false, //去掉所有的内嵌字号,使用编辑器默认的字号 + clearFontFamily: false, //去掉所有的内嵌字体,使用编辑器默认的字体 + removeEmptyNode: false, // 去掉空节点 + //可以去掉的标签 + removeTagNames: utils.extend({div: 1}, dtd.$removeEmpty), + indent: false, // 行首缩进 + indentValue: '2em', //行首缩进的大小 + bdc2sb: false, + tobdc: false + } + }); + + var me = this, + opt = me.options.autotypeset, + remainClass = { + 'selectTdClass': 1, + 'pagebreak': 1, + 'anchorclass': 1 + }, + remainTag = { + 'li': 1 + }, + tags = { + div: 1, + p: 1, + //trace:2183 这些也认为是行 + blockquote: 1, center: 1, h1: 1, h2: 1, h3: 1, h4: 1, h5: 1, h6: 1, + span: 1 + }, + highlightCont; + //升级了版本,但配置项目里没有autotypeset + if (!opt) { + return; + } + + readLocalOpts(); + + function isLine(node, notEmpty) { + if (!node || node.nodeType == 3) + return 0; + if (domUtils.isBr(node)) + return 1; + if (node && node.parentNode && tags[node.tagName.toLowerCase()]) { + if (highlightCont && highlightCont.contains(node) + || + node.getAttribute('pagebreak') + ) { + return 0; + } + + return notEmpty ? !domUtils.isEmptyBlock(node) : domUtils.isEmptyBlock(node, new RegExp('[\\s' + domUtils.fillChar + + ']', 'g')); + } + } + + function removeNotAttributeSpan(node) { + if (!node.style.cssText) { + domUtils.removeAttributes(node, ['style']); + if (node.tagName.toLowerCase() == 'span' && domUtils.hasNoAttributes(node)) { + domUtils.remove(node, true); + } + } + } + + function autotype(type, html) { + + var me = this, cont; + if (html) { + if (!opt.pasteFilter) { + return; + } + cont = me.document.createElement('div'); + cont.innerHTML = html.html; + } else { + cont = me.document.body; + } + var nodes = domUtils.getElementsByTagName(cont, '*'); + + // 行首缩进,段落方向,段间距,段内间距 + for (var i = 0, ci; ci = nodes[i++];) { + + if (me.fireEvent('excludeNodeinautotype', ci) === true) { + continue; + } + //font-size + if (opt.clearFontSize && ci.style.fontSize) { + domUtils.removeStyle(ci, 'font-size'); + + removeNotAttributeSpan(ci); + + } + //font-family + if (opt.clearFontFamily && ci.style.fontFamily) { + domUtils.removeStyle(ci, 'font-family'); + removeNotAttributeSpan(ci); + } + + if (isLine(ci)) { + //合并空行 + if (opt.mergeEmptyline) { + var next = ci.nextSibling, tmpNode, isBr = domUtils.isBr(ci); + while (isLine(next)) { + tmpNode = next; + next = tmpNode.nextSibling; + if (isBr && (!next || next && !domUtils.isBr(next))) { + break; + } + domUtils.remove(tmpNode); + } + + } + //去掉空行,保留占位的空行 + if (opt.removeEmptyline && domUtils.inDoc(ci, cont) && !remainTag[ci.parentNode.tagName.toLowerCase()]) { + if (domUtils.isBr(ci)) { + next = ci.nextSibling; + if (next && !domUtils.isBr(next)) { + continue; + } + } + domUtils.remove(ci); + continue; + + } + + } + if (isLine(ci, true) && ci.tagName != 'SPAN') { + if (opt.indent) { + ci.style.textIndent = opt.indentValue; + } + if (opt.textAlign) { + ci.style.textAlign = opt.textAlign; + } + // if(opt.lineHeight) + // ci.style.lineHeight = opt.lineHeight + 'cm'; + + } + + //去掉class,保留的class不去掉 + if (opt.removeClass && ci.className && !remainClass[ci.className.toLowerCase()]) { + + if (highlightCont && highlightCont.contains(ci)) { + continue; + } + domUtils.removeAttributes(ci, ['class']); + } + + //表情不处理 + if (opt.imageBlockLine && ci.tagName.toLowerCase() == 'img' && !ci.getAttribute('emotion')) { + if (html) { + var img = ci; + switch (opt.imageBlockLine) { + case 'left': + case 'right': + case 'none': + var pN = img.parentNode, tmpNode, pre, next; + while (dtd.$inline[pN.tagName] || pN.tagName == 'A') { + pN = pN.parentNode; + } + tmpNode = pN; + if (tmpNode.tagName == 'P' && domUtils.getStyle(tmpNode, 'text-align') == 'center') { + if (!domUtils.isBody(tmpNode) && domUtils.getChildCount(tmpNode, function (node) { + return !domUtils.isBr(node) && !domUtils.isWhitespace(node) + }) == 1) { + pre = tmpNode.previousSibling; + next = tmpNode.nextSibling; + if (pre && next && pre.nodeType == 1 && next.nodeType == 1 && pre.tagName == next.tagName && domUtils.isBlockElm(pre)) { + pre.appendChild(tmpNode.firstChild); + while (next.firstChild) { + pre.appendChild(next.firstChild); + } + domUtils.remove(tmpNode); + domUtils.remove(next); + } else { + domUtils.setStyle(tmpNode, 'text-align', ''); + } + + + } + + + } + domUtils.setStyle(img, 'float', opt.imageBlockLine); + break; + case 'center': + if (me.queryCommandValue('imagefloat') != 'center') { + pN = img.parentNode; + domUtils.setStyle(img, 'float', 'none'); + tmpNode = img; + while (pN && domUtils.getChildCount(pN, function (node) { + return !domUtils.isBr(node) && !domUtils.isWhitespace(node) + }) == 1 + && (dtd.$inline[pN.tagName] || pN.tagName == 'A')) { + tmpNode = pN; + pN = pN.parentNode; + } + var pNode = me.document.createElement('p'); + domUtils.setAttributes(pNode, { + + style: 'text-align:center' + }); + tmpNode.parentNode.insertBefore(pNode, tmpNode); + pNode.appendChild(tmpNode); + domUtils.setStyle(tmpNode, 'float', ''); + + } + + + } + } else { + var range = me.selection.getRange(); + range.selectNode(ci).select(); + me.execCommand('imagefloat', opt.imageBlockLine); + } + + } + + //去掉冗余的标签 + if (opt.removeEmptyNode) { + if (opt.removeTagNames[ci.tagName.toLowerCase()] && domUtils.hasNoAttributes(ci) && domUtils.isEmptyBlock(ci)) { + domUtils.remove(ci); + } + } + } + if (opt.tobdc) { + var root = UE.htmlparser(cont.innerHTML); + root.traversal(function (node) { + if (node.type == 'text') { + node.data = ToDBC(node.data) + } + }); + cont.innerHTML = root.toHtml() + } + if (opt.bdc2sb) { + var root = UE.htmlparser(cont.innerHTML); + root.traversal(function (node) { + if (node.type == 'text') { + node.data = DBC2SB(node.data) + } + }); + cont.innerHTML = root.toHtml() + } + if (html) { + html.html = cont.innerHTML; + } + } + + if (opt.pasteFilter) { + me.addListener('beforepaste', autotype); + } + + function DBC2SB(str) { + var result = ''; + for (var i = 0; i < str.length; i++) { + var code = str.charCodeAt(i); //获取当前字符的unicode编码 + if (code >= 65281 && code <= 65373)//在这个unicode编码范围中的是所有的英文字母已经各种字符 + { + result += String.fromCharCode(str.charCodeAt(i) - 65248); //把全角字符的unicode编码转换为对应半角字符的unicode码 + } else if (code == 12288)//空格 + { + result += String.fromCharCode(str.charCodeAt(i) - 12288 + 32); + } else { + result += str.charAt(i); + } + } + return result; + } + + function ToDBC(txtstring) { + txtstring = utils.html(txtstring); + var tmp = ""; + var mark = ""; + /*用于判断,如果是html尖括里的标记,则不进行全角的转换*/ + for (var i = 0; i < txtstring.length; i++) { + if (txtstring.charCodeAt(i) == 32) { + tmp = tmp + String.fromCharCode(12288); + } + else if (txtstring.charCodeAt(i) < 127) { + tmp = tmp + String.fromCharCode(txtstring.charCodeAt(i) + 65248); + } + else { + tmp += txtstring.charAt(i); + } + } + return tmp; + } + + function readLocalOpts() { + var cookieOpt = me.getPreferences('autotypeset'); + utils.extend(me.options.autotypeset, cookieOpt); + } + + me.commands['autotypeset'] = { + execCommand: function () { + me.removeListener('beforepaste', autotype); + if (opt.pasteFilter) { + me.addListener('beforepaste', autotype); + } + autotype.call(me) + } + + }; + + }; + + +// plugins/autosubmit.js + /** + * 快捷键提交 + * @file + * @since 1.2.6.1 + */ + + /** + * 提交表单 + * @command autosubmit + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'autosubmit' ); + * ``` + */ + + UE.plugin.register('autosubmit', function () { + return { + shortcutkey: { + "autosubmit": "ctrl+13" //手动提交 + }, + commands: { + 'autosubmit': { + execCommand: function () { + var me = this, + form = domUtils.findParentByTagName(me.iframe, "form", false); + if (form) { + if (me.fireEvent("beforesubmit") === false) { + return; + } + me.sync(); + form.submit(); + } + } + } + } + } + }); + +// plugins/background.js + /** + * 背景插件,为UEditor提供设置背景功能 + * @file + * @since 1.2.6.1 + */ + UE.plugin.register('background', function () { + var me = this, + cssRuleId = 'editor_background', + isSetColored, + reg = new RegExp('body[\\s]*\\{(.+)\\}', 'i'); + + function stringToObj(str) { + var obj = {}, styles = str.split(';'); + utils.each(styles, function (v) { + var index = v.indexOf(':'), + key = utils.trim(v.substr(0, index)).toLowerCase(); + key && (obj[key] = utils.trim(v.substr(index + 1) || '')); + }); + return obj; + } + + function setBackground(obj) { + if (obj) { + var styles = []; + for (var name in obj) { + if (obj.hasOwnProperty(name)) { + styles.push(name + ":" + obj[name] + '; '); + } + } + utils.cssRule(cssRuleId, styles.length ? ('body{' + styles.join("") + '}') : '', me.document); + } else { + utils.cssRule(cssRuleId, '', me.document) + } + } + + //重写editor.hasContent方法 + + var orgFn = me.hasContents; + me.hasContents = function () { + if (me.queryCommandValue('background')) { + return true + } + return orgFn.apply(me, arguments); + }; + return { + bindEvents: { + 'getAllHtml': function (type, headHtml) { + var body = this.body, + su = domUtils.getComputedStyle(body, "background-image"), + url = ""; + if (su.indexOf(me.options.imagePath) > 0) { + url = su.substring(su.indexOf(me.options.imagePath), su.length - 1).replace(/"|\(|\)/ig, ""); + } else { + url = su != "none" ? su.replace(/url\("?|"?\)/ig, "") : ""; + } + var html = ' '; + headHtml.push(html); + }, + 'aftersetcontent': function () { + if (isSetColored == false) setBackground(); + } + }, + inputRule: function (root) { + isSetColored = false; + utils.each(root.getNodesByTagName('p'), function (p) { + var styles = p.getAttr('data-background'); + if (styles) { + isSetColored = true; + setBackground(stringToObj(styles)); + p.parentNode.removeChild(p); + } + }) + }, + outputRule: function (root) { + var me = this, + styles = (utils.cssRule(cssRuleId, me.document) || '').replace(/[\n\r]+/g, '').match(reg); + if (styles) { + root.appendChild(UE.uNode.createElement('


      ')); + } + }, + commands: { + 'background': { + execCommand: function (cmd, obj) { + setBackground(obj); + }, + queryCommandValue: function () { + var me = this, + styles = (utils.cssRule(cssRuleId, me.document) || '').replace(/[\n\r]+/g, '').match(reg); + return styles ? stringToObj(styles[1]) : null; + }, + notNeedUndo: true + } + } + } + }); + +// plugins/image.js + /** + * 图片插入、排版插件 + * @file + * @since 1.2.6.1 + */ + + /** + * 图片对齐方式 + * @command imagefloat + * @method execCommand + * @remind 值center为独占一行居中 + * @param { String } cmd 命令字符串 + * @param { String } align 对齐方式,可传left、right、none、center + * @remaind center表示图片独占一行 + * @example + * ```javascript + * editor.execCommand( 'imagefloat', 'center' ); + * ``` + */ + + /** + * 如果选区所在位置是图片区域 + * @command imagefloat + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回图片对齐方式 + * @example + * ```javascript + * editor.queryCommandValue( 'imagefloat' ); + * ``` + */ + + UE.commands['imagefloat'] = { + execCommand: function (cmd, align) { + var me = this, + range = me.selection.getRange(); + if (!range.collapsed) { + var img = range.getClosedNode(); + if (img && img.tagName == 'IMG') { + switch (align) { + case 'left': + case 'right': + case 'none': + var pN = img.parentNode, tmpNode, pre, next; + while (dtd.$inline[pN.tagName] || pN.tagName == 'A') { + pN = pN.parentNode; + } + tmpNode = pN; + if (tmpNode.tagName == 'P' && domUtils.getStyle(tmpNode, 'text-align') == 'center') { + if (!domUtils.isBody(tmpNode) && domUtils.getChildCount(tmpNode, function (node) { + return !domUtils.isBr(node) && !domUtils.isWhitespace(node); + }) == 1) { + pre = tmpNode.previousSibling; + next = tmpNode.nextSibling; + if (pre && next && pre.nodeType == 1 && next.nodeType == 1 && pre.tagName == next.tagName && domUtils.isBlockElm(pre)) { + pre.appendChild(tmpNode.firstChild); + while (next.firstChild) { + pre.appendChild(next.firstChild); + } + domUtils.remove(tmpNode); + domUtils.remove(next); + } else { + domUtils.setStyle(tmpNode, 'text-align', ''); + } + + + } + + range.selectNode(img).select(); + } + domUtils.setStyle(img, 'float', align == 'none' ? '' : align); + if (align == 'none') { + domUtils.removeAttributes(img, 'align'); + } + + break; + case 'center': + if (me.queryCommandValue('imagefloat') != 'center') { + pN = img.parentNode; + domUtils.setStyle(img, 'float', ''); + domUtils.removeAttributes(img, 'align'); + tmpNode = img; + while (pN && domUtils.getChildCount(pN, function (node) { + return !domUtils.isBr(node) && !domUtils.isWhitespace(node); + }) == 1 + && (dtd.$inline[pN.tagName] || pN.tagName == 'A')) { + tmpNode = pN; + pN = pN.parentNode; + } + range.setStartBefore(tmpNode).setCursor(false); + pN = me.document.createElement('div'); + pN.appendChild(tmpNode); + domUtils.setStyle(tmpNode, 'float', ''); + + me.execCommand('insertHtml', '

      ' + pN.innerHTML + '

      '); + + tmpNode = me.document.getElementById('_img_parent_tmp'); + tmpNode.removeAttribute('id'); + tmpNode = tmpNode.firstChild; + range.selectNode(tmpNode).select(); + //去掉后边多余的元素 + next = tmpNode.parentNode.nextSibling; + if (next && domUtils.isEmptyNode(next)) { + domUtils.remove(next); + } + + } + + break; + } + + } + } + }, + queryCommandValue: function () { + var range = this.selection.getRange(), + startNode, floatStyle; + if (range.collapsed) { + return 'none'; + } + startNode = range.getClosedNode(); + if (startNode && startNode.nodeType == 1 && startNode.tagName == 'IMG') { + floatStyle = domUtils.getComputedStyle(startNode, 'float') || startNode.getAttribute('align'); + + if (floatStyle == 'none') { + floatStyle = domUtils.getComputedStyle(startNode.parentNode, 'text-align') == 'center' ? 'center' : floatStyle; + } + return { + left: 1, + right: 1, + center: 1 + }[floatStyle] ? floatStyle : 'none'; + } + return 'none'; + + + }, + queryCommandState: function () { + var range = this.selection.getRange(), + startNode; + + if (range.collapsed) return -1; + + startNode = range.getClosedNode(); + if (startNode && startNode.nodeType == 1 && startNode.tagName == 'IMG') { + return 0; + } + return -1; + } + }; + + + /** + * 插入图片 + * @command insertimage + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Object } opt 属性键值对,这些属性都将被复制到当前插入图片 + * @remind 该命令第二个参数可接受一个图片配置项对象的数组,可以插入多张图片, + * 此时数组的每一个元素都是一个Object类型的图片属性集合。 + * @example + * ```javascript + * editor.execCommand( 'insertimage', { + * src:'a/b/c.jpg', + * width:'100', + * height:'100' + * } ); + * ``` + * @example + * ```javascript + * editor.execCommand( 'insertimage', [{ + * src:'a/b/c.jpg', + * width:'100', + * height:'100' + * },{ + * src:'a/b/d.jpg', + * width:'100', + * height:'100' + * }] ); + * ``` + */ + + UE.commands['insertimage'] = { + execCommand: function (cmd, opt) { + + opt = utils.isArray(opt) ? opt : [opt]; + if (!opt.length) { + return; + } + var me = this, + range = me.selection.getRange(), + img = range.getClosedNode(); + + if (me.fireEvent('beforeinsertimage', opt) === true) { + return; + } + + function unhtmlData(imgCi) { + + utils.each('width,height,border,hspace,vspace'.split(','), function (item) { + + if (imgCi[item]) { + imgCi[item] = parseInt(imgCi[item], 10) || 0; + } + }); + + utils.each('src,_src'.split(','), function (item) { + + if (imgCi[item]) { + imgCi[item] = utils.unhtmlForUrl(imgCi[item]); + } + }); + utils.each('title,alt'.split(','), function (item) { + + if (imgCi[item]) { + imgCi[item] = utils.unhtml(imgCi[item]); + } + }); + } + + if (img && /img/i.test(img.tagName) && (img.className != "edui-faked-video" || img.className.indexOf("edui-upload-video") != -1) && !img.getAttribute("word_img")) { + var first = opt.shift(); + var floatStyle = first['floatStyle']; + delete first['floatStyle']; +//// img.style.border = (first.border||0) +"px solid #000"; +//// img.style.margin = (first.margin||0) +"px"; +// img.style.cssText += ';margin:' + (first.margin||0) +"px;" + 'border:' + (first.border||0) +"px solid #000"; + domUtils.setAttributes(img, first); + me.execCommand('imagefloat', floatStyle); + if (opt.length > 0) { + range.setStartAfter(img).setCursor(false, true); + me.execCommand('insertimage', opt); + } + + } else { + var html = [], str = '', ci; + ci = opt[0]; + if (opt.length == 1) { + unhtmlData(ci); + + str = '' + ci.alt + ''; + if (ci['floatStyle'] == 'center') { + str = '

      ' + str + '

      '; + } + html.push(str); + + } else { + for (var i = 0; ci = opt[i++];) { + unhtmlData(ci); + str = '

      '; + html.push(str); + } + } + + me.execCommand('insertHtml', html.join('')); + } + + me.fireEvent('afterinsertimage', opt) + } + }; + + +// plugins/justify.js + /** + * 段落格式 + * @file + * @since 1.2.6.1 + */ + + /** + * 段落对齐方式 + * @command justify + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } align 对齐方式:left => 居左,right => 居右,center => 居中,justify => 两端对齐 + * @example + * ```javascript + * editor.execCommand( 'justify', 'center' ); + * ``` + */ + /** + * 如果选区所在位置是段落区域,返回当前段落对齐方式 + * @command justify + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回段落对齐方式 + * @example + * ```javascript + * editor.queryCommandValue( 'justify' ); + * ``` + */ + + UE.plugins['justify'] = function () { + var me = this, + block = domUtils.isBlockElm, + defaultValue = { + left: 1, + right: 1, + center: 1, + justify: 1 + }, + doJustify = function (range, style) { + var bookmark = range.createBookmark(), + filterFn = function (node) { + return node.nodeType == 1 ? node.tagName.toLowerCase() != 'br' && !domUtils.isBookmarkNode(node) : !domUtils.isWhitespace(node); + }; + + range.enlarge(true); + var bookmark2 = range.createBookmark(), + current = domUtils.getNextDomNode(bookmark2.start, false, filterFn), + tmpRange = range.cloneRange(), + tmpNode; + while (current && !(domUtils.getPosition(current, bookmark2.end) & domUtils.POSITION_FOLLOWING)) { + if (current.nodeType == 3 || !block(current)) { + tmpRange.setStartBefore(current); + while (current && current !== bookmark2.end && !block(current)) { + tmpNode = current; + current = domUtils.getNextDomNode(current, false, null, function (node) { + return !block(node); + }); + } + tmpRange.setEndAfter(tmpNode); + var common = tmpRange.getCommonAncestor(); + if (!domUtils.isBody(common) && block(common)) { + domUtils.setStyles(common, utils.isString(style) ? {'text-align': style} : style); + current = common; + } else { + var p = range.document.createElement('p'); + domUtils.setStyles(p, utils.isString(style) ? {'text-align': style} : style); + var frag = tmpRange.extractContents(); + p.appendChild(frag); + tmpRange.insertNode(p); + current = p; + } + current = domUtils.getNextDomNode(current, false, filterFn); + } else { + current = domUtils.getNextDomNode(current, true, filterFn); + } + } + return range.moveToBookmark(bookmark2).moveToBookmark(bookmark); + }; + + UE.commands['justify'] = { + execCommand: function (cmdName, align) { + var range = this.selection.getRange(), + txt; + + //闭合时单独处理 + if (range.collapsed) { + txt = this.document.createTextNode('p'); + range.insertNode(txt); + } + doJustify(range, align); + if (txt) { + range.setStartBefore(txt).collapse(true); + domUtils.remove(txt); + } + + range.select(); + + + return true; + }, + queryCommandValue: function () { + var startNode = this.selection.getStart(), + value = domUtils.getComputedStyle(startNode, 'text-align'); + return defaultValue[value] ? value : 'left'; + }, + queryCommandState: function () { + var start = this.selection.getStart(), + cell = start && domUtils.findParentByTagName(start, ["td", "th", "caption"], true); + + return cell ? -1 : 0; + } + + }; + }; + + +// plugins/font.js + /** + * 字体颜色,背景色,字号,字体,下划线,删除线 + * @file + * @since 1.2.6.1 + */ + + /** + * 字体颜色 + * @command forecolor + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } value 色值(必须十六进制) + * @example + * ```javascript + * editor.execCommand( 'forecolor', '#000' ); + * ``` + */ + /** + * 返回选区字体颜色 + * @command forecolor + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回字体颜色 + * @example + * ```javascript + * editor.queryCommandValue( 'forecolor' ); + * ``` + */ + + /** + * 字体背景颜色 + * @command backcolor + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } value 色值(必须十六进制) + * @example + * ```javascript + * editor.execCommand( 'backcolor', '#000' ); + * ``` + */ + /** + * 返回选区字体颜色 + * @command backcolor + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回字体背景颜色 + * @example + * ```javascript + * editor.queryCommandValue( 'backcolor' ); + * ``` + */ + + /** + * 字体大小 + * @command fontsize + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } value 字体大小 + * @example + * ```javascript + * editor.execCommand( 'fontsize', '14px' ); + * ``` + */ + /** + * 返回选区字体大小 + * @command fontsize + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回字体大小 + * @example + * ```javascript + * editor.queryCommandValue( 'fontsize' ); + * ``` + */ + + /** + * 字体样式 + * @command fontfamily + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } value 字体样式 + * @example + * ```javascript + * editor.execCommand( 'fontfamily', '微软雅黑' ); + * ``` + */ + /** + * 返回选区字体样式 + * @command fontfamily + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回字体样式 + * @example + * ```javascript + * editor.queryCommandValue( 'fontfamily' ); + * ``` + */ + + /** + * 字体下划线,与删除线互斥 + * @command underline + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'underline' ); + * ``` + */ + + /** + * 字体删除线,与下划线互斥 + * @command strikethrough + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'strikethrough' ); + * ``` + */ + + /** + * 字体边框 + * @command fontborder + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'fontborder' ); + * ``` + */ + + UE.plugins['font'] = function () { + var me = this, + fonts = { + 'forecolor': 'color', + 'backcolor': 'background-color', + 'fontsize': 'font-size', + 'fontfamily': 'font-family', + 'underline': 'text-decoration', + 'strikethrough': 'text-decoration', + 'fontborder': 'border' + }, + needCmd = {'underline': 1, 'strikethrough': 1, 'fontborder': 1}, + needSetChild = { + 'forecolor': 'color', + 'backcolor': 'background-color', + 'fontsize': 'font-size', + 'fontfamily': 'font-family' + + }; + me.setOpt({ + 'fontfamily': [ + {name: 'songti', val: '宋体,SimSun'}, + {name: 'yahei', val: '微软雅黑,Microsoft YaHei'}, + {name: 'kaiti', val: '楷体,楷体_GB2312, SimKai'}, + {name: 'heiti', val: '黑体, SimHei'}, + {name: 'lishu', val: '隶书, SimLi'}, + {name: 'andaleMono', val: 'andale mono'}, + {name: 'arial', val: 'arial, helvetica,sans-serif'}, + {name: 'arialBlack', val: 'arial black,avant garde'}, + {name: 'comicSansMs', val: 'comic sans ms'}, + {name: 'impact', val: 'impact,chicago'}, + {name: 'timesNewRoman', val: 'times new roman'} + ], + 'fontsize': [10, 11, 12, 14, 16, 18, 20, 24, 36] + }); + + function mergeWithParent(node) { + var parent; + while (parent = node.parentNode) { + if (parent.tagName == 'SPAN' && domUtils.getChildCount(parent, function (child) { + return !domUtils.isBookmarkNode(child) && !domUtils.isBr(child) + }) == 1) { + parent.style.cssText += node.style.cssText; + domUtils.remove(node, true); + node = parent; + + } else { + break; + } + } + + } + + function mergeChild(rng, cmdName, value) { + if (needSetChild[cmdName]) { + rng.adjustmentBoundary(); + if (!rng.collapsed && rng.startContainer.nodeType == 1) { + var start = rng.startContainer.childNodes[rng.startOffset]; + if (start && domUtils.isTagNode(start, 'span')) { + var bk = rng.createBookmark(); + utils.each(domUtils.getElementsByTagName(start, 'span'), function (span) { + if (!span.parentNode || domUtils.isBookmarkNode(span)) return; + if (cmdName == 'backcolor' && domUtils.getComputedStyle(span, 'background-color').toLowerCase() === value) { + return; + } + domUtils.removeStyle(span, needSetChild[cmdName]); + if (span.style.cssText.replace(/^\s+$/, '').length == 0) { + domUtils.remove(span, true) + } + }); + rng.moveToBookmark(bk) + } + } + } + + } + + function mergesibling(rng, cmdName, value) { + var collapsed = rng.collapsed, + bk = rng.createBookmark(), common; + if (collapsed) { + common = bk.start.parentNode; + while (dtd.$inline[common.tagName]) { + common = common.parentNode; + } + } else { + common = domUtils.getCommonAncestor(bk.start, bk.end); + } + utils.each(domUtils.getElementsByTagName(common, 'span'), function (span) { + if (!span.parentNode || domUtils.isBookmarkNode(span)) return; + if (/\s*border\s*:\s*none;?\s*/i.test(span.style.cssText)) { + if (/^\s*border\s*:\s*none;?\s*$/.test(span.style.cssText)) { + domUtils.remove(span, true); + } else { + domUtils.removeStyle(span, 'border'); + } + return + } + if (/border/i.test(span.style.cssText) && span.parentNode.tagName == 'SPAN' && /border/i.test(span.parentNode.style.cssText)) { + span.style.cssText = span.style.cssText.replace(/border[^:]*:[^;]+;?/gi, ''); + } + if (!(cmdName == 'fontborder' && value == 'none')) { + var next = span.nextSibling; + while (next && next.nodeType == 1 && next.tagName == 'SPAN') { + if (domUtils.isBookmarkNode(next) && cmdName == 'fontborder') { + span.appendChild(next); + next = span.nextSibling; + continue; + } + if (next.style.cssText == span.style.cssText) { + domUtils.moveChild(next, span); + domUtils.remove(next); + } + if (span.nextSibling === next) + break; + next = span.nextSibling; + } + } + + + mergeWithParent(span); + if (browser.ie && browser.version > 8) { + //拷贝父亲们的特别的属性,这里只做背景颜色的处理 + var parent = domUtils.findParent(span, function (n) { + return n.tagName == 'SPAN' && /background-color/.test(n.style.cssText) + }); + if (parent && !/background-color/.test(span.style.cssText)) { + span.style.backgroundColor = parent.style.backgroundColor; + } + } + + }); + rng.moveToBookmark(bk); + mergeChild(rng, cmdName, value) + } + + me.addInputRule(function (root) { + utils.each(root.getNodesByTagName('u s del font strike'), function (node) { + if (node.tagName == 'font') { + var cssStyle = []; + for (var p in node.attrs) { + switch (p) { + case 'size': + cssStyle.push('font-size:' + + ({ + '1': '10', + '2': '12', + '3': '16', + '4': '18', + '5': '24', + '6': '32', + '7': '48' + }[node.attrs[p]] || node.attrs[p]) + 'px'); + break; + case 'color': + cssStyle.push('color:' + node.attrs[p]); + break; + case 'face': + cssStyle.push('font-family:' + node.attrs[p]); + break; + case 'style': + cssStyle.push(node.attrs[p]); + } + } + node.attrs = { + 'style': cssStyle.join(';') + }; + } else { + var val = node.tagName == 'u' ? 'underline' : 'line-through'; + node.attrs = { + 'style': (node.getAttr('style') || '') + 'text-decoration:' + val + ';' + } + } + node.tagName = 'span'; + }); +// utils.each(root.getNodesByTagName('span'), function (node) { +// var val; +// if(val = node.getAttr('class')){ +// if(/fontstrikethrough/.test(val)){ +// node.setStyle('text-decoration','line-through'); +// if(node.attrs['class']){ +// node.attrs['class'] = node.attrs['class'].replace(/fontstrikethrough/,''); +// }else{ +// node.setAttr('class') +// } +// } +// if(/fontborder/.test(val)){ +// node.setStyle('border','1px solid #000'); +// if(node.attrs['class']){ +// node.attrs['class'] = node.attrs['class'].replace(/fontborder/,''); +// }else{ +// node.setAttr('class') +// } +// } +// } +// }); + }); +// me.addOutputRule(function(root){ +// utils.each(root.getNodesByTagName('span'), function (node) { +// var val; +// if(val = node.getStyle('text-decoration')){ +// if(/line-through/.test(val)){ +// if(node.attrs['class']){ +// node.attrs['class'] += ' fontstrikethrough'; +// }else{ +// node.setAttr('class','fontstrikethrough') +// } +// } +// +// node.setStyle('text-decoration') +// } +// if(val = node.getStyle('border')){ +// if(/1px/.test(val) && /solid/.test(val)){ +// if(node.attrs['class']){ +// node.attrs['class'] += ' fontborder'; +// +// }else{ +// node.setAttr('class','fontborder') +// } +// } +// node.setStyle('border') +// +// } +// }); +// }); + for (var p in fonts) { + (function (cmd, style) { + UE.commands[cmd] = { + execCommand: function (cmdName, value) { + value = value || (this.queryCommandState(cmdName) ? 'none' : cmdName == 'underline' ? 'underline' : + cmdName == 'fontborder' ? '1px solid #000' : + 'line-through'); + var me = this, + range = this.selection.getRange(), + text; + + if (value == 'default') { + + if (range.collapsed) { + text = me.document.createTextNode('font'); + range.insertNode(text).select(); + + } + me.execCommand('removeFormat', 'span,a', style); + if (text) { + range.setStartBefore(text).collapse(true); + domUtils.remove(text); + } + mergesibling(range, cmdName, value); + range.select() + } else { + if (!range.collapsed) { + if (needCmd[cmd] && me.queryCommandValue(cmd)) { + me.execCommand('removeFormat', 'span,a', style); + } + range = me.selection.getRange(); + + range.applyInlineStyle('span', {'style': style + ':' + value}); + mergesibling(range, cmdName, value); + range.select(); + } else { + + var span = domUtils.findParentByTagName(range.startContainer, 'span', true); + text = me.document.createTextNode('font'); + if (span && !span.children.length && !span[browser.ie ? 'innerText' : 'textContent'].replace(fillCharReg, '').length) { + //for ie hack when enter + range.insertNode(text); + if (needCmd[cmd]) { + range.selectNode(text).select(); + me.execCommand('removeFormat', 'span,a', style, null); + + span = domUtils.findParentByTagName(text, 'span', true); + range.setStartBefore(text); + + } + span && (span.style.cssText += ';' + style + ':' + value); + range.collapse(true).select(); + + + } else { + range.insertNode(text); + range.selectNode(text).select(); + span = range.document.createElement('span'); + + if (needCmd[cmd]) { + //a标签内的不处理跳过 + if (domUtils.findParentByTagName(text, 'a', true)) { + range.setStartBefore(text).setCursor(); + domUtils.remove(text); + return; + } + me.execCommand('removeFormat', 'span,a', style); + } + + span.style.cssText = style + ':' + value; + + + text.parentNode.insertBefore(span, text); + //修复,span套span 但样式不继承的问题 + if (!browser.ie || browser.ie && browser.version == 9) { + var spanParent = span.parentNode; + while (!domUtils.isBlockElm(spanParent)) { + if (spanParent.tagName == 'SPAN') { + //opera合并style不会加入";" + span.style.cssText = spanParent.style.cssText + ";" + span.style.cssText; + } + spanParent = spanParent.parentNode; + } + } + + + if (opera) { + setTimeout(function () { + range.setStart(span, 0).collapse(true); + mergesibling(range, cmdName, value); + range.select(); + }); + } else { + range.setStart(span, 0).collapse(true); + mergesibling(range, cmdName, value); + range.select(); + } + + //trace:981 + //domUtils.mergeToParent(span) + } + domUtils.remove(text); + } + + + } + return true; + }, + queryCommandValue: function (cmdName) { + var startNode = this.selection.getStart(); + + //trace:946 + if (cmdName == 'underline' || cmdName == 'strikethrough') { + var tmpNode = startNode, value; + while (tmpNode && !domUtils.isBlockElm(tmpNode) && !domUtils.isBody(tmpNode)) { + if (tmpNode.nodeType == 1) { + value = domUtils.getComputedStyle(tmpNode, style); + if (value != 'none') { + return value; + } + } + + tmpNode = tmpNode.parentNode; + } + return 'none'; + } + if (cmdName == 'fontborder') { + var tmp = startNode, val; + while (tmp && dtd.$inline[tmp.tagName]) { + if (val = domUtils.getComputedStyle(tmp, 'border')) { + + if (/1px/.test(val) && /solid/.test(val)) { + return val; + } + } + tmp = tmp.parentNode; + } + return '' + } + + if (cmdName == 'FontSize') { + var styleVal = domUtils.getComputedStyle(startNode, style), + tmp = /^([\d\.]+)(\w+)$/.exec(styleVal); + + if (tmp) { + + return Math.floor(tmp[1]) + tmp[2]; + + } + + return styleVal; + + } + + return domUtils.getComputedStyle(startNode, style); + }, + queryCommandState: function (cmdName) { + if (!needCmd[cmdName]) + return 0; + var val = this.queryCommandValue(cmdName); + if (cmdName == 'fontborder') { + return /1px/.test(val) && /solid/.test(val) + } else { + return cmdName == 'underline' ? /underline/.test(val) : /line\-through/.test(val); + + } + + } + }; + })(p, fonts[p]); + } + }; + +// plugins/link.js + /** + * 超链接 + * @file + * @since 1.2.6.1 + */ + + /** + * 插入超链接 + * @command link + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Object } options 设置自定义属性,例如:url、title、target + * @example + * ```javascript + * editor.execCommand( 'link', '{ + * url:'ueditor.baidu.com', + * title:'ueditor', + * target:'_blank' + * }' ); + * ``` + */ + /** + * 返回当前选中的第一个超链接节点 + * @command link + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { Element } 超链接节点 + * @example + * ```javascript + * editor.queryCommandValue( 'link' ); + * ``` + */ + + /** + * 取消超链接 + * @command unlink + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'unlink'); + * ``` + */ + + UE.plugins['link'] = function () { + function optimize(range) { + var start = range.startContainer, end = range.endContainer; + + if (start = domUtils.findParentByTagName(start, 'a', true)) { + range.setStartBefore(start); + } + if (end = domUtils.findParentByTagName(end, 'a', true)) { + range.setEndAfter(end); + } + } + + + UE.commands['unlink'] = { + execCommand: function () { + var range = this.selection.getRange(), + bookmark; + if (range.collapsed && !domUtils.findParentByTagName(range.startContainer, 'a', true)) { + return; + } + bookmark = range.createBookmark(); + optimize(range); + range.removeInlineStyle('a').moveToBookmark(bookmark).select(); + }, + queryCommandState: function () { + return !this.highlight && this.queryCommandValue('link') ? 0 : -1; + } + + }; + + function doLink(range, opt, me) { + var rngClone = range.cloneRange(), + link = me.queryCommandValue('link'); + optimize(range = range.adjustmentBoundary()); + var start = range.startContainer; + if (start.nodeType == 1 && link) { + start = start.childNodes[range.startOffset]; + if (start && start.nodeType == 1 && start.tagName == 'A' && /^(?:https?|ftp|file)\s*:\s*\/\//.test(start[browser.ie ? 'innerText' : 'textContent'])) { + start[browser.ie ? 'innerText' : 'textContent'] = utils.html(opt.textValue || opt.href); + + } + } + if (!rngClone.collapsed || link) { + range.removeInlineStyle('a'); + rngClone = range.cloneRange(); + } + + if (rngClone.collapsed) { + var a = range.document.createElement('a'), + text = ''; + if (opt.textValue) { + + text = utils.html(opt.textValue); + delete opt.textValue; + } else { + text = utils.html(opt.href); + + } + domUtils.setAttributes(a, opt); + start = domUtils.findParentByTagName(rngClone.startContainer, 'a', true); + if (start && domUtils.isInNodeEndBoundary(rngClone, start)) { + range.setStartAfter(start).collapse(true); + + } + a[browser.ie ? 'innerText' : 'textContent'] = text; + range.insertNode(a).selectNode(a); + } else { + range.applyInlineStyle('a', opt); + + } + } + + UE.commands['link'] = { + execCommand: function (cmdName, opt) { + var range; + opt._href && (opt._href = utils.unhtml(opt._href, /[<">]/g)); + opt.href && (opt.href = utils.unhtml(opt.href, /[<">]/g)); + opt.textValue && (opt.textValue = utils.unhtml(opt.textValue, /[<">]/g)); + doLink(range = this.selection.getRange(), opt, this); + //闭合都不加占位符,如果加了会在a后边多个占位符节点,导致a是图片背景组成的列表,出现空白问题 + range.collapse().select(true); + + }, + queryCommandValue: function () { + var range = this.selection.getRange(), + node; + if (range.collapsed) { +// node = this.selection.getStart(); + //在ie下getstart()取值偏上了 + node = range.startContainer; + node = node.nodeType == 1 ? node : node.parentNode; + + if (node && (node = domUtils.findParentByTagName(node, 'a', true)) && !domUtils.isInNodeEndBoundary(range, node)) { + + return node; + } + } else { + //trace:1111 如果是

      xx

      startContainer是p就会找不到a + range.shrinkBoundary(); + var start = range.startContainer.nodeType == 3 || !range.startContainer.childNodes[range.startOffset] ? range.startContainer : range.startContainer.childNodes[range.startOffset], + end = range.endContainer.nodeType == 3 || range.endOffset == 0 ? range.endContainer : range.endContainer.childNodes[range.endOffset - 1], + common = range.getCommonAncestor(); + node = domUtils.findParentByTagName(common, 'a', true); + if (!node && common.nodeType == 1) { + + var as = common.getElementsByTagName('a'), + ps, pe; + + for (var i = 0, ci; ci = as[i++];) { + ps = domUtils.getPosition(ci, start), pe = domUtils.getPosition(ci, end); + if ((ps & domUtils.POSITION_FOLLOWING || ps & domUtils.POSITION_CONTAINS) + && + (pe & domUtils.POSITION_PRECEDING || pe & domUtils.POSITION_CONTAINS) + ) { + node = ci; + break; + } + } + } + return node; + } + + }, + queryCommandState: function () { + //判断如果是视频的话连接不可用 + //fix 853 + var img = this.selection.getRange().getClosedNode(), + flag = img && (img.className == "edui-faked-video" || img.className.indexOf("edui-upload-video") != -1); + return flag ? -1 : 0; + } + }; + }; + +// plugins/iframe.js +///import core +///import plugins\inserthtml.js +///commands 插入框架 +///commandsName InsertFrame +///commandsTitle 插入Iframe +///commandsDialog dialogs\insertframe + + UE.plugins['insertframe'] = function () { + var me = this; + + function deleteIframe() { + me._iframe && delete me._iframe; + } + + me.addListener("selectionchange", function () { + deleteIframe(); + }); + + }; + + +// plugins/scrawl.js +///import core +///commands 涂鸦 +///commandsName Scrawl +///commandsTitle 涂鸦 +///commandsDialog dialogs\scrawl + UE.commands['scrawl'] = { + queryCommandState: function () { + return (browser.ie && browser.version <= 8) ? -1 : 0; + } + }; + + +// plugins/removeformat.js + /** + * 清除格式 + * @file + * @since 1.2.6.1 + */ + + /** + * 清除文字样式 + * @command removeformat + * @method execCommand + * @param { String } cmd 命令字符串 + * @param {String} tags 以逗号隔开的标签。如:strong + * @param {String} style 样式如:color + * @param {String} attrs 属性如:width + * @example + * ```javascript + * editor.execCommand( 'removeformat', 'strong','color','width' ); + * ``` + */ + + UE.plugins['removeformat'] = function () { + var me = this; + me.setOpt({ + 'removeFormatTags': 'b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var', + 'removeFormatAttributes': 'class,style,lang,width,height,align,hspace,valign' + }); + me.commands['removeformat'] = { + execCommand: function (cmdName, tags, style, attrs, notIncludeA) { + + var tagReg = new RegExp('^(?:' + (tags || this.options.removeFormatTags).replace(/,/g, '|') + ')$', 'i'), + removeFormatAttributes = style ? [] : (attrs || this.options.removeFormatAttributes).split(','), + range = new dom.Range(this.document), + bookmark, node, parent, + filter = function (node) { + return node.nodeType == 1; + }; + + function isRedundantSpan(node) { + if (node.nodeType == 3 || node.tagName.toLowerCase() != 'span') { + return 0; + } + if (browser.ie) { + //ie 下判断实效,所以只能简单用style来判断 + //return node.style.cssText == '' ? 1 : 0; + var attrs = node.attributes; + if (attrs.length) { + for (var i = 0, l = attrs.length; i < l; i++) { + if (attrs[i].specified) { + return 0; + } + } + return 1; + } + } + return !node.attributes.length; + } + + function doRemove(range) { + + var bookmark1 = range.createBookmark(); + if (range.collapsed) { + range.enlarge(true); + } + + //不能把a标签切了 + if (!notIncludeA) { + var aNode = domUtils.findParentByTagName(range.startContainer, 'a', true); + if (aNode) { + range.setStartBefore(aNode); + } + + aNode = domUtils.findParentByTagName(range.endContainer, 'a', true); + if (aNode) { + range.setEndAfter(aNode); + } + + } + + + bookmark = range.createBookmark(); + + node = bookmark.start; + + //切开始 + while ((parent = node.parentNode) && !domUtils.isBlockElm(parent)) { + domUtils.breakParent(node, parent); + + domUtils.clearEmptySibling(node); + } + if (bookmark.end) { + //切结束 + node = bookmark.end; + while ((parent = node.parentNode) && !domUtils.isBlockElm(parent)) { + domUtils.breakParent(node, parent); + domUtils.clearEmptySibling(node); + } + + //开始去除样式 + var current = domUtils.getNextDomNode(bookmark.start, false, filter), + next; + while (current) { + if (current == bookmark.end) { + break; + } + + next = domUtils.getNextDomNode(current, true, filter); + + if (!dtd.$empty[current.tagName.toLowerCase()] && !domUtils.isBookmarkNode(current)) { + if (tagReg.test(current.tagName)) { + if (style) { + domUtils.removeStyle(current, style); + if (isRedundantSpan(current) && style != 'text-decoration') { + domUtils.remove(current, true); + } + } else { + domUtils.remove(current, true); + } + } else { + //trace:939 不能把list上的样式去掉 + if (!dtd.$tableContent[current.tagName] && !dtd.$list[current.tagName]) { + domUtils.removeAttributes(current, removeFormatAttributes); + if (isRedundantSpan(current)) { + domUtils.remove(current, true); + } + } + + } + } + current = next; + } + } + //trace:1035 + //trace:1096 不能把td上的样式去掉,比如边框 + var pN = bookmark.start.parentNode; + if (domUtils.isBlockElm(pN) && !dtd.$tableContent[pN.tagName] && !dtd.$list[pN.tagName]) { + domUtils.removeAttributes(pN, removeFormatAttributes); + } + pN = bookmark.end.parentNode; + if (bookmark.end && domUtils.isBlockElm(pN) && !dtd.$tableContent[pN.tagName] && !dtd.$list[pN.tagName]) { + domUtils.removeAttributes(pN, removeFormatAttributes); + } + range.moveToBookmark(bookmark).moveToBookmark(bookmark1); + //清除冗余的代码 + var node = range.startContainer, + tmp, + collapsed = range.collapsed; + while (node.nodeType == 1 && domUtils.isEmptyNode(node) && dtd.$removeEmpty[node.tagName]) { + tmp = node.parentNode; + range.setStartBefore(node); + //trace:937 + //更新结束边界 + if (range.startContainer === range.endContainer) { + range.endOffset--; + } + domUtils.remove(node); + node = tmp; + } + + if (!collapsed) { + node = range.endContainer; + while (node.nodeType == 1 && domUtils.isEmptyNode(node) && dtd.$removeEmpty[node.tagName]) { + tmp = node.parentNode; + range.setEndBefore(node); + domUtils.remove(node); + + node = tmp; + } + + + } + } + + + range = this.selection.getRange(); + doRemove(range); + range.select(); + + } + + }; + + }; + + +// plugins/blockquote.js + /** + * 添加引用 + * @file + * @since 1.2.6.1 + */ + + /** + * 添加引用 + * @command blockquote + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'blockquote' ); + * ``` + */ + + /** + * 添加引用 + * @command blockquote + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Object } attrs 节点属性 + * @example + * ```javascript + * editor.execCommand( 'blockquote',{ + * style: "color: red;" + * } ); + * ``` + */ + + + UE.plugins['blockquote'] = function () { + var me = this; + + function getObj(editor) { + return domUtils.filterNodeList(editor.selection.getStartElementPath(), 'blockquote'); + } + + me.commands['blockquote'] = { + execCommand: function (cmdName, attrs) { + var range = this.selection.getRange(), + obj = getObj(this), + blockquote = dtd.blockquote, + bookmark = range.createBookmark(); + + if (obj) { + + var start = range.startContainer, + startBlock = domUtils.isBlockElm(start) ? start : domUtils.findParent(start, function (node) { + return domUtils.isBlockElm(node) + }), + + end = range.endContainer, + endBlock = domUtils.isBlockElm(end) ? end : domUtils.findParent(end, function (node) { + return domUtils.isBlockElm(node) + }); + + //处理一下li + startBlock = domUtils.findParentByTagName(startBlock, 'li', true) || startBlock; + endBlock = domUtils.findParentByTagName(endBlock, 'li', true) || endBlock; + + + if (startBlock.tagName == 'LI' || startBlock.tagName == 'TD' || startBlock === obj || domUtils.isBody(startBlock)) { + domUtils.remove(obj, true); + } else { + domUtils.breakParent(startBlock, obj); + } + + if (startBlock !== endBlock) { + obj = domUtils.findParentByTagName(endBlock, 'blockquote'); + if (obj) { + if (endBlock.tagName == 'LI' || endBlock.tagName == 'TD' || domUtils.isBody(endBlock)) { + obj.parentNode && domUtils.remove(obj, true); + } else { + domUtils.breakParent(endBlock, obj); + } + + } + } + + var blockquotes = domUtils.getElementsByTagName(this.document, 'blockquote'); + for (var i = 0, bi; bi = blockquotes[i++];) { + if (!bi.childNodes.length) { + domUtils.remove(bi); + } else if (domUtils.getPosition(bi, startBlock) & domUtils.POSITION_FOLLOWING && domUtils.getPosition(bi, endBlock) & domUtils.POSITION_PRECEDING) { + domUtils.remove(bi, true); + } + } + + + } else { + + var tmpRange = range.cloneRange(), + node = tmpRange.startContainer.nodeType == 1 ? tmpRange.startContainer : tmpRange.startContainer.parentNode, + preNode = node, + doEnd = 1; + + //调整开始 + while (1) { + if (domUtils.isBody(node)) { + if (preNode !== node) { + if (range.collapsed) { + tmpRange.selectNode(preNode); + doEnd = 0; + } else { + tmpRange.setStartBefore(preNode); + } + } else { + tmpRange.setStart(node, 0); + } + + break; + } + if (!blockquote[node.tagName]) { + if (range.collapsed) { + tmpRange.selectNode(preNode); + } else { + tmpRange.setStartBefore(preNode); + } + break; + } + + preNode = node; + node = node.parentNode; + } + + //调整结束 + if (doEnd) { + preNode = node = node = tmpRange.endContainer.nodeType == 1 ? tmpRange.endContainer : tmpRange.endContainer.parentNode; + while (1) { + + if (domUtils.isBody(node)) { + if (preNode !== node) { + + tmpRange.setEndAfter(preNode); + + } else { + tmpRange.setEnd(node, node.childNodes.length); + } + + break; + } + if (!blockquote[node.tagName]) { + tmpRange.setEndAfter(preNode); + break; + } + + preNode = node; + node = node.parentNode; + } + + } + + + node = range.document.createElement('blockquote'); + domUtils.setAttributes(node, attrs); + node.appendChild(tmpRange.extractContents()); + tmpRange.insertNode(node); + //去除重复的 + var childs = domUtils.getElementsByTagName(node, 'blockquote'); + for (var i = 0, ci; ci = childs[i++];) { + if (ci.parentNode) { + domUtils.remove(ci, true); + } + } + + } + range.moveToBookmark(bookmark).select(); + }, + queryCommandState: function () { + return getObj(this) ? 1 : 0; + } + }; + }; + + +// plugins/convertcase.js + /** + * 大小写转换 + * @file + * @since 1.2.6.1 + */ + + /** + * 把选区内文本变大写,与“tolowercase”命令互斥 + * @command touppercase + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'touppercase' ); + * ``` + */ + + /** + * 把选区内文本变小写,与“touppercase”命令互斥 + * @command tolowercase + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'tolowercase' ); + * ``` + */ + UE.commands['touppercase'] = + UE.commands['tolowercase'] = { + execCommand: function (cmd) { + var me = this; + var rng = me.selection.getRange(); + if (rng.collapsed) { + return rng; + } + var bk = rng.createBookmark(), + bkEnd = bk.end, + filterFn = function (node) { + return !domUtils.isBr(node) && !domUtils.isWhitespace(node); + }, + curNode = domUtils.getNextDomNode(bk.start, false, filterFn); + while (curNode && (domUtils.getPosition(curNode, bkEnd) & domUtils.POSITION_PRECEDING)) { + + if (curNode.nodeType == 3) { + curNode.nodeValue = curNode.nodeValue[cmd == 'touppercase' ? 'toUpperCase' : 'toLowerCase'](); + } + curNode = domUtils.getNextDomNode(curNode, true, filterFn); + if (curNode === bkEnd) { + break; + } + + } + rng.moveToBookmark(bk).select(); + } + }; + + +// plugins/indent.js + /** + * 首行缩进 + * @file + * @since 1.2.6.1 + */ + + /** + * 缩进 + * @command indent + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'indent' ); + * ``` + */ + UE.commands['indent'] = { + execCommand: function () { + var me = this, value = me.queryCommandState("indent") ? "0em" : (me.options.indentValue || '2em'); + me.execCommand('Paragraph', 'p', {style: 'text-indent:' + value}); + }, + queryCommandState: function () { + var pN = domUtils.filterNodeList(this.selection.getStartElementPath(), 'p h1 h2 h3 h4 h5 h6'); + return pN && pN.style.textIndent && parseInt(pN.style.textIndent) ? 1 : 0; + } + + }; + + +// plugins/print.js + /** + * 打印 + * @file + * @since 1.2.6.1 + */ + + /** + * 打印 + * @command print + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'print' ); + * ``` + */ + UE.commands['print'] = { + execCommand: function () { + this.window.print(); + }, + notNeedUndo: 1 + }; + + +// plugins/preview.js + /** + * 预览 + * @file + * @since 1.2.6.1 + */ + + /** + * 预览 + * @command preview + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'preview' ); + * ``` + */ + UE.commands['preview'] = { + execCommand: function () { + var w = window.open('', '_blank', ''), + d = w.document; + d.open(); + d.write('
      ' + this.getContent(null, null, true) + '
      '); + d.close(); + }, + notNeedUndo: 1 + }; + + +// plugins/selectall.js + /** + * 全选 + * @file + * @since 1.2.6.1 + */ + + /** + * 选中所有内容 + * @command selectall + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'selectall' ); + * ``` + */ + UE.plugins['selectall'] = function () { + var me = this; + me.commands['selectall'] = { + execCommand: function () { + //去掉了原生的selectAll,因为会出现报错和当内容为空时,不能出现闭合状态的光标 + var me = this, body = me.body, + range = me.selection.getRange(); + range.selectNodeContents(body); + if (domUtils.isEmptyBlock(body)) { + //opera不能自动合并到元素的里边,要手动处理一下 + if (browser.opera && body.firstChild && body.firstChild.nodeType == 1) { + range.setStartAtFirst(body.firstChild); + } + range.collapse(true); + } + range.select(true); + }, + notNeedUndo: 1 + }; + + + //快捷键 + me.addshortcutkey({ + "selectAll": "ctrl+65" + }); + }; + + +// plugins/paragraph.js + /** + * 段落样式 + * @file + * @since 1.2.6.1 + */ + + /** + * 段落格式 + * @command paragraph + * @method execCommand + * @param { String } cmd 命令字符串 + * @param {String} style 标签值为:'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6' + * @param {Object} attrs 标签的属性 + * @example + * ```javascript + * editor.execCommand( 'Paragraph','h1','{ + * class:'test' + * }' ); + * ``` + */ + + /** + * 返回选区内节点标签名 + * @command paragraph + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 节点标签名 + * @example + * ```javascript + * editor.queryCommandValue( 'Paragraph' ); + * ``` + */ + + UE.plugins['paragraph'] = function () { + var me = this, + block = domUtils.isBlockElm, + notExchange = ['TD', 'LI', 'PRE'], + + doParagraph = function (range, style, attrs, sourceCmdName) { + var bookmark = range.createBookmark(), + filterFn = function (node) { + return node.nodeType == 1 ? node.tagName.toLowerCase() != 'br' && !domUtils.isBookmarkNode(node) : !domUtils.isWhitespace(node); + }, + para; + + range.enlarge(true); + var bookmark2 = range.createBookmark(), + current = domUtils.getNextDomNode(bookmark2.start, false, filterFn), + tmpRange = range.cloneRange(), + tmpNode; + while (current && !(domUtils.getPosition(current, bookmark2.end) & domUtils.POSITION_FOLLOWING)) { + if (current.nodeType == 3 || !block(current)) { + tmpRange.setStartBefore(current); + while (current && current !== bookmark2.end && !block(current)) { + tmpNode = current; + current = domUtils.getNextDomNode(current, false, null, function (node) { + return !block(node); + }); + } + tmpRange.setEndAfter(tmpNode); + + para = range.document.createElement(style); + if (attrs) { + domUtils.setAttributes(para, attrs); + if (sourceCmdName && sourceCmdName == 'customstyle' && attrs.style) { + para.style.cssText = attrs.style; + } + } + para.appendChild(tmpRange.extractContents()); + //需要内容占位 + if (domUtils.isEmptyNode(para)) { + domUtils.fillChar(range.document, para); + + } + + tmpRange.insertNode(para); + + var parent = para.parentNode; + //如果para上一级是一个block元素且不是body,td就删除它 + if (block(parent) && !domUtils.isBody(para.parentNode) && utils.indexOf(notExchange, parent.tagName) == -1) { + //存储dir,style + if (!(sourceCmdName && sourceCmdName == 'customstyle')) { + parent.getAttribute('dir') && para.setAttribute('dir', parent.getAttribute('dir')); + //trace:1070 + parent.style.cssText && (para.style.cssText = parent.style.cssText + ';' + para.style.cssText); + //trace:1030 + parent.style.textAlign && !para.style.textAlign && (para.style.textAlign = parent.style.textAlign); + parent.style.textIndent && !para.style.textIndent && (para.style.textIndent = parent.style.textIndent); + parent.style.padding && !para.style.padding && (para.style.padding = parent.style.padding); + } + + //trace:1706 选择的就是h1-6要删除 + if (attrs && /h\d/i.test(parent.tagName) && !/h\d/i.test(para.tagName)) { + domUtils.setAttributes(parent, attrs); + if (sourceCmdName && sourceCmdName == 'customstyle' && attrs.style) { + parent.style.cssText = attrs.style; + } + domUtils.remove(para, true); + para = parent; + } else { + domUtils.remove(para.parentNode, true); + } + + } + if (utils.indexOf(notExchange, parent.tagName) != -1) { + current = parent; + } else { + current = para; + } + + + current = domUtils.getNextDomNode(current, false, filterFn); + } else { + current = domUtils.getNextDomNode(current, true, filterFn); + } + } + return range.moveToBookmark(bookmark2).moveToBookmark(bookmark); + }; + me.setOpt('paragraph', {'p': '', 'h1': '', 'h2': '', 'h3': '', 'h4': '', 'h5': '', 'h6': ''}); + me.commands['paragraph'] = { + execCommand: function (cmdName, style, attrs, sourceCmdName) { + var range = this.selection.getRange(); + //闭合时单独处理 + if (range.collapsed) { + var txt = this.document.createTextNode('p'); + range.insertNode(txt); + //去掉冗余的fillchar + if (browser.ie) { + var node = txt.previousSibling; + if (node && domUtils.isWhitespace(node)) { + domUtils.remove(node); + } + node = txt.nextSibling; + if (node && domUtils.isWhitespace(node)) { + domUtils.remove(node); + } + } + + } + range = doParagraph(range, style, attrs, sourceCmdName); + if (txt) { + range.setStartBefore(txt).collapse(true); + pN = txt.parentNode; + + domUtils.remove(txt); + + if (domUtils.isBlockElm(pN) && domUtils.isEmptyNode(pN)) { + domUtils.fillNode(this.document, pN); + } + + } + + if (browser.gecko && range.collapsed && range.startContainer.nodeType == 1) { + var child = range.startContainer.childNodes[range.startOffset]; + if (child && child.nodeType == 1 && child.tagName.toLowerCase() == style) { + range.setStart(child, 0).collapse(true); + } + } + //trace:1097 原来有true,原因忘了,但去了就不能清除多余的占位符了 + range.select(); + + + return true; + }, + queryCommandValue: function () { + var node = domUtils.filterNodeList(this.selection.getStartElementPath(), 'p h1 h2 h3 h4 h5 h6'); + return node ? node.tagName.toLowerCase() : ''; + } + }; + }; + + +// plugins/directionality.js + /** + * 设置文字输入的方向的插件 + * @file + * @since 1.2.6.1 + */ + (function () { + var block = domUtils.isBlockElm, + getObj = function (editor) { +// var startNode = editor.selection.getStart(), +// parents; +// if ( startNode ) { +// //查找所有的是block的父亲节点 +// parents = domUtils.findParents( startNode, true, block, true ); +// for ( var i = 0,ci; ci = parents[i++]; ) { +// if ( ci.getAttribute( 'dir' ) ) { +// return ci; +// } +// } +// } + return domUtils.filterNodeList(editor.selection.getStartElementPath(), function (n) { + return n && n.nodeType == 1 && n.getAttribute('dir') + }); + + }, + doDirectionality = function (range, editor, forward) { + + var bookmark, + filterFn = function (node) { + return node.nodeType == 1 ? !domUtils.isBookmarkNode(node) : !domUtils.isWhitespace(node); + }, + + obj = getObj(editor); + + if (obj && range.collapsed) { + obj.setAttribute('dir', forward); + return range; + } + bookmark = range.createBookmark(); + range.enlarge(true); + var bookmark2 = range.createBookmark(), + current = domUtils.getNextDomNode(bookmark2.start, false, filterFn), + tmpRange = range.cloneRange(), + tmpNode; + while (current && !(domUtils.getPosition(current, bookmark2.end) & domUtils.POSITION_FOLLOWING)) { + if (current.nodeType == 3 || !block(current)) { + tmpRange.setStartBefore(current); + while (current && current !== bookmark2.end && !block(current)) { + tmpNode = current; + current = domUtils.getNextDomNode(current, false, null, function (node) { + return !block(node); + }); + } + tmpRange.setEndAfter(tmpNode); + var common = tmpRange.getCommonAncestor(); + if (!domUtils.isBody(common) && block(common)) { + //遍历到了block节点 + common.setAttribute('dir', forward); + current = common; + } else { + //没有遍历到,添加一个block节点 + var p = range.document.createElement('p'); + p.setAttribute('dir', forward); + var frag = tmpRange.extractContents(); + p.appendChild(frag); + tmpRange.insertNode(p); + current = p; + } + + current = domUtils.getNextDomNode(current, false, filterFn); + } else { + current = domUtils.getNextDomNode(current, true, filterFn); + } + } + return range.moveToBookmark(bookmark2).moveToBookmark(bookmark); + }; + + /** + * 文字输入方向 + * @command directionality + * @method execCommand + * @param { String } cmdName 命令字符串 + * @param { String } forward 传入'ltr'表示从左向右输入,传入'rtl'表示从右向左输入 + * @example + * ```javascript + * editor.execCommand( 'directionality', 'ltr'); + * ``` + */ + + /** + * 查询当前选区的文字输入方向 + * @command directionality + * @method queryCommandValue + * @param { String } cmdName 命令字符串 + * @return { String } 返回'ltr'表示从左向右输入,返回'rtl'表示从右向左输入 + * @example + * ```javascript + * editor.queryCommandValue( 'directionality'); + * ``` + */ + UE.commands['directionality'] = { + execCommand: function (cmdName, forward) { + var range = this.selection.getRange(); + //闭合时单独处理 + if (range.collapsed) { + var txt = this.document.createTextNode('d'); + range.insertNode(txt); + } + doDirectionality(range, this, forward); + if (txt) { + range.setStartBefore(txt).collapse(true); + domUtils.remove(txt); + } + + range.select(); + return true; + }, + queryCommandValue: function () { + var node = getObj(this); + return node ? node.getAttribute('dir') : 'ltr'; + } + }; + })(); + + +// plugins/horizontal.js + /** + * 插入分割线插件 + * @file + * @since 1.2.6.1 + */ + + /** + * 插入分割线 + * @command horizontal + * @method execCommand + * @param { String } cmdName 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'horizontal' ); + * ``` + */ + UE.plugins['horizontal'] = function () { + var me = this; + me.commands['horizontal'] = { + execCommand: function (cmdName) { + var me = this; + if (me.queryCommandState(cmdName) !== -1) { + me.execCommand('insertHtml', '
      '); + var range = me.selection.getRange(), + start = range.startContainer; + if (start.nodeType == 1 && !start.childNodes[range.startOffset]) { + + var tmp; + if (tmp = start.childNodes[range.startOffset - 1]) { + if (tmp.nodeType == 1 && tmp.tagName == 'HR') { + if (me.options.enterTag == 'p') { + tmp = me.document.createElement('p'); + range.insertNode(tmp); + range.setStart(tmp, 0).setCursor(); + + } else { + tmp = me.document.createElement('br'); + range.insertNode(tmp); + range.setStartBefore(tmp).setCursor(); + } + } + } + + } + return true; + } + + }, + //边界在table里不能加分隔线 + queryCommandState: function () { + return domUtils.filterNodeList(this.selection.getStartElementPath(), 'table') ? -1 : 0; + } + }; +// me.addListener('delkeyup',function(){ +// var rng = this.selection.getRange(); +// if(browser.ie && browser.version > 8){ +// rng.txtToElmBoundary(true); +// if(domUtils.isStartInblock(rng)){ +// var tmpNode = rng.startContainer; +// var pre = tmpNode.previousSibling; +// if(pre && domUtils.isTagNode(pre,'hr')){ +// domUtils.remove(pre); +// rng.select(); +// return; +// } +// } +// } +// if(domUtils.isBody(rng.startContainer)){ +// var hr = rng.startContainer.childNodes[rng.startOffset -1]; +// if(hr && hr.nodeName == 'HR'){ +// var next = hr.nextSibling; +// if(next){ +// rng.setStart(next,0) +// }else if(hr.previousSibling){ +// rng.setStartAtLast(hr.previousSibling) +// }else{ +// var p = this.document.createElement('p'); +// hr.parentNode.insertBefore(p,hr); +// domUtils.fillNode(this.document,p); +// rng.setStart(p,0); +// } +// domUtils.remove(hr); +// rng.setCursor(false,true); +// } +// } +// }) + me.addListener('delkeydown', function (name, evt) { + var rng = this.selection.getRange(); + rng.txtToElmBoundary(true); + if (domUtils.isStartInblock(rng)) { + var tmpNode = rng.startContainer; + var pre = tmpNode.previousSibling; + if (pre && domUtils.isTagNode(pre, 'hr')) { + domUtils.remove(pre); + rng.select(); + domUtils.preventDefault(evt); + return true; + + } + } + + }) + }; + + +// plugins/time.js + /** + * 插入时间和日期 + * @file + * @since 1.2.6.1 + */ + + /** + * 插入时间,默认格式:12:59:59 + * @command time + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'time'); + * ``` + */ + + /** + * 插入日期,默认格式:2013-08-30 + * @command date + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'date'); + * ``` + */ + UE.commands['time'] = UE.commands["date"] = { + execCommand: function (cmd, format) { + var date = new Date; + + function formatTime(date, format) { + var hh = ('0' + date.getHours()).slice(-2), + ii = ('0' + date.getMinutes()).slice(-2), + ss = ('0' + date.getSeconds()).slice(-2); + format = format || 'hh:ii:ss'; + return format.replace(/hh/ig, hh).replace(/ii/ig, ii).replace(/ss/ig, ss); + } + + function formatDate(date, format) { + var yyyy = ('000' + date.getFullYear()).slice(-4), + yy = yyyy.slice(-2), + mm = ('0' + (date.getMonth() + 1)).slice(-2), + dd = ('0' + date.getDate()).slice(-2); + format = format || 'yyyy-mm-dd'; + return format.replace(/yyyy/ig, yyyy).replace(/yy/ig, yy).replace(/mm/ig, mm).replace(/dd/ig, dd); + } + + this.execCommand('insertHtml', cmd == "time" ? formatTime(date, format) : formatDate(date, format)); + } + }; + + +// plugins/rowspacing.js + /** + * 段前段后间距插件 + * @file + * @since 1.2.6.1 + */ + + /** + * 设置段间距 + * @command rowspacing + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } value 段间距的值,以px为单位 + * @param { String } dir 间距位置,top或bottom,分别表示段前和段后 + * @example + * ```javascript + * editor.execCommand( 'rowspacing', '10', 'top' ); + * ``` + */ + + UE.plugins['rowspacing'] = function () { + var me = this; + me.setOpt({ + 'rowspacingtop': ['5', '10', '15', '20', '25'], + 'rowspacingbottom': ['5', '10', '15', '20', '25'] + + }); + me.commands['rowspacing'] = { + execCommand: function (cmdName, value, dir) { + this.execCommand('paragraph', 'p', {style: 'margin-' + dir + ':' + value + 'px'}); + return true; + }, + queryCommandValue: function (cmdName, dir) { + var pN = domUtils.filterNodeList(this.selection.getStartElementPath(), function (node) { + return domUtils.isBlockElm(node) + }), + value; + //trace:1026 + if (pN) { + value = domUtils.getComputedStyle(pN, 'margin-' + dir).replace(/[^\d]/g, ''); + return !value ? 0 : value; + } + return 0; + + } + }; + }; + + +// plugins/lineheight.js + /** + * 设置行内间距 + * @file + * @since 1.2.6.1 + */ + UE.plugins['lineheight'] = function () { + var me = this; + me.setOpt({'lineheight': ['1', '1.5', '1.75', '2', '3', '4', '5']}); + + /** + * 行距 + * @command lineheight + * @method execCommand + * @param { String } cmdName 命令字符串 + * @param { String } value 传入的行高值, 该值是当前字体的倍数, 例如: 1.5, 1.75 + * @example + * ```javascript + * editor.execCommand( 'lineheight', 1.5); + * ``` + */ + /** + * 查询当前选区内容的行高大小 + * @command lineheight + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回当前行高大小 + * @example + * ```javascript + * editor.queryCommandValue( 'lineheight' ); + * ``` + */ + + me.commands['lineheight'] = { + execCommand: function (cmdName, value) { + this.execCommand('paragraph', 'p', {style: 'line-height:' + (value == "1" ? "normal" : value + 'em')}); + return true; + }, + queryCommandValue: function () { + var pN = domUtils.filterNodeList(this.selection.getStartElementPath(), function (node) { + return domUtils.isBlockElm(node) + }); + if (pN) { + var value = domUtils.getComputedStyle(pN, 'line-height'); + return value == 'normal' ? 1 : value.replace(/[^\d.]*/ig, ""); + } + } + }; + }; + + +// plugins/insertcode.js + /** + * 插入代码插件 + * @file + * @since 1.2.6.1 + */ + + UE.plugins['insertcode'] = function () { + var me = this; + me.ready(function () { + utils.cssRule('pre', 'pre{margin:.5em 0;padding:.4em .6em;border-radius:8px;background:#f8f8f8;}', + me.document) + }); + me.setOpt('insertcode', { + 'as3': 'ActionScript3', + 'bash': 'Bash/Shell', + 'cpp': 'C/C++', + 'css': 'Css', + 'cf': 'CodeFunction', + 'c#': 'C#', + 'delphi': 'Delphi', + 'diff': 'Diff', + 'erlang': 'Erlang', + 'groovy': 'Groovy', + 'html': 'Html', + 'java': 'Java', + 'jfx': 'JavaFx', + 'js': 'Javascript', + 'pl': 'Perl', + 'php': 'Php', + 'plain': 'Plain Text', + 'ps': 'PowerShell', + 'python': 'Python', + 'ruby': 'Ruby', + 'scala': 'Scala', + 'sql': 'Sql', + 'vb': 'Vb', + 'xml': 'Xml' + }); + + /** + * 插入代码 + * @command insertcode + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } lang 插入代码的语言 + * @example + * ```javascript + * editor.execCommand( 'insertcode', 'javascript' ); + * ``` + */ + + /** + * 如果选区所在位置是插入插入代码区域,返回代码的语言 + * @command insertcode + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回代码的语言 + * @example + * ```javascript + * editor.queryCommandValue( 'insertcode' ); + * ``` + */ + + me.commands['insertcode'] = { + execCommand: function (cmd, lang) { + var me = this, + rng = me.selection.getRange(), + pre = domUtils.findParentByTagName(rng.startContainer, 'pre', true); + if (pre) { + pre.className = 'brush:' + lang + ';toolbar:false;'; + } else { + var code = ''; + if (rng.collapsed) { + code = browser.ie && browser.ie11below ? (browser.version <= 8 ? ' ' : '') : '
      '; + } else { + var frag = rng.extractContents(); + var div = me.document.createElement('div'); + div.appendChild(frag); + + utils.each(UE.filterNode(UE.htmlparser(div.innerHTML.replace(/[\r\t]/g, '')), me.options.filterTxtRules).children, function (node) { + if (browser.ie && browser.ie11below && browser.version > 8) { + + if (node.type == 'element') { + if (node.tagName == 'br') { + code += '\n' + } else if (!dtd.$empty[node.tagName]) { + utils.each(node.children, function (cn) { + if (cn.type == 'element') { + if (cn.tagName == 'br') { + code += '\n' + } else if (!dtd.$empty[node.tagName]) { + code += cn.innerText(); + } + } else { + code += cn.data + } + }) + if (!/\n$/.test(code)) { + code += '\n'; + } + } + } else { + code += node.data + '\n' + } + if (!node.nextSibling() && /\n$/.test(code)) { + code = code.replace(/\n$/, ''); + } + } else { + if (browser.ie && browser.ie11below) { + + if (node.type == 'element') { + if (node.tagName == 'br') { + code += '
      ' + } else if (!dtd.$empty[node.tagName]) { + utils.each(node.children, function (cn) { + if (cn.type == 'element') { + if (cn.tagName == 'br') { + code += '
      ' + } else if (!dtd.$empty[node.tagName]) { + code += cn.innerText(); + } + } else { + code += cn.data + } + }); + if (!/br>$/.test(code)) { + code += '
      '; + } + } + } else { + code += node.data + '
      ' + } + if (!node.nextSibling() && /
      $/.test(code)) { + code = code.replace(/
      $/, ''); + } + + } else { + code += (node.type == 'element' ? (dtd.$empty[node.tagName] ? '' : node.innerText()) : node.data); + if (!/br\/?\s*>$/.test(code)) { + if (!node.nextSibling()) + return; + code += '
      ' + } + } + + } + + }); + } + me.execCommand('inserthtml', '
      ' + code + '
      ', true); + + pre = me.document.getElementById('coder'); + domUtils.removeAttributes(pre, 'id'); + var tmpNode = pre.previousSibling; + + if (tmpNode && (tmpNode.nodeType == 3 && tmpNode.nodeValue.length == 1 && browser.ie && browser.version == 6 || domUtils.isEmptyBlock(tmpNode))) { + + domUtils.remove(tmpNode) + } + var rng = me.selection.getRange(); + if (domUtils.isEmptyBlock(pre)) { + rng.setStart(pre, 0).setCursor(false, true) + } else { + rng.selectNodeContents(pre).select() + } + } + + + }, + queryCommandValue: function () { + var path = this.selection.getStartElementPath(); + var lang = ''; + utils.each(path, function (node) { + if (node.nodeName == 'PRE') { + var match = node.className.match(/brush:([^;]+)/); + lang = match && match[1] ? match[1] : ''; + return false; + } + }); + return lang; + } + }; + + me.addInputRule(function (root) { + utils.each(root.getNodesByTagName('pre'), function (pre) { + var brs = pre.getNodesByTagName('br'); + if (brs.length) { + browser.ie && browser.ie11below && browser.version > 8 && utils.each(brs, function (br) { + var txt = UE.uNode.createText('\n'); + br.parentNode.insertBefore(txt, br); + br.parentNode.removeChild(br); + }); + return; + } + if (browser.ie && browser.ie11below && browser.version > 8) + return; + var code = pre.innerText().split(/\n/); + pre.innerHTML(''); + utils.each(code, function (c) { + if (c.length) { + pre.appendChild(UE.uNode.createText(c)); + } + pre.appendChild(UE.uNode.createElement('br')) + }) + }) + }); + me.addOutputRule(function (root) { + utils.each(root.getNodesByTagName('pre'), function (pre) { + var code = ''; + utils.each(pre.children, function (n) { + if (n.type == 'text') { + //在ie下文本内容有可能末尾带有\n要去掉 + //trace:3396 + code += n.data.replace(/[ ]/g, ' ').replace(/\n$/, ''); + } else { + if (n.tagName == 'br') { + code += '\n' + } else { + code += (!dtd.$empty[n.tagName] ? '' : n.innerText()); + } + + } + + }); + + pre.innerText(code.replace(/( |\n)+$/, '')) + }) + }); + //不需要判断highlight的command列表 + me.notNeedCodeQuery = { + help: 1, + undo: 1, + redo: 1, + source: 1, + print: 1, + searchreplace: 1, + fullscreen: 1, + preview: 1, + insertparagraph: 1, + elementpath: 1, + insertcode: 1, + inserthtml: 1, + selectall: 1 + }; + //将queyCommamndState重置 + var orgQuery = me.queryCommandState; + me.queryCommandState = function (cmd) { + var me = this; + + if (!me.notNeedCodeQuery[cmd.toLowerCase()] && me.selection && me.queryCommandValue('insertcode')) { + return -1; + } + return UE.Editor.prototype.queryCommandState.apply(this, arguments) + }; + me.addListener('beforeenterkeydown', function () { + var rng = me.selection.getRange(); + var pre = domUtils.findParentByTagName(rng.startContainer, 'pre', true); + if (pre) { + me.fireEvent('saveScene'); + if (!rng.collapsed) { + rng.deleteContents(); + } + if (!browser.ie || browser.ie9above) { + var tmpNode = me.document.createElement('br'), pre; + rng.insertNode(tmpNode).setStartAfter(tmpNode).collapse(true); + var next = tmpNode.nextSibling; + if (!next && (!browser.ie || browser.version > 10)) { + rng.insertNode(tmpNode.cloneNode(false)); + } else { + rng.setStartAfter(tmpNode); + } + pre = tmpNode.previousSibling; + var tmp; + while (pre) { + tmp = pre; + pre = pre.previousSibling; + if (!pre || pre.nodeName == 'BR') { + pre = tmp; + break; + } + } + if (pre) { + var str = ''; + while (pre && pre.nodeName != 'BR' && new RegExp('^[\\s' + domUtils.fillChar + ']*$').test(pre.nodeValue)) { + str += pre.nodeValue; + pre = pre.nextSibling; + } + if (pre.nodeName != 'BR') { + var match = pre.nodeValue.match(new RegExp('^([\\s' + domUtils.fillChar + ']+)')); + if (match && match[1]) { + str += match[1] + } + + } + if (str) { + str = me.document.createTextNode(str); + rng.insertNode(str).setStartAfter(str); + } + } + rng.collapse(true).select(true); + } else { + if (browser.version > 8) { + + var txt = me.document.createTextNode('\n'); + var start = rng.startContainer; + if (rng.startOffset == 0) { + var preNode = start.previousSibling; + if (preNode) { + rng.insertNode(txt); + var fillchar = me.document.createTextNode(' '); + rng.setStartAfter(txt).insertNode(fillchar).setStart(fillchar, 0).collapse(true).select(true) + } + } else { + rng.insertNode(txt).setStartAfter(txt); + var fillchar = me.document.createTextNode(' '); + start = rng.startContainer.childNodes[rng.startOffset]; + if (start && !/^\n/.test(start.nodeValue)) { + rng.setStartBefore(txt) + } + rng.insertNode(fillchar).setStart(fillchar, 0).collapse(true).select(true) + } + + } else { + var tmpNode = me.document.createElement('br'); + rng.insertNode(tmpNode); + rng.insertNode(me.document.createTextNode(domUtils.fillChar)); + rng.setStartAfter(tmpNode); + pre = tmpNode.previousSibling; + var tmp; + while (pre) { + tmp = pre; + pre = pre.previousSibling; + if (!pre || pre.nodeName == 'BR') { + pre = tmp; + break; + } + } + if (pre) { + var str = ''; + while (pre && pre.nodeName != 'BR' && new RegExp('^[ ' + domUtils.fillChar + ']*$').test(pre.nodeValue)) { + str += pre.nodeValue; + pre = pre.nextSibling; + } + if (pre.nodeName != 'BR') { + var match = pre.nodeValue.match(new RegExp('^([ ' + domUtils.fillChar + ']+)')); + if (match && match[1]) { + str += match[1] + } + + } + + str = me.document.createTextNode(str); + rng.insertNode(str).setStartAfter(str); + } + rng.collapse(true).select(); + } + + + } + me.fireEvent('saveScene'); + return true; + } + + + }); + + me.addListener('tabkeydown', function (cmd, evt) { + var rng = me.selection.getRange(); + var pre = domUtils.findParentByTagName(rng.startContainer, 'pre', true); + if (pre) { + me.fireEvent('saveScene'); + if (evt.shiftKey) { + + } else { + if (!rng.collapsed) { + var bk = rng.createBookmark(); + var start = bk.start.previousSibling; + + while (start) { + if (pre.firstChild === start && !domUtils.isBr(start)) { + pre.insertBefore(me.document.createTextNode(' '), start); + + break; + } + if (domUtils.isBr(start)) { + pre.insertBefore(me.document.createTextNode(' '), start.nextSibling); + + break; + } + start = start.previousSibling; + } + var end = bk.end; + start = bk.start.nextSibling; + if (pre.firstChild === bk.start) { + pre.insertBefore(me.document.createTextNode(' '), start.nextSibling) + + } + while (start && start !== end) { + if (domUtils.isBr(start) && start.nextSibling) { + if (start.nextSibling === end) { + break; + } + pre.insertBefore(me.document.createTextNode(' '), start.nextSibling) + } + + start = start.nextSibling; + } + rng.moveToBookmark(bk).select(); + } else { + var tmpNode = me.document.createTextNode(' '); + rng.insertNode(tmpNode).setStartAfter(tmpNode).collapse(true).select(true); + } + } + + + me.fireEvent('saveScene'); + return true; + } + + + }); + + + me.addListener('beforeinserthtml', function (evtName, html) { + var me = this, + rng = me.selection.getRange(), + pre = domUtils.findParentByTagName(rng.startContainer, 'pre', true); + if (pre) { + if (!rng.collapsed) { + rng.deleteContents() + } + var htmlstr = ''; + if (browser.ie && browser.version > 8) { + + utils.each(UE.filterNode(UE.htmlparser(html), me.options.filterTxtRules).children, function (node) { + if (node.type == 'element') { + if (node.tagName == 'br') { + htmlstr += '\n' + } else if (!dtd.$empty[node.tagName]) { + utils.each(node.children, function (cn) { + if (cn.type == 'element') { + if (cn.tagName == 'br') { + htmlstr += '\n' + } else if (!dtd.$empty[node.tagName]) { + htmlstr += cn.innerText(); + } + } else { + htmlstr += cn.data + } + }) + if (!/\n$/.test(htmlstr)) { + htmlstr += '\n'; + } + } + } else { + htmlstr += node.data + '\n' + } + if (!node.nextSibling() && /\n$/.test(htmlstr)) { + htmlstr = htmlstr.replace(/\n$/, ''); + } + }); + var tmpNode = me.document.createTextNode(utils.html(htmlstr.replace(/ /g, ' '))); + rng.insertNode(tmpNode).selectNode(tmpNode).select(); + } else { + var frag = me.document.createDocumentFragment(); + + utils.each(UE.filterNode(UE.htmlparser(html), me.options.filterTxtRules).children, function (node) { + if (node.type == 'element') { + if (node.tagName == 'br') { + frag.appendChild(me.document.createElement('br')) + } else if (!dtd.$empty[node.tagName]) { + utils.each(node.children, function (cn) { + if (cn.type == 'element') { + if (cn.tagName == 'br') { + + frag.appendChild(me.document.createElement('br')) + } else if (!dtd.$empty[node.tagName]) { + frag.appendChild(me.document.createTextNode(utils.html(cn.innerText().replace(/ /g, ' ')))); + + } + } else { + frag.appendChild(me.document.createTextNode(utils.html(cn.data.replace(/ /g, ' ')))); + + } + }) + if (frag.lastChild.nodeName != 'BR') { + frag.appendChild(me.document.createElement('br')) + } + } + } else { + frag.appendChild(me.document.createTextNode(utils.html(node.data.replace(/ /g, ' ')))); + } + if (!node.nextSibling() && frag.lastChild.nodeName == 'BR') { + frag.removeChild(frag.lastChild) + } + + + }); + rng.insertNode(frag).select(); + + } + + return true; + } + }); + //方向键的处理 + me.addListener('keydown', function (cmd, evt) { + var me = this, keyCode = evt.keyCode || evt.which; + if (keyCode == 40) { + var rng = me.selection.getRange(), pre, start = rng.startContainer; + if (rng.collapsed && (pre = domUtils.findParentByTagName(rng.startContainer, 'pre', true)) && !pre.nextSibling) { + var last = pre.lastChild + while (last && last.nodeName == 'BR') { + last = last.previousSibling; + } + if (last === start || rng.startContainer === pre && rng.startOffset == pre.childNodes.length) { + me.execCommand('insertparagraph'); + domUtils.preventDefault(evt) + } + + } + } + }); + //trace:3395 + me.addListener('delkeydown', function (type, evt) { + var rng = this.selection.getRange(); + rng.txtToElmBoundary(true); + var start = rng.startContainer; + if (domUtils.isTagNode(start, 'pre') && rng.collapsed && domUtils.isStartInblock(rng)) { + var p = me.document.createElement('p'); + domUtils.fillNode(me.document, p); + start.parentNode.insertBefore(p, start); + domUtils.remove(start); + rng.setStart(p, 0).setCursor(false, true); + domUtils.preventDefault(evt); + return true; + } + }) + }; + + +// plugins/cleardoc.js + /** + * 清空文档插件 + * @file + * @since 1.2.6.1 + */ + + /** + * 清空文档 + * @command cleardoc + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * //editor 是编辑器实例 + * editor.execCommand('cleardoc'); + * ``` + */ + + UE.commands['cleardoc'] = { + execCommand: function (cmdName) { + var me = this, + enterTag = me.options.enterTag, + range = me.selection.getRange(); + if (enterTag == "br") { + me.body.innerHTML = "
      "; + range.setStart(me.body, 0).setCursor(); + } else { + me.body.innerHTML = "

      " + (ie ? "" : "
      ") + "

      "; + range.setStart(me.body.firstChild, 0).setCursor(false, true); + } + setTimeout(function () { + me.fireEvent("clearDoc"); + }, 0); + + } + }; + + +// plugins/anchor.js + /** + * 锚点插件,为UEditor提供插入锚点支持 + * @file + * @since 1.2.6.1 + */ + UE.plugin.register('anchor', function () { + + return { + bindEvents: { + 'ready': function () { + utils.cssRule('anchor', + '.anchorclass{background: url(\'' + + this.options.themePath + + this.options.theme + '/images/anchor.gif\') no-repeat scroll left center transparent;cursor: auto;display: inline-block;height: 16px;width: 15px;}', + this.document); + } + }, + outputRule: function (root) { + utils.each(root.getNodesByTagName('img'), function (a) { + var val; + if (val = a.getAttr('anchorname')) { + a.tagName = 'a'; + a.setAttr({ + anchorname: '', + name: val, + 'class': '' + }) + } + }) + }, + inputRule: function (root) { + utils.each(root.getNodesByTagName('a'), function (a) { + var val; + if ((val = a.getAttr('name')) && !a.getAttr('href')) { + a.tagName = 'img'; + a.setAttr({ + anchorname: a.getAttr('name'), + 'class': 'anchorclass' + }); + a.setAttr('name') + + } + }) + + }, + commands: { + /** + * 插入锚点 + * @command anchor + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } name 锚点名称字符串 + * @example + * ```javascript + * //editor 是编辑器实例 + * editor.execCommand('anchor', 'anchor1'); + * ``` + */ + 'anchor': { + execCommand: function (cmd, name) { + var range = this.selection.getRange(), img = range.getClosedNode(); + if (img && img.getAttribute('anchorname')) { + if (name) { + img.setAttribute('anchorname', name); + } else { + range.setStartBefore(img).setCursor(); + domUtils.remove(img); + } + } else { + if (name) { + //只在选区的开始插入 + var anchor = this.document.createElement('img'); + range.collapse(true); + domUtils.setAttributes(anchor, { + 'anchorname': name, + 'class': 'anchorclass' + }); + range.insertNode(anchor).setStartAfter(anchor).setCursor(false, true); + } + } + } + } + } + } + }); + + +// plugins/wordcount.js +///import core +///commands 字数统计 +///commandsName WordCount,wordCount +///commandsTitle 字数统计 + /* + * Created by JetBrains WebStorm. + * User: taoqili + * Date: 11-9-7 + * Time: 下午8:18 + * To change this template use File | Settings | File Templates. + */ + + UE.plugins['wordcount'] = function () { + var me = this; + me.setOpt('wordCount', true); + me.addListener('contentchange', function () { + me.fireEvent('wordcount'); + }); + var timer; + me.addListener('ready', function () { + var me = this; + domUtils.on(me.body, "keyup", function (evt) { + var code = evt.keyCode || evt.which, + //忽略的按键,ctr,alt,shift,方向键 + ignores = {"16": 1, "18": 1, "20": 1, "37": 1, "38": 1, "39": 1, "40": 1}; + if (code in ignores) return; + clearTimeout(timer); + timer = setTimeout(function () { + me.fireEvent('wordcount'); + }, 200) + }) + }); + }; + + +// plugins/pagebreak.js + /** + * 分页功能插件 + * @file + * @since 1.2.6.1 + */ + UE.plugins['pagebreak'] = function () { + var me = this, + notBreakTags = ['td']; + me.setOpt('pageBreakTag', '_ueditor_page_break_tag_'); + + function fillNode(node) { + if (domUtils.isEmptyBlock(node)) { + var firstChild = node.firstChild, tmpNode; + + while (firstChild && firstChild.nodeType == 1 && domUtils.isEmptyBlock(firstChild)) { + tmpNode = firstChild; + firstChild = firstChild.firstChild; + } + !tmpNode && (tmpNode = node); + domUtils.fillNode(me.document, tmpNode); + } + } + + //分页符样式添加 + + me.ready(function () { + utils.cssRule('pagebreak', '.pagebreak{display:block;clear:both !important;cursor:default !important;width: 100% !important;margin:0;}', me.document); + }); + + function isHr(node) { + return node && node.nodeType == 1 && node.tagName == 'HR' && node.className == 'pagebreak'; + } + + me.addInputRule(function (root) { + root.traversal(function (node) { + if (node.type == 'text' && node.data == me.options.pageBreakTag) { + var hr = UE.uNode.createElement('
      '); + node.parentNode.insertBefore(hr, node); + node.parentNode.removeChild(node) + } + }) + }); + me.addOutputRule(function (node) { + utils.each(node.getNodesByTagName('hr'), function (n) { + if (n.getAttr('class') == 'pagebreak') { + var txt = UE.uNode.createText(me.options.pageBreakTag); + n.parentNode.insertBefore(txt, n); + n.parentNode.removeChild(n); + } + }) + + }); + + /** + * 插入分页符 + * @command pagebreak + * @method execCommand + * @param { String } cmd 命令字符串 + * @remind 在表格中插入分页符会把表格切分成两部分 + * @remind 获取编辑器内的数据时, 编辑器会把分页符转换成“_ueditor_page_break_tag_”字符串, + * 以便于提交数据到服务器端后处理分页。 + * @example + * ```javascript + * editor.execCommand( 'pagebreak'); //插入一个hr标签,带有样式类名pagebreak + * ``` + */ + + me.commands['pagebreak'] = { + execCommand: function () { + var range = me.selection.getRange(), hr = me.document.createElement('hr'); + domUtils.setAttributes(hr, { + 'class': 'pagebreak', + noshade: "noshade", + size: "5" + }); + domUtils.unSelectable(hr); + //table单独处理 + var node = domUtils.findParentByTagName(range.startContainer, notBreakTags, true), + + parents = [], pN; + if (node) { + switch (node.tagName) { + case 'TD': + pN = node.parentNode; + if (!pN.previousSibling) { + var table = domUtils.findParentByTagName(pN, 'table'); +// var tableWrapDiv = table.parentNode; +// if(tableWrapDiv && tableWrapDiv.nodeType == 1 +// && tableWrapDiv.tagName == 'DIV' +// && tableWrapDiv.getAttribute('dropdrag') +// ){ +// domUtils.remove(tableWrapDiv,true); +// } + table.parentNode.insertBefore(hr, table); + parents = domUtils.findParents(hr, true); + + } else { + pN.parentNode.insertBefore(hr, pN); + parents = domUtils.findParents(hr); + + } + pN = parents[1]; + if (hr !== pN) { + domUtils.breakParent(hr, pN); + + } + //table要重写绑定一下拖拽 + me.fireEvent('afteradjusttable', me.document); + } + + } else { + + if (!range.collapsed) { + range.deleteContents(); + var start = range.startContainer; + while (!domUtils.isBody(start) && domUtils.isBlockElm(start) && domUtils.isEmptyNode(start)) { + range.setStartBefore(start).collapse(true); + domUtils.remove(start); + start = range.startContainer; + } + + } + range.insertNode(hr); + + var pN = hr.parentNode, nextNode; + while (!domUtils.isBody(pN)) { + domUtils.breakParent(hr, pN); + nextNode = hr.nextSibling; + if (nextNode && domUtils.isEmptyBlock(nextNode)) { + domUtils.remove(nextNode); + } + pN = hr.parentNode; + } + nextNode = hr.nextSibling; + var pre = hr.previousSibling; + if (isHr(pre)) { + domUtils.remove(pre); + } else { + pre && fillNode(pre); + } + + if (!nextNode) { + var p = me.document.createElement('p'); + + hr.parentNode.appendChild(p); + domUtils.fillNode(me.document, p); + range.setStart(p, 0).collapse(true); + } else { + if (isHr(nextNode)) { + domUtils.remove(nextNode); + } else { + fillNode(nextNode); + } + range.setEndAfter(hr).collapse(false); + } + + range.select(true); + + } + + } + }; + }; + +// plugins/wordimage.js +///import core +///commands 本地图片引导上传 +///commandsName WordImage +///commandsTitle 本地图片引导上传 +///commandsDialog dialogs\wordimage + + UE.plugin.register('wordimage', function () { + var me = this, + images = []; + return { + commands: { + 'wordimage': { + execCommand: function () { + var images = domUtils.getElementsByTagName(me.body, "img"); + var urlList = []; + for (var i = 0, ci; ci = images[i++];) { + var url = ci.getAttribute("word_img"); + url && urlList.push(url); + } + return urlList; + }, + queryCommandState: function () { + images = domUtils.getElementsByTagName(me.body, "img"); + for (var i = 0, ci; ci = images[i++];) { + if (ci.getAttribute("word_img")) { + return 1; + } + } + return -1; + }, + notNeedUndo: true + } + }, + inputRule: function (root) { + utils.each(root.getNodesByTagName('img'), function (img) { + var attrs = img.attrs, + flag = parseInt(attrs.width) < 128 || parseInt(attrs.height) < 43, + opt = me.options, + src = opt.UEDITOR_HOME_URL + 'themes/default/images/spacer.gif'; + if (attrs['src'] && /^(?:(file:\/+))/.test(attrs['src'])) { + img.setAttr({ + width: attrs.width, + height: attrs.height, + alt: attrs.alt, + word_img: attrs.src, + src: src, + 'style': 'background:url(' + (flag ? opt.themePath + opt.theme + '/images/word.gif' : opt.langPath + opt.lang + '/images/localimage.png') + ') no-repeat center center;border:1px solid #ddd' + }) + } + }) + } + } + }); + +// plugins/dragdrop.js + UE.plugins['dragdrop'] = function () { + + var me = this; + me.ready(function () { + domUtils.on(this.body, 'dragend', function () { + var rng = me.selection.getRange(); + var node = rng.getClosedNode() || me.selection.getStart(); + + if (node && node.tagName == 'IMG') { + + var pre = node.previousSibling, next; + while (next = node.nextSibling) { + if (next.nodeType == 1 && next.tagName == 'SPAN' && !next.firstChild) { + domUtils.remove(next) + } else { + break; + } + } + + + if ((pre && pre.nodeType == 1 && !domUtils.isEmptyBlock(pre) || !pre) && (!next || next && !domUtils.isEmptyBlock(next))) { + if (pre && pre.tagName == 'P' && !domUtils.isEmptyBlock(pre)) { + pre.appendChild(node); + domUtils.moveChild(next, pre); + domUtils.remove(next); + } else if (next && next.tagName == 'P' && !domUtils.isEmptyBlock(next)) { + next.insertBefore(node, next.firstChild); + } + + if (pre && pre.tagName == 'P' && domUtils.isEmptyBlock(pre)) { + domUtils.remove(pre) + } + if (next && next.tagName == 'P' && domUtils.isEmptyBlock(next)) { + domUtils.remove(next) + } + rng.selectNode(node).select(); + me.fireEvent('saveScene'); + + } + + } + + }) + }); + me.addListener('keyup', function (type, evt) { + var keyCode = evt.keyCode || evt.which; + if (keyCode == 13) { + var rng = me.selection.getRange(), node; + if (node = domUtils.findParentByTagName(rng.startContainer, 'p', true)) { + if (domUtils.getComputedStyle(node, 'text-align') == 'center') { + domUtils.removeStyle(node, 'text-align') + } + } + } + }) + }; + + +// plugins/undo.js + /** + * undo redo + * @file + * @since 1.2.6.1 + */ + + /** + * 撤销上一次执行的命令 + * @command undo + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'undo' ); + * ``` + */ + + /** + * 重做上一次执行的命令 + * @command redo + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'redo' ); + * ``` + */ + + UE.plugins['undo'] = function () { + var saveSceneTimer; + var me = this, + maxUndoCount = me.options.maxUndoCount || 20, + maxInputCount = me.options.maxInputCount || 20, + fillchar = new RegExp(domUtils.fillChar + '|<\/hr>', 'gi');// ie会产生多余的 + var noNeedFillCharTags = { + ol: 1, ul: 1, table: 1, tbody: 1, tr: 1, body: 1 + }; + var orgState = me.options.autoClearEmptyNode; + + function compareAddr(indexA, indexB) { + if (indexA.length != indexB.length) + return 0; + for (var i = 0, l = indexA.length; i < l; i++) { + if (indexA[i] != indexB[i]) + return 0 + } + return 1; + } + + function compareRangeAddress(rngAddrA, rngAddrB) { + if (rngAddrA.collapsed != rngAddrB.collapsed) { + return 0; + } + if (!compareAddr(rngAddrA.startAddress, rngAddrB.startAddress) || !compareAddr(rngAddrA.endAddress, rngAddrB.endAddress)) { + return 0; + } + return 1; + } + + function UndoManager() { + this.list = []; + this.index = 0; + this.hasUndo = false; + this.hasRedo = false; + this.undo = function () { + if (this.hasUndo) { + if (!this.list[this.index - 1] && this.list.length == 1) { + this.reset(); + return; + } + while (this.list[this.index].content == this.list[this.index - 1].content) { + this.index--; + if (this.index == 0) { + return this.restore(0); + } + } + this.restore(--this.index); + } + }; + this.redo = function () { + if (this.hasRedo) { + while (this.list[this.index].content == this.list[this.index + 1].content) { + this.index++; + if (this.index == this.list.length - 1) { + return this.restore(this.index); + } + } + this.restore(++this.index); + } + }; + + this.restore = function () { + var me = this.editor; + var scene = this.list[this.index]; + var root = UE.htmlparser(scene.content.replace(fillchar, '')); + me.options.autoClearEmptyNode = false; + me.filterInputRule(root); + me.options.autoClearEmptyNode = orgState; + //trace:873 + //去掉展位符 + me.document.body.innerHTML = root.toHtml(); + me.fireEvent('afterscencerestore'); + //处理undo后空格不展位的问题 + if (browser.ie) { + utils.each(domUtils.getElementsByTagName(me.document, 'td th caption p'), function (node) { + if (domUtils.isEmptyNode(node)) { + domUtils.fillNode(me.document, node); + } + }) + } + + try { + var rng = new dom.Range(me.document).moveToAddress(scene.address); + rng.select(noNeedFillCharTags[rng.startContainer.nodeName.toLowerCase()]); + } catch (e) { + } + + this.update(); + this.clearKey(); + //不能把自己reset了 + me.fireEvent('reset', true); + }; + + this.getScene = function () { + var me = this.editor; + var rng = me.selection.getRange(), + rngAddress = rng.createAddress(false, true); + me.fireEvent('beforegetscene'); + var root = UE.htmlparser(me.body.innerHTML); + me.options.autoClearEmptyNode = false; + me.filterOutputRule(root); + me.options.autoClearEmptyNode = orgState; + var cont = root.toHtml(); + //trace:3461 + //这个会引起回退时导致空格丢失的情况 +// browser.ie && (cont = cont.replace(/> <').replace(/\s*\s*/g, '>')); + me.fireEvent('aftergetscene'); + + return { + address: rngAddress, + content: cont + } + }; + this.save = function (notCompareRange, notSetCursor) { + clearTimeout(saveSceneTimer); + var currentScene = this.getScene(notSetCursor), + lastScene = this.list[this.index]; + + if (lastScene && lastScene.content != currentScene.content) { + me.trigger('contentchange') + } + //内容相同位置相同不存 + if (lastScene && lastScene.content == currentScene.content && + (notCompareRange ? 1 : compareRangeAddress(lastScene.address, currentScene.address)) + ) { + return; + } + this.list = this.list.slice(0, this.index + 1); + this.list.push(currentScene); + //如果大于最大数量了,就把最前的剔除 + if (this.list.length > maxUndoCount) { + this.list.shift(); + } + this.index = this.list.length - 1; + this.clearKey(); + //跟新undo/redo状态 + this.update(); + + }; + this.update = function () { + this.hasRedo = !!this.list[this.index + 1]; + this.hasUndo = !!this.list[this.index - 1]; + }; + this.reset = function () { + this.list = []; + this.index = 0; + this.hasUndo = false; + this.hasRedo = false; + this.clearKey(); + }; + this.clearKey = function () { + keycont = 0; + lastKeyCode = null; + }; + } + + me.undoManger = new UndoManager(); + me.undoManger.editor = me; + + function saveScene() { + this.undoManger.save(); + } + + me.addListener('saveScene', function () { + var args = Array.prototype.splice.call(arguments, 1); + this.undoManger.save.apply(this.undoManger, args); + }); + +// me.addListener('beforeexeccommand', saveScene); +// me.addListener('afterexeccommand', saveScene); + + me.addListener('reset', function (type, exclude) { + if (!exclude) { + this.undoManger.reset(); + } + }); + me.commands['redo'] = me.commands['undo'] = { + execCommand: function (cmdName) { + this.undoManger[cmdName](); + }, + queryCommandState: function (cmdName) { + return this.undoManger['has' + (cmdName.toLowerCase() == 'undo' ? 'Undo' : 'Redo')] ? 0 : -1; + }, + notNeedUndo: 1 + }; + + var keys = { + // /*Backspace*/ 8:1, /*Delete*/ 46:1, + /*Shift*/ 16: 1, /*Ctrl*/ 17: 1, /*Alt*/ 18: 1, + 37: 1, 38: 1, 39: 1, 40: 1 + + }, + keycont = 0, + lastKeyCode; + //输入法状态下不计算字符数 + var inputType = false; + me.addListener('ready', function () { + domUtils.on(this.body, 'compositionstart', function () { + inputType = true; + }); + domUtils.on(this.body, 'compositionend', function () { + inputType = false; + }) + }); + //快捷键 + me.addshortcutkey({ + "Undo": "ctrl+90", //undo + "Redo": "ctrl+89" //redo + + }); + var isCollapsed = true; + me.addListener('keydown', function (type, evt) { + + var me = this; + var keyCode = evt.keyCode || evt.which; + if (!keys[keyCode] && !evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey) { + if (inputType) + return; + + if (!me.selection.getRange().collapsed) { + me.undoManger.save(false, true); + isCollapsed = false; + return; + } + if (me.undoManger.list.length == 0) { + me.undoManger.save(true); + } + clearTimeout(saveSceneTimer); + + function save(cont) { + cont.undoManger.save(false, true); + cont.fireEvent('selectionchange'); + } + + saveSceneTimer = setTimeout(function () { + if (inputType) { + var interalTimer = setInterval(function () { + if (!inputType) { + save(me); + clearInterval(interalTimer) + } + }, 300) + return; + } + save(me); + }, 200); + + lastKeyCode = keyCode; + keycont++; + if (keycont >= maxInputCount) { + save(me) + } + } + }); + me.addListener('keyup', function (type, evt) { + var keyCode = evt.keyCode || evt.which; + if (!keys[keyCode] && !evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey) { + if (inputType) + return; + if (!isCollapsed) { + this.undoManger.save(false, true); + isCollapsed = true; + } + } + }); + //扩展实例,添加关闭和开启命令undo + me.stopCmdUndo = function () { + me.__hasEnterExecCommand = true; + }; + me.startCmdUndo = function () { + me.__hasEnterExecCommand = false; + } + }; + + +// plugins/copy.js + UE.plugin.register('copy', function () { + + var me = this; + + function initZeroClipboard() { + + ZeroClipboard.config({ + debug: false, + swfPath: me.options.UEDITOR_HOME_URL + 'third-party/zeroclipboard/ZeroClipboard.swf' + }); + + var client = me.zeroclipboard = new ZeroClipboard(); + + // 复制内容 + client.on('copy', function (e) { + var client = e.client, + rng = me.selection.getRange(), + div = document.createElement('div'); + + div.appendChild(rng.cloneContents()); + client.setText(div.innerText || div.textContent); + client.setHtml(div.innerHTML); + rng.select(); + }); + // hover事件传递到target + client.on('mouseover mouseout', function (e) { + var target = e.target; + if (e.type == 'mouseover') { + domUtils.addClass(target, 'edui-state-hover'); + } else if (e.type == 'mouseout') { + domUtils.removeClasses(target, 'edui-state-hover'); + } + }); + // flash加载不成功 + client.on('wrongflash noflash', function () { + ZeroClipboard.destroy(); + }); + } + + return { + bindEvents: { + 'ready': function () { + if (!browser.ie) { + if (window.ZeroClipboard) { + initZeroClipboard(); + } else { + utils.loadFile(document, { + src: me.options.UEDITOR_HOME_URL + "third-party/zeroclipboard/ZeroClipboard.js", + tag: "script", + type: "text/javascript", + defer: "defer" + }, function () { + initZeroClipboard(); + }); + } + } + } + }, + commands: { + 'copy': { + execCommand: function (cmd) { + if (!me.document.execCommand('copy')) { + alert(me.getLang('copymsg')); + } + } + } + } + } + }); + + +// plugins/paste.js +///import core +///import plugins/inserthtml.js +///import plugins/undo.js +///import plugins/serialize.js +///commands 粘贴 +///commandsName PastePlain +///commandsTitle 纯文本粘贴模式 + /** + * @description 粘贴 + * @author zhanyi + */ + UE.plugins['paste'] = function () { + function getClipboardData(callback) { + var doc = this.document; + if (doc.getElementById('baidu_pastebin')) { + return; + } + var range = this.selection.getRange(), + bk = range.createBookmark(), + //创建剪贴的容器div + pastebin = doc.createElement('div'); + pastebin.id = 'baidu_pastebin'; + // Safari 要求div必须有内容,才能粘贴内容进来 + browser.webkit && pastebin.appendChild(doc.createTextNode(domUtils.fillChar + domUtils.fillChar)); + doc.body.appendChild(pastebin); + //trace:717 隐藏的span不能得到top + //bk.start.innerHTML = ' '; + bk.start.style.display = ''; + pastebin.style.cssText = "position:absolute;width:1px;height:1px;overflow:hidden;left:-1000px;white-space:nowrap;top:" + + //要在现在光标平行的位置加入,否则会出现跳动的问题 + domUtils.getXY(bk.start).y + 'px'; + + range.selectNodeContents(pastebin).select(true); + + setTimeout(function () { + if (browser.webkit) { + for (var i = 0, pastebins = doc.querySelectorAll('#baidu_pastebin'), pi; pi = pastebins[i++];) { + if (domUtils.isEmptyNode(pi)) { + domUtils.remove(pi); + } else { + pastebin = pi; + break; + } + } + } + try { + pastebin.parentNode.removeChild(pastebin); + } catch (e) { + } + range.moveToBookmark(bk).select(true); + callback(pastebin); + }, 0); + } + + var me = this; + + me.setOpt({ + retainOnlyLabelPasted: false + }); + + var txtContent, htmlContent, address; + + function getPureHtml(html) { + return html.replace(/<(\/?)([\w\-]+)([^>]*)>/gi, function (a, b, tagName, attrs) { + tagName = tagName.toLowerCase(); + if ({img: 1}[tagName]) { + return a; + } + attrs = attrs.replace(/([\w\-]*?)\s*=\s*(("([^"]*)")|('([^']*)')|([^\s>]+))/gi, function (str, atr, val) { + if ({ + 'src': 1, + 'href': 1, + 'name': 1 + }[atr.toLowerCase()]) { + return atr + '=' + val + ' ' + } + return '' + }); + if ({ + 'span': 1, + 'div': 1 + }[tagName]) { + return '' + } else { + + return '<' + b + tagName + ' ' + utils.trim(attrs) + '>' + } + + }); + } + + function filter(div) { + var html; + if (div.firstChild) { + //去掉cut中添加的边界值 + var nodes = domUtils.getElementsByTagName(div, 'span'); + for (var i = 0, ni; ni = nodes[i++];) { + if (ni.id == '_baidu_cut_start' || ni.id == '_baidu_cut_end') { + domUtils.remove(ni); + } + } + + if (browser.webkit) { + + var brs = div.querySelectorAll('div br'); + for (var i = 0, bi; bi = brs[i++];) { + var pN = bi.parentNode; + if (pN.tagName == 'DIV' && pN.childNodes.length == 1) { + pN.innerHTML = '


      '; + domUtils.remove(pN); + } + } + var divs = div.querySelectorAll('#baidu_pastebin'); + for (var i = 0, di; di = divs[i++];) { + var tmpP = me.document.createElement('p'); + di.parentNode.insertBefore(tmpP, di); + while (di.firstChild) { + tmpP.appendChild(di.firstChild); + } + domUtils.remove(di); + } + + var metas = div.querySelectorAll('meta'); + for (var i = 0, ci; ci = metas[i++];) { + domUtils.remove(ci); + } + + var brs = div.querySelectorAll('br'); + for (i = 0; ci = brs[i++];) { + if (/^apple-/i.test(ci.className)) { + domUtils.remove(ci); + } + } + } + if (browser.gecko) { + var dirtyNodes = div.querySelectorAll('[_moz_dirty]'); + for (i = 0; ci = dirtyNodes[i++];) { + ci.removeAttribute('_moz_dirty'); + } + } + if (!browser.ie) { + var spans = div.querySelectorAll('span.Apple-style-span'); + for (var i = 0, ci; ci = spans[i++];) { + domUtils.remove(ci, true); + } + } + + //ie下使用innerHTML会产生多余的\r\n字符,也会产生 这里过滤掉 + html = div.innerHTML;//.replace(/>(?:(\s| )*?)<'); + + //过滤word粘贴过来的冗余属性 + html = UE.filterWord(html); + //取消了忽略空白的第二个参数,粘贴过来的有些是有空白的,会被套上相关的标签 + var root = UE.htmlparser(html); + //如果给了过滤规则就先进行过滤 + if (me.options.filterRules) { + UE.filterNode(root, me.options.filterRules); + } + //执行默认的处理 + me.filterInputRule(root); + //针对chrome的处理 + if (browser.webkit) { + var br = root.lastChild(); + if (br && br.type == 'element' && br.tagName == 'br') { + root.removeChild(br) + } + utils.each(me.body.querySelectorAll('div'), function (node) { + if (domUtils.isEmptyBlock(node)) { + domUtils.remove(node, true) + } + }) + } + html = {'html': root.toHtml()}; + me.fireEvent('beforepaste', html, root); + //抢了默认的粘贴,那后边的内容就不执行了,比如表格粘贴 + if (!html.html) { + return; + } + root = UE.htmlparser(html.html, true); + //如果开启了纯文本模式 + if (me.queryCommandState('pasteplain') === 1) { + me.execCommand('insertHtml', UE.filterNode(root, me.options.filterTxtRules).toHtml(), true); + } else { + //文本模式 + UE.filterNode(root, me.options.filterTxtRules); + txtContent = root.toHtml(); + //完全模式 + htmlContent = html.html; + + address = me.selection.getRange().createAddress(true); + me.execCommand('insertHtml', me.getOpt('retainOnlyLabelPasted') === true ? getPureHtml(htmlContent) : htmlContent, true); + } + me.fireEvent("afterpaste", html); + } + } + + me.addListener('pasteTransfer', function (cmd, plainType) { + + if (address && txtContent && htmlContent && txtContent != htmlContent) { + var range = me.selection.getRange(); + range.moveToAddress(address, true); + + if (!range.collapsed) { + + while (!domUtils.isBody(range.startContainer) + ) { + var start = range.startContainer; + if (start.nodeType == 1) { + start = start.childNodes[range.startOffset]; + if (!start) { + range.setStartBefore(range.startContainer); + continue; + } + var pre = start.previousSibling; + + if (pre && pre.nodeType == 3 && new RegExp('^[\n\r\t ' + domUtils.fillChar + ']*$').test(pre.nodeValue)) { + range.setStartBefore(pre) + } + } + if (range.startOffset == 0) { + range.setStartBefore(range.startContainer); + } else { + break; + } + + } + while (!domUtils.isBody(range.endContainer) + ) { + var end = range.endContainer; + if (end.nodeType == 1) { + end = end.childNodes[range.endOffset]; + if (!end) { + range.setEndAfter(range.endContainer); + continue; + } + var next = end.nextSibling; + if (next && next.nodeType == 3 && new RegExp('^[\n\r\t' + domUtils.fillChar + ']*$').test(next.nodeValue)) { + range.setEndAfter(next) + } + } + if (range.endOffset == range.endContainer[range.endContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length) { + range.setEndAfter(range.endContainer); + } else { + break; + } + + } + + } + + range.deleteContents(); + range.select(true); + me.__hasEnterExecCommand = true; + var html = htmlContent; + if (plainType === 2) { + html = getPureHtml(html); + } else if (plainType) { + html = txtContent; + } + me.execCommand('inserthtml', html, true); + me.__hasEnterExecCommand = false; + var rng = me.selection.getRange(); + while (!domUtils.isBody(rng.startContainer) && !rng.startOffset && + rng.startContainer[rng.startContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length + ) { + rng.setStartBefore(rng.startContainer); + } + var tmpAddress = rng.createAddress(true); + address.endAddress = tmpAddress.startAddress; + } + }); + + me.addListener('ready', function () { + domUtils.on(me.body, 'cut', function () { + var range = me.selection.getRange(); + if (!range.collapsed && me.undoManger) { + me.undoManger.save(); + } + }); + + //ie下beforepaste在点击右键时也会触发,所以用监控键盘才处理 + domUtils.on(me.body, browser.ie || browser.opera ? 'keydown' : 'paste', function (e) { + if ((browser.ie || browser.opera) && ((!e.ctrlKey && !e.metaKey) || e.keyCode != '86')) { + return; + } + getClipboardData.call(me, function (div) { + filter(div); + }); + }); + + }); + + me.commands['paste'] = { + execCommand: function (cmd) { + if (browser.ie) { + getClipboardData.call(me, function (div) { + filter(div); + }); + me.document.execCommand('paste'); + } else { + alert(me.getLang('pastemsg')); + } + } + } + }; + + +// plugins/puretxtpaste.js + /** + * 纯文本粘贴插件 + * @file + * @since 1.2.6.1 + */ + + UE.plugins['pasteplain'] = function () { + var me = this; + me.setOpt({ + 'pasteplain': false, + 'filterTxtRules': function () { + function transP(node) { + node.tagName = 'p'; + node.setStyle(); + } + + function removeNode(node) { + node.parentNode.removeChild(node, true) + } + + return { + //直接删除及其字节点内容 + '-': 'script style object iframe embed input select', + 'p': {$: {}}, + 'br': {$: {}}, + div: function (node) { + var tmpNode, p = UE.uNode.createElement('p'); + while (tmpNode = node.firstChild()) { + if (tmpNode.type == 'text' || !UE.dom.dtd.$block[tmpNode.tagName]) { + p.appendChild(tmpNode); + } else { + if (p.firstChild()) { + node.parentNode.insertBefore(p, node); + p = UE.uNode.createElement('p'); + } else { + node.parentNode.insertBefore(tmpNode, node); + } + } + } + if (p.firstChild()) { + node.parentNode.insertBefore(p, node); + } + node.parentNode.removeChild(node); + }, + ol: removeNode, + ul: removeNode, + dl: removeNode, + dt: removeNode, + dd: removeNode, + 'li': removeNode, + 'caption': transP, + 'th': transP, + 'tr': transP, + 'h1': transP, 'h2': transP, 'h3': transP, 'h4': transP, 'h5': transP, 'h6': transP, + 'td': function (node) { + //没有内容的td直接删掉 + var txt = !!node.innerText(); + if (txt) { + node.parentNode.insertAfter(UE.uNode.createText('    '), node); + } + node.parentNode.removeChild(node, node.innerText()) + } + } + }() + }); + //暂时这里支持一下老版本的属性 + var pasteplain = me.options.pasteplain; + + /** + * 启用或取消纯文本粘贴模式 + * @command pasteplain + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.queryCommandState( 'pasteplain' ); + * ``` + */ + + /** + * 查询当前是否处于纯文本粘贴模式 + * @command pasteplain + * @method queryCommandState + * @param { String } cmd 命令字符串 + * @return { int } 如果处于纯文本模式,返回1,否则,返回0 + * @example + * ```javascript + * editor.queryCommandState( 'pasteplain' ); + * ``` + */ + me.commands['pasteplain'] = { + queryCommandState: function () { + return pasteplain ? 1 : 0; + }, + execCommand: function () { + pasteplain = !pasteplain | 0; + }, + notNeedUndo: 1 + }; + }; + +// plugins/list.js + /** + * 有序列表,无序列表插件 + * @file + * @since 1.2.6.1 + */ + + UE.plugins['list'] = function () { + var me = this, + notExchange = { + 'TD': 1, + 'PRE': 1, + 'BLOCKQUOTE': 1 + }; + var customStyle = { + 'cn': 'cn-1-', + 'cn1': 'cn-2-', + 'cn2': 'cn-3-', + 'num': 'num-1-', + 'num1': 'num-2-', + 'num2': 'num-3-', + 'dash': 'dash', + 'dot': 'dot' + }; + + me.setOpt({ + 'autoTransWordToList': false, + 'insertorderedlist': { + 'num': '', + 'num1': '', + 'num2': '', + 'cn': '', + 'cn1': '', + 'cn2': '', + 'decimal': '', + 'lower-alpha': '', + 'lower-roman': '', + 'upper-alpha': '', + 'upper-roman': '' + }, + 'insertunorderedlist': { + 'circle': '', + 'disc': '', + 'square': '', + 'dash': '', + 'dot': '' + }, + listDefaultPaddingLeft: '30', + listiconpath: 'http://bs.baidu.com/listicon/', + maxListLevel: -1,//-1不限制 + disablePInList: false + }); + + function listToArray(list) { + var arr = []; + for (var p in list) { + arr.push(p) + } + return arr; + } + + var listStyle = { + 'OL': listToArray(me.options.insertorderedlist), + 'UL': listToArray(me.options.insertunorderedlist) + }; + var liiconpath = me.options.listiconpath; + + //根据用户配置,调整customStyle + for (var s in customStyle) { + if (!me.options.insertorderedlist.hasOwnProperty(s) && !me.options.insertunorderedlist.hasOwnProperty(s)) { + delete customStyle[s]; + } + } + + me.ready(function () { + var customCss = []; + for (var p in customStyle) { + if (p == 'dash' || p == 'dot') { + customCss.push('li.list-' + customStyle[p] + '{background-image:url(' + liiconpath + customStyle[p] + '.gif)}'); + customCss.push('ul.custom_' + p + '{list-style:none;}ul.custom_' + p + ' li{background-position:0 3px;background-repeat:no-repeat}'); + } else { + for (var i = 0; i < 99; i++) { + customCss.push('li.list-' + customStyle[p] + i + '{background-image:url(' + liiconpath + 'list-' + customStyle[p] + i + '.gif)}') + } + customCss.push('ol.custom_' + p + '{list-style:none;}ol.custom_' + p + ' li{background-position:0 3px;background-repeat:no-repeat}'); + } + switch (p) { + case 'cn': + customCss.push('li.list-' + p + '-paddingleft-1{padding-left:25px}'); + customCss.push('li.list-' + p + '-paddingleft-2{padding-left:40px}'); + customCss.push('li.list-' + p + '-paddingleft-3{padding-left:55px}'); + break; + case 'cn1': + customCss.push('li.list-' + p + '-paddingleft-1{padding-left:30px}'); + customCss.push('li.list-' + p + '-paddingleft-2{padding-left:40px}'); + customCss.push('li.list-' + p + '-paddingleft-3{padding-left:55px}'); + break; + case 'cn2': + customCss.push('li.list-' + p + '-paddingleft-1{padding-left:40px}'); + customCss.push('li.list-' + p + '-paddingleft-2{padding-left:55px}'); + customCss.push('li.list-' + p + '-paddingleft-3{padding-left:68px}'); + break; + case 'num': + case 'num1': + customCss.push('li.list-' + p + '-paddingleft-1{padding-left:25px}'); + break; + case 'num2': + customCss.push('li.list-' + p + '-paddingleft-1{padding-left:35px}'); + customCss.push('li.list-' + p + '-paddingleft-2{padding-left:40px}'); + break; + case 'dash': + customCss.push('li.list-' + p + '-paddingleft{padding-left:35px}'); + break; + case 'dot': + customCss.push('li.list-' + p + '-paddingleft{padding-left:20px}'); + } + } + customCss.push('.list-paddingleft-1{padding-left:0}'); + customCss.push('.list-paddingleft-2{padding-left:' + me.options.listDefaultPaddingLeft + 'px}'); + customCss.push('.list-paddingleft-3{padding-left:' + me.options.listDefaultPaddingLeft * 2 + 'px}'); + //如果不给宽度会在自定应样式里出现滚动条 + utils.cssRule('list', 'ol,ul{margin:0;pading:0;' + (browser.ie ? '' : 'width:95%') + '}li{clear:both;}' + customCss.join('\n'), me.document); + }); + //单独处理剪切的问题 + me.ready(function () { + domUtils.on(me.body, 'cut', function () { + setTimeout(function () { + var rng = me.selection.getRange(), li; + //trace:3416 + if (!rng.collapsed) { + if (li = domUtils.findParentByTagName(rng.startContainer, 'li', true)) { + if (!li.nextSibling && domUtils.isEmptyBlock(li)) { + var pn = li.parentNode, node; + if (node = pn.previousSibling) { + domUtils.remove(pn); + rng.setStartAtLast(node).collapse(true); + rng.select(true); + } else if (node = pn.nextSibling) { + domUtils.remove(pn); + rng.setStartAtFirst(node).collapse(true); + rng.select(true); + } else { + var tmpNode = me.document.createElement('p'); + domUtils.fillNode(me.document, tmpNode); + pn.parentNode.insertBefore(tmpNode, pn); + domUtils.remove(pn); + rng.setStart(tmpNode, 0).collapse(true); + rng.select(true); + } + } + } + } + + }) + }) + }); + + function getStyle(node) { + var cls = node.className; + if (domUtils.hasClass(node, /custom_/)) { + return cls.match(/custom_(\w+)/)[1] + } + return domUtils.getStyle(node, 'list-style-type') + + } + + me.addListener('beforepaste', function (type, html) { + var me = this, + rng = me.selection.getRange(), li; + var root = UE.htmlparser(html.html, true); + if (li = domUtils.findParentByTagName(rng.startContainer, 'li', true)) { + var list = li.parentNode, tagName = list.tagName == 'OL' ? 'ul' : 'ol'; + utils.each(root.getNodesByTagName(tagName), function (n) { + n.tagName = list.tagName; + n.setAttr(); + if (n.parentNode === root) { + type = getStyle(list) || (list.tagName == 'OL' ? 'decimal' : 'disc') + } else { + var className = n.parentNode.getAttr('class'); + if (className && /custom_/.test(className)) { + type = className.match(/custom_(\w+)/)[1] + } else { + type = n.parentNode.getStyle('list-style-type'); + } + if (!type) { + type = list.tagName == 'OL' ? 'decimal' : 'disc'; + } + } + var index = utils.indexOf(listStyle[list.tagName], type); + if (n.parentNode !== root) + index = index + 1 == listStyle[list.tagName].length ? 0 : index + 1; + var currentStyle = listStyle[list.tagName][index]; + if (customStyle[currentStyle]) { + n.setAttr('class', 'custom_' + currentStyle) + + } else { + n.setStyle('list-style-type', currentStyle) + } + }) + + } + + html.html = root.toHtml(); + }); + //导出时,去掉p标签 + me.getOpt('disablePInList') === true && me.addOutputRule(function (root) { + utils.each(root.getNodesByTagName('li'), function (li) { + var newChildrens = [], index = 0; + utils.each(li.children, function (n) { + if (n.tagName == 'p') { + var tmpNode; + while (tmpNode = n.children.pop()) { + newChildrens.splice(index, 0, tmpNode); + tmpNode.parentNode = li; + lastNode = tmpNode; + } + tmpNode = newChildrens[newChildrens.length - 1]; + if (!tmpNode || tmpNode.type != 'element' || tmpNode.tagName != 'br') { + var br = UE.uNode.createElement('br'); + br.parentNode = li; + newChildrens.push(br); + } + + index = newChildrens.length; + } + }); + if (newChildrens.length) { + li.children = newChildrens; + } + }); + }); + //进入编辑器的li要套p标签 + me.addInputRule(function (root) { + utils.each(root.getNodesByTagName('li'), function (li) { + var tmpP = UE.uNode.createElement('p'); + for (var i = 0, ci; ci = li.children[i];) { + if (ci.type == 'text' || dtd.p[ci.tagName]) { + tmpP.appendChild(ci); + } else { + if (tmpP.firstChild()) { + li.insertBefore(tmpP, ci); + tmpP = UE.uNode.createElement('p'); + i = i + 2; + } else { + i++; + } + + } + } + if (tmpP.firstChild() && !tmpP.parentNode || !li.firstChild()) { + li.appendChild(tmpP); + } + //trace:3357 + //p不能为空 + if (!tmpP.firstChild()) { + tmpP.innerHTML(browser.ie ? ' ' : '
      ') + } + //去掉末尾的空白 + var p = li.firstChild(); + var lastChild = p.lastChild(); + if (lastChild && lastChild.type == 'text' && /^\s*$/.test(lastChild.data)) { + p.removeChild(lastChild) + } + }); + if (me.options.autoTransWordToList) { + var orderlisttype = { + 'num1': /^\d+\)/, + 'decimal': /^\d+\./, + 'lower-alpha': /^[a-z]+\)/, + 'upper-alpha': /^[A-Z]+\./, + 'cn': /^[\u4E00\u4E8C\u4E09\u56DB\u516d\u4e94\u4e03\u516b\u4e5d]+[\u3001]/, + 'cn2': /^\([\u4E00\u4E8C\u4E09\u56DB\u516d\u4e94\u4e03\u516b\u4e5d]+\)/ + }, + unorderlisttype = { + 'square': 'n' + }; + + function checkListType(content, container) { + var span = container.firstChild(); + if (span && span.type == 'element' && span.tagName == 'span' && /Wingdings|Symbol/.test(span.getStyle('font-family'))) { + for (var p in unorderlisttype) { + if (unorderlisttype[p] == span.data) { + return p + } + } + return 'disc' + } + for (var p in orderlisttype) { + if (orderlisttype[p].test(content)) { + return p; + } + } + + } + + utils.each(root.getNodesByTagName('p'), function (node) { + if (node.getAttr('class') != 'MsoListParagraph') { + return + } + + //word粘贴过来的会带有margin要去掉,但这样也可能会误命中一些央视 + node.setStyle('margin', ''); + node.setStyle('margin-left', ''); + node.setAttr('class', ''); + + function appendLi(list, p, type) { + if (list.tagName == 'ol') { + if (browser.ie) { + var first = p.firstChild(); + if (first.type == 'element' && first.tagName == 'span' && orderlisttype[type].test(first.innerText())) { + p.removeChild(first); + } + } else { + p.innerHTML(p.innerHTML().replace(orderlisttype[type], '')); + } + } else { + p.removeChild(p.firstChild()) + } + + var li = UE.uNode.createElement('li'); + li.appendChild(p); + list.appendChild(li); + } + + var tmp = node, type, cacheNode = node; + + if (node.parentNode.tagName != 'li' && (type = checkListType(node.innerText(), node))) { + + var list = UE.uNode.createElement(me.options.insertorderedlist.hasOwnProperty(type) ? 'ol' : 'ul'); + if (customStyle[type]) { + list.setAttr('class', 'custom_' + type) + } else { + list.setStyle('list-style-type', type) + } + while (node && node.parentNode.tagName != 'li' && checkListType(node.innerText(), node)) { + tmp = node.nextSibling(); + if (!tmp) { + node.parentNode.insertBefore(list, node) + } + appendLi(list, node, type); + node = tmp; + } + if (!list.parentNode && node && node.parentNode) { + node.parentNode.insertBefore(list, node) + } + } + var span = cacheNode.firstChild(); + if (span && span.type == 'element' && span.tagName == 'span' && /^\s*( )+\s*$/.test(span.innerText())) { + span.parentNode.removeChild(span) + } + }) + } + + }); + + //调整索引标签 + me.addListener('contentchange', function () { + adjustListStyle(me.document) + }); + + function adjustListStyle(doc, ignore) { + utils.each(domUtils.getElementsByTagName(doc, 'ol ul'), function (node) { + + if (!domUtils.inDoc(node, doc)) + return; + + var parent = node.parentNode; + if (parent.tagName == node.tagName) { + var nodeStyleType = getStyle(node) || (node.tagName == 'OL' ? 'decimal' : 'disc'), + parentStyleType = getStyle(parent) || (parent.tagName == 'OL' ? 'decimal' : 'disc'); + if (nodeStyleType == parentStyleType) { + var styleIndex = utils.indexOf(listStyle[node.tagName], nodeStyleType); + styleIndex = styleIndex + 1 == listStyle[node.tagName].length ? 0 : styleIndex + 1; + setListStyle(node, listStyle[node.tagName][styleIndex]) + } + + } + var index = 0, type = 2; + if (domUtils.hasClass(node, /custom_/)) { + if (!(/[ou]l/i.test(parent.tagName) && domUtils.hasClass(parent, /custom_/))) { + type = 1; + } + } else { + if (/[ou]l/i.test(parent.tagName) && domUtils.hasClass(parent, /custom_/)) { + type = 3; + } + } + + var style = domUtils.getStyle(node, 'list-style-type'); + style && (node.style.cssText = 'list-style-type:' + style); + node.className = utils.trim(node.className.replace(/list-paddingleft-\w+/, '')) + ' list-paddingleft-' + type; + utils.each(domUtils.getElementsByTagName(node, 'li'), function (li) { + li.style.cssText && (li.style.cssText = ''); + if (!li.firstChild) { + domUtils.remove(li); + return; + } + if (li.parentNode !== node) { + return; + } + index++; + if (domUtils.hasClass(node, /custom_/)) { + var paddingLeft = 1, currentStyle = getStyle(node); + if (node.tagName == 'OL') { + if (currentStyle) { + switch (currentStyle) { + case 'cn' : + case 'cn1': + case 'cn2': + if (index > 10 && (index % 10 == 0 || index > 10 && index < 20)) { + paddingLeft = 2 + } else if (index > 20) { + paddingLeft = 3 + } + break; + case 'num2' : + if (index > 9) { + paddingLeft = 2 + } + } + } + li.className = 'list-' + customStyle[currentStyle] + index + ' ' + 'list-' + currentStyle + '-paddingleft-' + paddingLeft; + } else { + li.className = 'list-' + customStyle[currentStyle] + ' ' + 'list-' + currentStyle + '-paddingleft'; + } + } else { + li.className = li.className.replace(/list-[\w\-]+/gi, ''); + } + var className = li.getAttribute('class'); + if (className !== null && !className.replace(/\s/g, '')) { + domUtils.removeAttributes(li, 'class') + } + }); + !ignore && adjustList(node, node.tagName.toLowerCase(), getStyle(node) || domUtils.getStyle(node, 'list-style-type'), true); + }) + } + + function adjustList(list, tag, style, ignoreEmpty) { + var nextList = list.nextSibling; + if (nextList && nextList.nodeType == 1 && nextList.tagName.toLowerCase() == tag && (getStyle(nextList) || domUtils.getStyle(nextList, 'list-style-type') || (tag == 'ol' ? 'decimal' : 'disc')) == style) { + domUtils.moveChild(nextList, list); + if (nextList.childNodes.length == 0) { + domUtils.remove(nextList); + } + } + if (nextList && domUtils.isFillChar(nextList)) { + domUtils.remove(nextList); + } + var preList = list.previousSibling; + if (preList && preList.nodeType == 1 && preList.tagName.toLowerCase() == tag && (getStyle(preList) || domUtils.getStyle(preList, 'list-style-type') || (tag == 'ol' ? 'decimal' : 'disc')) == style) { + domUtils.moveChild(list, preList); + } + if (preList && domUtils.isFillChar(preList)) { + domUtils.remove(preList); + } + !ignoreEmpty && domUtils.isEmptyBlock(list) && domUtils.remove(list); + if (getStyle(list)) { + adjustListStyle(list.ownerDocument, true) + } + } + + function setListStyle(list, style) { + if (customStyle[style]) { + list.className = 'custom_' + style; + } + try { + domUtils.setStyle(list, 'list-style-type', style); + } catch (e) { + } + } + + function clearEmptySibling(node) { + var tmpNode = node.previousSibling; + if (tmpNode && domUtils.isEmptyBlock(tmpNode)) { + domUtils.remove(tmpNode); + } + tmpNode = node.nextSibling; + if (tmpNode && domUtils.isEmptyBlock(tmpNode)) { + domUtils.remove(tmpNode); + } + } + + me.addListener('keydown', function (type, evt) { + function preventAndSave() { + evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); + me.fireEvent('contentchange'); + me.undoManger && me.undoManger.save(); + } + + function findList(node, filterFn) { + while (node && !domUtils.isBody(node)) { + if (filterFn(node)) { + return null + } + if (node.nodeType == 1 && /[ou]l/i.test(node.tagName)) { + return node; + } + node = node.parentNode; + } + return null; + } + + var keyCode = evt.keyCode || evt.which; + if (keyCode == 13 && !evt.shiftKey) {//回车 + var rng = me.selection.getRange(), + parent = domUtils.findParent(rng.startContainer, function (node) { + return domUtils.isBlockElm(node) + }, true), + li = domUtils.findParentByTagName(rng.startContainer, 'li', true); + if (parent && parent.tagName != 'PRE' && !li) { + var html = parent.innerHTML.replace(new RegExp(domUtils.fillChar, 'g'), ''); + if (/^\s*1\s*\.[^\d]/.test(html)) { + parent.innerHTML = html.replace(/^\s*1\s*\./, ''); + rng.setStartAtLast(parent).collapse(true).select(); + me.__hasEnterExecCommand = true; + me.execCommand('insertorderedlist'); + me.__hasEnterExecCommand = false; + } + } + var range = me.selection.getRange(), + start = findList(range.startContainer, function (node) { + return node.tagName == 'TABLE'; + }), + end = range.collapsed ? start : findList(range.endContainer, function (node) { + return node.tagName == 'TABLE'; + }); + + if (start && end && start === end) { + + if (!range.collapsed) { + start = domUtils.findParentByTagName(range.startContainer, 'li', true); + end = domUtils.findParentByTagName(range.endContainer, 'li', true); + if (start && end && start === end) { + range.deleteContents(); + li = domUtils.findParentByTagName(range.startContainer, 'li', true); + if (li && domUtils.isEmptyBlock(li)) { + + pre = li.previousSibling; + next = li.nextSibling; + p = me.document.createElement('p'); + + domUtils.fillNode(me.document, p); + parentList = li.parentNode; + if (pre && next) { + range.setStart(next, 0).collapse(true).select(true); + domUtils.remove(li); + + } else { + if (!pre && !next || !pre) { + + parentList.parentNode.insertBefore(p, parentList); + + + } else { + li.parentNode.parentNode.insertBefore(p, parentList.nextSibling); + } + domUtils.remove(li); + if (!parentList.firstChild) { + domUtils.remove(parentList); + } + range.setStart(p, 0).setCursor(); + + + } + preventAndSave(); + return; + + } + } else { + var tmpRange = range.cloneRange(), + bk = tmpRange.collapse(false).createBookmark(); + + range.deleteContents(); + tmpRange.moveToBookmark(bk); + var li = domUtils.findParentByTagName(tmpRange.startContainer, 'li', true); + + clearEmptySibling(li); + tmpRange.select(); + preventAndSave(); + return; + } + } + + + li = domUtils.findParentByTagName(range.startContainer, 'li', true); + + if (li) { + if (domUtils.isEmptyBlock(li)) { + bk = range.createBookmark(); + var parentList = li.parentNode; + if (li !== parentList.lastChild) { + domUtils.breakParent(li, parentList); + clearEmptySibling(li); + } else { + + parentList.parentNode.insertBefore(li, parentList.nextSibling); + if (domUtils.isEmptyNode(parentList)) { + domUtils.remove(parentList); + } + } + //嵌套不处理 + if (!dtd.$list[li.parentNode.tagName]) { + + if (!domUtils.isBlockElm(li.firstChild)) { + p = me.document.createElement('p'); + li.parentNode.insertBefore(p, li); + while (li.firstChild) { + p.appendChild(li.firstChild); + } + domUtils.remove(li); + } else { + domUtils.remove(li, true); + } + } + range.moveToBookmark(bk).select(); + + + } else { + var first = li.firstChild; + if (!first || !domUtils.isBlockElm(first)) { + var p = me.document.createElement('p'); + + !li.firstChild && domUtils.fillNode(me.document, p); + while (li.firstChild) { + + p.appendChild(li.firstChild); + } + li.appendChild(p); + first = p; + } + + var span = me.document.createElement('span'); + + range.insertNode(span); + domUtils.breakParent(span, li); + + var nextLi = span.nextSibling; + first = nextLi.firstChild; + + if (!first) { + p = me.document.createElement('p'); + + domUtils.fillNode(me.document, p); + nextLi.appendChild(p); + first = p; + } + if (domUtils.isEmptyNode(first)) { + first.innerHTML = ''; + domUtils.fillNode(me.document, first); + } + + range.setStart(first, 0).collapse(true).shrinkBoundary().select(); + domUtils.remove(span); + var pre = nextLi.previousSibling; + if (pre && domUtils.isEmptyBlock(pre)) { + pre.innerHTML = '

      '; + domUtils.fillNode(me.document, pre.firstChild); + } + + } +// } + preventAndSave(); + } + + + } + + + } + if (keyCode == 8) { + //修中ie中li下的问题 + range = me.selection.getRange(); + if (range.collapsed && domUtils.isStartInblock(range)) { + tmpRange = range.cloneRange().trimBoundary(); + li = domUtils.findParentByTagName(range.startContainer, 'li', true); + //要在li的最左边,才能处理 + if (li && domUtils.isStartInblock(tmpRange)) { + start = domUtils.findParentByTagName(range.startContainer, 'p', true); + if (start && start !== li.firstChild) { + var parentList = domUtils.findParentByTagName(start, ['ol', 'ul']); + domUtils.breakParent(start, parentList); + clearEmptySibling(start); + me.fireEvent('contentchange'); + range.setStart(start, 0).setCursor(false, true); + me.fireEvent('saveScene'); + domUtils.preventDefault(evt); + return; + } + + if (li && (pre = li.previousSibling)) { + if (keyCode == 46 && li.childNodes.length) { + return; + } + //有可能上边的兄弟节点是个2级菜单,要追加到2级菜单的最后的li + if (dtd.$list[pre.tagName]) { + pre = pre.lastChild; + } + me.undoManger && me.undoManger.save(); + first = li.firstChild; + if (domUtils.isBlockElm(first)) { + if (domUtils.isEmptyNode(first)) { +// range.setEnd(pre, pre.childNodes.length).shrinkBoundary().collapse().select(true); + pre.appendChild(first); + range.setStart(first, 0).setCursor(false, true); + //first不是唯一的节点 + while (li.firstChild) { + pre.appendChild(li.firstChild); + } + } else { + + span = me.document.createElement('span'); + range.insertNode(span); + //判断pre是否是空的节点,如果是


      类型的空节点,干掉p标签防止它占位 + if (domUtils.isEmptyBlock(pre)) { + pre.innerHTML = ''; + } + domUtils.moveChild(li, pre); + range.setStartBefore(span).collapse(true).select(true); + + domUtils.remove(span); + + } + } else { + if (domUtils.isEmptyNode(li)) { + var p = me.document.createElement('p'); + pre.appendChild(p); + range.setStart(p, 0).setCursor(); +// range.setEnd(pre, pre.childNodes.length).shrinkBoundary().collapse().select(true); + } else { + range.setEnd(pre, pre.childNodes.length).collapse().select(true); + while (li.firstChild) { + pre.appendChild(li.firstChild); + } + } + } + domUtils.remove(li); + me.fireEvent('contentchange'); + me.fireEvent('saveScene'); + domUtils.preventDefault(evt); + return; + + } + //trace:980 + + if (li && !li.previousSibling) { + var parentList = li.parentNode; + var bk = range.createBookmark(); + if (domUtils.isTagNode(parentList.parentNode, 'ol ul')) { + parentList.parentNode.insertBefore(li, parentList); + if (domUtils.isEmptyNode(parentList)) { + domUtils.remove(parentList) + } + } else { + + while (li.firstChild) { + parentList.parentNode.insertBefore(li.firstChild, parentList); + } + + domUtils.remove(li); + if (domUtils.isEmptyNode(parentList)) { + domUtils.remove(parentList) + } + + } + range.moveToBookmark(bk).setCursor(false, true); + me.fireEvent('contentchange'); + me.fireEvent('saveScene'); + domUtils.preventDefault(evt); + return; + + } + + + } + + + } + + } + }); + + me.addListener('keyup', function (type, evt) { + var keyCode = evt.keyCode || evt.which; + if (keyCode == 8) { + var rng = me.selection.getRange(), list; + if (list = domUtils.findParentByTagName(rng.startContainer, ['ol', 'ul'], true)) { + adjustList(list, list.tagName.toLowerCase(), getStyle(list) || domUtils.getComputedStyle(list, 'list-style-type'), true) + } + } + }); + //处理tab键 + me.addListener('tabkeydown', function () { + + var range = me.selection.getRange(); + + //控制级数 + function checkLevel(li) { + if (me.options.maxListLevel != -1) { + var level = li.parentNode, levelNum = 0; + while (/[ou]l/i.test(level.tagName)) { + levelNum++; + level = level.parentNode; + } + if (levelNum >= me.options.maxListLevel) { + return true; + } + } + } + + //只以开始为准 + //todo 后续改进 + var li = domUtils.findParentByTagName(range.startContainer, 'li', true); + if (li) { + + var bk; + if (range.collapsed) { + if (checkLevel(li)) + return true; + var parentLi = li.parentNode, + list = me.document.createElement(parentLi.tagName), + index = utils.indexOf(listStyle[list.tagName], getStyle(parentLi) || domUtils.getComputedStyle(parentLi, 'list-style-type')); + index = index + 1 == listStyle[list.tagName].length ? 0 : index + 1; + var currentStyle = listStyle[list.tagName][index]; + setListStyle(list, currentStyle); + if (domUtils.isStartInblock(range)) { + me.fireEvent('saveScene'); + bk = range.createBookmark(); + parentLi.insertBefore(list, li); + list.appendChild(li); + adjustList(list, list.tagName.toLowerCase(), currentStyle); + me.fireEvent('contentchange'); + range.moveToBookmark(bk).select(true); + return true; + } + } else { + me.fireEvent('saveScene'); + bk = range.createBookmark(); + for (var i = 0, closeList, parents = domUtils.findParents(li), ci; ci = parents[i++];) { + if (domUtils.isTagNode(ci, 'ol ul')) { + closeList = ci; + break; + } + } + var current = li; + if (bk.end) { + while (current && !(domUtils.getPosition(current, bk.end) & domUtils.POSITION_FOLLOWING)) { + if (checkLevel(current)) { + current = domUtils.getNextDomNode(current, false, null, function (node) { + return node !== closeList + }); + continue; + } + var parentLi = current.parentNode, + list = me.document.createElement(parentLi.tagName), + index = utils.indexOf(listStyle[list.tagName], getStyle(parentLi) || domUtils.getComputedStyle(parentLi, 'list-style-type')); + var currentIndex = index + 1 == listStyle[list.tagName].length ? 0 : index + 1; + var currentStyle = listStyle[list.tagName][currentIndex]; + setListStyle(list, currentStyle); + parentLi.insertBefore(list, current); + while (current && !(domUtils.getPosition(current, bk.end) & domUtils.POSITION_FOLLOWING)) { + li = current.nextSibling; + list.appendChild(current); + if (!li || domUtils.isTagNode(li, 'ol ul')) { + if (li) { + while (li = li.firstChild) { + if (li.tagName == 'LI') { + break; + } + } + } else { + li = domUtils.getNextDomNode(current, false, null, function (node) { + return node !== closeList + }); + } + break; + } + current = li; + } + adjustList(list, list.tagName.toLowerCase(), currentStyle); + current = li; + } + } + me.fireEvent('contentchange'); + range.moveToBookmark(bk).select(); + return true; + } + } + + }); + + function getLi(start) { + while (start && !domUtils.isBody(start)) { + if (start.nodeName == 'TABLE') { + return null; + } + if (start.nodeName == 'LI') { + return start + } + start = start.parentNode; + } + } + + /** + * 有序列表,与“insertunorderedlist”命令互斥 + * @command insertorderedlist + * @method execCommand + * @param { String } command 命令字符串 + * @param { String } style 插入的有序列表类型,值为:decimal,lower-alpha,lower-roman,upper-alpha,upper-roman,cn,cn1,cn2,num,num1,num2 + * @example + * ```javascript + * editor.execCommand( 'insertorderedlist','decimal'); + * ``` + */ + /** + * 查询当前选区内容是否有序列表 + * @command insertorderedlist + * @method queryCommandState + * @param { String } cmd 命令字符串 + * @return { int } 如果当前选区是有序列表返回1,否则返回0 + * @example + * ```javascript + * editor.queryCommandState( 'insertorderedlist' ); + * ``` + */ + /** + * 查询当前选区内容是否有序列表 + * @command insertorderedlist + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回当前有序列表的类型,值为null或decimal,lower-alpha,lower-roman,upper-alpha,upper-roman,cn,cn1,cn2,num,num1,num2 + * @example + * ```javascript + * editor.queryCommandValue( 'insertorderedlist' ); + * ``` + */ + + /** + * 无序列表,与“insertorderedlist”命令互斥 + * @command insertunorderedlist + * @method execCommand + * @param { String } command 命令字符串 + * @param { String } style 插入的无序列表类型,值为:circle,disc,square,dash,dot + * @example + * ```javascript + * editor.execCommand( 'insertunorderedlist','circle'); + * ``` + */ + /** + * 查询当前是否有word文档粘贴进来的图片 + * @command insertunorderedlist + * @method insertunorderedlist + * @param { String } command 命令字符串 + * @return { int } 如果当前选区是无序列表返回1,否则返回0 + * @example + * ```javascript + * editor.queryCommandState( 'insertunorderedlist' ); + * ``` + */ + /** + * 查询当前选区内容是否有序列表 + * @command insertunorderedlist + * @method queryCommandValue + * @param { String } command 命令字符串 + * @return { String } 返回当前无序列表的类型,值为null或circle,disc,square,dash,dot + * @example + * ```javascript + * editor.queryCommandValue( 'insertunorderedlist' ); + * ``` + */ + + me.commands['insertorderedlist'] = + me.commands['insertunorderedlist'] = { + execCommand: function (command, style) { + + if (!style) { + style = command.toLowerCase() == 'insertorderedlist' ? 'decimal' : 'disc'; + } + var me = this, + range = this.selection.getRange(), + filterFn = function (node) { + return node.nodeType == 1 ? node.tagName.toLowerCase() != 'br' : !domUtils.isWhitespace(node); + }, + tag = command.toLowerCase() == 'insertorderedlist' ? 'ol' : 'ul', + frag = me.document.createDocumentFragment(); + //去掉是因为会出现选到末尾,导致adjustmentBoundary缩到ol/ul的位置 + //range.shrinkBoundary();//.adjustmentBoundary(); + range.adjustmentBoundary().shrinkBoundary(); + var bko = range.createBookmark(true), + start = getLi(me.document.getElementById(bko.start)), + modifyStart = 0, + end = getLi(me.document.getElementById(bko.end)), + modifyEnd = 0, + startParent, endParent, + list, tmp; + + if (start || end) { + start && (startParent = start.parentNode); + if (!bko.end) { + end = start; + } + end && (endParent = end.parentNode); + + if (startParent === endParent) { + while (start !== end) { + tmp = start; + start = start.nextSibling; + if (!domUtils.isBlockElm(tmp.firstChild)) { + var p = me.document.createElement('p'); + while (tmp.firstChild) { + p.appendChild(tmp.firstChild); + } + tmp.appendChild(p); + } + frag.appendChild(tmp); + } + tmp = me.document.createElement('span'); + startParent.insertBefore(tmp, end); + if (!domUtils.isBlockElm(end.firstChild)) { + p = me.document.createElement('p'); + while (end.firstChild) { + p.appendChild(end.firstChild); + } + end.appendChild(p); + } + frag.appendChild(end); + domUtils.breakParent(tmp, startParent); + if (domUtils.isEmptyNode(tmp.previousSibling)) { + domUtils.remove(tmp.previousSibling); + } + if (domUtils.isEmptyNode(tmp.nextSibling)) { + domUtils.remove(tmp.nextSibling) + } + var nodeStyle = getStyle(startParent) || domUtils.getComputedStyle(startParent, 'list-style-type') || (command.toLowerCase() == 'insertorderedlist' ? 'decimal' : 'disc'); + if (startParent.tagName.toLowerCase() == tag && nodeStyle == style) { + for (var i = 0, ci, tmpFrag = me.document.createDocumentFragment(); ci = frag.firstChild;) { + if (domUtils.isTagNode(ci, 'ol ul')) { +// 删除时,子列表不处理 +// utils.each(domUtils.getElementsByTagName(ci,'li'),function(li){ +// while(li.firstChild){ +// tmpFrag.appendChild(li.firstChild); +// } +// +// }); + tmpFrag.appendChild(ci); + } else { + while (ci.firstChild) { + + tmpFrag.appendChild(ci.firstChild); + domUtils.remove(ci); + } + } + + } + tmp.parentNode.insertBefore(tmpFrag, tmp); + } else { + list = me.document.createElement(tag); + setListStyle(list, style); + list.appendChild(frag); + tmp.parentNode.insertBefore(list, tmp); + } + + domUtils.remove(tmp); + list && adjustList(list, tag, style); + range.moveToBookmark(bko).select(); + return; + } + //开始 + if (start) { + while (start) { + tmp = start.nextSibling; + if (domUtils.isTagNode(start, 'ol ul')) { + frag.appendChild(start); + } else { + var tmpfrag = me.document.createDocumentFragment(), + hasBlock = 0; + while (start.firstChild) { + if (domUtils.isBlockElm(start.firstChild)) { + hasBlock = 1; + } + tmpfrag.appendChild(start.firstChild); + } + if (!hasBlock) { + var tmpP = me.document.createElement('p'); + tmpP.appendChild(tmpfrag); + frag.appendChild(tmpP); + } else { + frag.appendChild(tmpfrag); + } + domUtils.remove(start); + } + + start = tmp; + } + startParent.parentNode.insertBefore(frag, startParent.nextSibling); + if (domUtils.isEmptyNode(startParent)) { + range.setStartBefore(startParent); + domUtils.remove(startParent); + } else { + range.setStartAfter(startParent); + } + modifyStart = 1; + } + + if (end && domUtils.inDoc(endParent, me.document)) { + //结束 + start = endParent.firstChild; + while (start && start !== end) { + tmp = start.nextSibling; + if (domUtils.isTagNode(start, 'ol ul')) { + frag.appendChild(start); + } else { + tmpfrag = me.document.createDocumentFragment(); + hasBlock = 0; + while (start.firstChild) { + if (domUtils.isBlockElm(start.firstChild)) { + hasBlock = 1; + } + tmpfrag.appendChild(start.firstChild); + } + if (!hasBlock) { + tmpP = me.document.createElement('p'); + tmpP.appendChild(tmpfrag); + frag.appendChild(tmpP); + } else { + frag.appendChild(tmpfrag); + } + domUtils.remove(start); + } + start = tmp; + } + var tmpDiv = domUtils.createElement(me.document, 'div', { + 'tmpDiv': 1 + }); + domUtils.moveChild(end, tmpDiv); + + frag.appendChild(tmpDiv); + domUtils.remove(end); + endParent.parentNode.insertBefore(frag, endParent); + range.setEndBefore(endParent); + if (domUtils.isEmptyNode(endParent)) { + domUtils.remove(endParent); + } + + modifyEnd = 1; + } + + + } + + if (!modifyStart) { + range.setStartBefore(me.document.getElementById(bko.start)); + } + if (bko.end && !modifyEnd) { + range.setEndAfter(me.document.getElementById(bko.end)); + } + range.enlarge(true, function (node) { + return notExchange[node.tagName]; + }); + + frag = me.document.createDocumentFragment(); + + var bk = range.createBookmark(), + current = domUtils.getNextDomNode(bk.start, false, filterFn), + tmpRange = range.cloneRange(), + tmpNode, + block = domUtils.isBlockElm; + + while (current && current !== bk.end && (domUtils.getPosition(current, bk.end) & domUtils.POSITION_PRECEDING)) { + + if (current.nodeType == 3 || dtd.li[current.tagName]) { + if (current.nodeType == 1 && dtd.$list[current.tagName]) { + while (current.firstChild) { + frag.appendChild(current.firstChild); + } + tmpNode = domUtils.getNextDomNode(current, false, filterFn); + domUtils.remove(current); + current = tmpNode; + continue; + + } + tmpNode = current; + tmpRange.setStartBefore(current); + + while (current && current !== bk.end && (!block(current) || domUtils.isBookmarkNode(current))) { + tmpNode = current; + current = domUtils.getNextDomNode(current, false, null, function (node) { + return !notExchange[node.tagName]; + }); + } + + if (current && block(current)) { + tmp = domUtils.getNextDomNode(tmpNode, false, filterFn); + if (tmp && domUtils.isBookmarkNode(tmp)) { + current = domUtils.getNextDomNode(tmp, false, filterFn); + tmpNode = tmp; + } + } + tmpRange.setEndAfter(tmpNode); + + current = domUtils.getNextDomNode(tmpNode, false, filterFn); + + var li = range.document.createElement('li'); + + li.appendChild(tmpRange.extractContents()); + if (domUtils.isEmptyNode(li)) { + var tmpNode = range.document.createElement('p'); + while (li.firstChild) { + tmpNode.appendChild(li.firstChild) + } + li.appendChild(tmpNode); + } + frag.appendChild(li); + } else { + current = domUtils.getNextDomNode(current, true, filterFn); + } + } + range.moveToBookmark(bk).collapse(true); + list = me.document.createElement(tag); + setListStyle(list, style); + list.appendChild(frag); + range.insertNode(list); + //当前list上下看能否合并 + adjustList(list, tag, style); + //去掉冗余的tmpDiv + for (var i = 0, ci, tmpDivs = domUtils.getElementsByTagName(list, 'div'); ci = tmpDivs[i++];) { + if (ci.getAttribute('tmpDiv')) { + domUtils.remove(ci, true) + } + } + range.moveToBookmark(bko).select(); + + }, + queryCommandState: function (command) { + var tag = command.toLowerCase() == 'insertorderedlist' ? 'ol' : 'ul'; + var path = this.selection.getStartElementPath(); + for (var i = 0, ci; ci = path[i++];) { + if (ci.nodeName == 'TABLE') { + return 0 + } + if (tag == ci.nodeName.toLowerCase()) { + return 1 + } + ; + } + return 0; + + }, + queryCommandValue: function (command) { + var tag = command.toLowerCase() == 'insertorderedlist' ? 'ol' : 'ul'; + var path = this.selection.getStartElementPath(), + node; + for (var i = 0, ci; ci = path[i++];) { + if (ci.nodeName == 'TABLE') { + node = null; + break; + } + if (tag == ci.nodeName.toLowerCase()) { + node = ci; + break; + } + ; + } + return node ? getStyle(node) || domUtils.getComputedStyle(node, 'list-style-type') : null; + } + }; + }; + + +// plugins/source.js + /** + * 源码编辑插件 + * @file + * @since 1.2.6.1 + */ + + (function () { + var sourceEditors = { + textarea: function (editor, holder) { + var textarea = holder.ownerDocument.createElement('textarea'); + textarea.style.cssText = 'position:absolute;resize:none;width:100%;height:100%;border:0;padding:0;margin:0;overflow-y:auto;'; + // todo: IE下只有onresize属性可用... 很纠结 + if (browser.ie && browser.version < 8) { + textarea.style.width = holder.offsetWidth + 'px'; + textarea.style.height = holder.offsetHeight + 'px'; + holder.onresize = function () { + textarea.style.width = holder.offsetWidth + 'px'; + textarea.style.height = holder.offsetHeight + 'px'; + }; + } + holder.appendChild(textarea); + return { + setContent: function (content) { + textarea.value = content; + }, + getContent: function () { + return textarea.value; + }, + select: function () { + var range; + if (browser.ie) { + range = textarea.createTextRange(); + range.collapse(true); + range.select(); + } else { + //todo: chrome下无法设置焦点 + textarea.setSelectionRange(0, 0); + textarea.focus(); + } + }, + dispose: function () { + holder.removeChild(textarea); + // todo + holder.onresize = null; + textarea = null; + holder = null; + } + }; + }, + codemirror: function (editor, holder) { + + var codeEditor = window.CodeMirror(holder, { + mode: "text/html", + tabMode: "indent", + lineNumbers: true, + lineWrapping: true + }); + var dom = codeEditor.getWrapperElement(); + dom.style.cssText = 'position:absolute;left:0;top:0;width:100%;height:100%;font-family:consolas,"Courier new",monospace;font-size:13px;'; + codeEditor.getScrollerElement().style.cssText = 'position:absolute;left:0;top:0;width:100%;height:100%;'; + codeEditor.refresh(); + return { + getCodeMirror: function () { + return codeEditor; + }, + setContent: function (content) { + codeEditor.setValue(content); + }, + getContent: function () { + return codeEditor.getValue(); + }, + select: function () { + codeEditor.focus(); + }, + dispose: function () { + holder.removeChild(dom); + dom = null; + codeEditor = null; + } + }; + } + }; + + UE.plugins['source'] = function () { + var me = this; + var opt = this.options; + var sourceMode = false; + var sourceEditor; + var orgSetContent; + opt.sourceEditor = browser.ie ? 'textarea' : (opt.sourceEditor || 'codemirror'); + + me.setOpt({ + sourceEditorFirst: false + }); + + function createSourceEditor(holder) { + return sourceEditors[opt.sourceEditor == 'codemirror' && window.CodeMirror ? 'codemirror' : 'textarea'](me, holder); + } + + var bakCssText; + //解决在源码模式下getContent不能得到最新的内容问题 + var oldGetContent, + bakAddress; + + /** + * 切换源码模式和编辑模式 + * @command source + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'source'); + * ``` + */ + + /** + * 查询当前编辑区域的状态是源码模式还是可视化模式 + * @command source + * @method queryCommandState + * @param { String } cmd 命令字符串 + * @return { int } 如果当前是源码编辑模式,返回1,否则返回0 + * @example + * ```javascript + * editor.queryCommandState( 'source' ); + * ``` + */ + + me.commands['source'] = { + execCommand: function () { + + sourceMode = !sourceMode; + if (sourceMode) { + bakAddress = me.selection.getRange().createAddress(false, true); + me.undoManger && me.undoManger.save(true); + if (browser.gecko) { + me.body.contentEditable = false; + } + + bakCssText = me.iframe.style.cssText; + me.iframe.style.cssText += 'position:absolute;left:-32768px;top:-32768px;'; + + + me.fireEvent('beforegetcontent'); + var root = UE.htmlparser(me.body.innerHTML); + me.filterOutputRule(root); + root.traversal(function (node) { + if (node.type == 'element') { + switch (node.tagName) { + case 'td': + case 'th': + case 'caption': + if (node.children && node.children.length == 1) { + if (node.firstChild().tagName == 'br') { + node.removeChild(node.firstChild()) + } + } + ; + break; + case 'pre': + node.innerText(node.innerText().replace(/ /g, ' ')) + + } + } + }); + + me.fireEvent('aftergetcontent'); + + var content = root.toHtml(true); + + sourceEditor = createSourceEditor(me.iframe.parentNode); + + sourceEditor.setContent(content); + + orgSetContent = me.setContent; + + me.setContent = function (html) { + //这里暂时不触发事件,防止报错 + var root = UE.htmlparser(html); + me.filterInputRule(root); + html = root.toHtml(); + sourceEditor.setContent(html); + }; + + setTimeout(function () { + sourceEditor.select(); + me.addListener('fullscreenchanged', function () { + try { + sourceEditor.getCodeMirror().refresh() + } catch (e) { + } + }); + }); + + //重置getContent,源码模式下取值也能是最新的数据 + oldGetContent = me.getContent; + me.getContent = function () { + return sourceEditor.getContent() || '

      ' + (browser.ie ? '' : '
      ') + '

      '; + }; + } else { + me.iframe.style.cssText = bakCssText; + var cont = sourceEditor.getContent() || '

      ' + (browser.ie ? '' : '
      ') + '

      '; + //处理掉block节点前后的空格,有可能会误命中,暂时不考虑 + cont = cont.replace(new RegExp('[\\r\\t\\n ]*<\/?(\\w+)\\s*(?:[^>]*)>', 'g'), function (a, b) { + if (b && !dtd.$inlineWithA[b.toLowerCase()]) { + return a.replace(/(^[\n\r\t ]*)|([\n\r\t ]*$)/g, ''); + } + return a.replace(/(^[\n\r\t]*)|([\n\r\t]*$)/g, '') + }); + + me.setContent = orgSetContent; + + me.setContent(cont); + sourceEditor.dispose(); + sourceEditor = null; + //还原getContent方法 + me.getContent = oldGetContent; + var first = me.body.firstChild; + //trace:1106 都删除空了,下边会报错,所以补充一个p占位 + if (!first) { + me.body.innerHTML = '

      ' + (browser.ie ? '' : '
      ') + '

      '; + first = me.body.firstChild; + } + + + //要在ifm为显示时ff才能取到selection,否则报错 + //这里不能比较位置了 + me.undoManger && me.undoManger.save(true); + + if (browser.gecko) { + + var input = document.createElement('input'); + input.style.cssText = 'position:absolute;left:0;top:-32768px'; + + document.body.appendChild(input); + + me.body.contentEditable = false; + setTimeout(function () { + domUtils.setViewportOffset(input, {left: -32768, top: 0}); + input.focus(); + setTimeout(function () { + me.body.contentEditable = true; + me.selection.getRange().moveToAddress(bakAddress).select(true); + domUtils.remove(input); + }); + + }); + } else { + //ie下有可能报错,比如在代码顶头的情况 + try { + me.selection.getRange().moveToAddress(bakAddress).select(true); + } catch (e) { + } + + } + } + this.fireEvent('sourcemodechanged', sourceMode); + }, + queryCommandState: function () { + return sourceMode | 0; + }, + notNeedUndo: 1 + }; + var oldQueryCommandState = me.queryCommandState; + + me.queryCommandState = function (cmdName) { + cmdName = cmdName.toLowerCase(); + if (sourceMode) { + //源码模式下可以开启的命令 + return cmdName in { + 'source': 1, + 'fullscreen': 1 + } ? 1 : -1 + } + return oldQueryCommandState.apply(this, arguments); + }; + + if (opt.sourceEditor == "codemirror") { + + me.addListener("ready", function () { + utils.loadFile(document, { + src: opt.codeMirrorJsUrl || opt.UEDITOR_HOME_URL + "third-party/codemirror/codemirror.js", + tag: "script", + type: "text/javascript", + defer: "defer" + }, function () { + if (opt.sourceEditorFirst) { + setTimeout(function () { + me.execCommand("source"); + }, 0); + } + }); + utils.loadFile(document, { + tag: "link", + rel: "stylesheet", + type: "text/css", + href: opt.codeMirrorCssUrl || opt.UEDITOR_HOME_URL + "third-party/codemirror/codemirror.css" + }); + + }); + } + + }; + + })(); + +// plugins/enterkey.js +///import core +///import plugins/undo.js +///commands 设置回车标签p或br +///commandsName EnterKey +///commandsTitle 设置回车标签p或br + /** + * @description 处理回车 + * @author zhanyi + */ + UE.plugins['enterkey'] = function () { + var hTag, + me = this, + tag = me.options.enterTag; + me.addListener('keyup', function (type, evt) { + + var keyCode = evt.keyCode || evt.which; + if (keyCode == 13) { + var range = me.selection.getRange(), + start = range.startContainer, + doSave; + + //修正在h1-h6里边回车后不能嵌套p的问题 + if (!browser.ie) { + + if (/h\d/i.test(hTag)) { + if (browser.gecko) { + var h = domUtils.findParentByTagName(start, ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'blockquote', 'caption', 'table'], true); + if (!h) { + me.document.execCommand('formatBlock', false, '

      '); + doSave = 1; + } + } else { + //chrome remove div + if (start.nodeType == 1) { + var tmp = me.document.createTextNode(''), div; + range.insertNode(tmp); + div = domUtils.findParentByTagName(tmp, 'div', true); + if (div) { + var p = me.document.createElement('p'); + while (div.firstChild) { + p.appendChild(div.firstChild); + } + div.parentNode.insertBefore(p, div); + domUtils.remove(div); + range.setStartBefore(tmp).setCursor(); + doSave = 1; + } + domUtils.remove(tmp); + + } + } + + if (me.undoManger && doSave) { + me.undoManger.save(); + } + } + //没有站位符,会出现多行的问题 + browser.opera && range.select(); + } else { + me.fireEvent('saveScene', true, true) + } + } + }); + + me.addListener('keydown', function (type, evt) { + var keyCode = evt.keyCode || evt.which; + if (keyCode == 13) {//回车 + if (me.fireEvent('beforeenterkeydown')) { + domUtils.preventDefault(evt); + return; + } + me.fireEvent('saveScene', true, true); + hTag = ''; + + + var range = me.selection.getRange(); + + if (!range.collapsed) { + //跨td不能删 + var start = range.startContainer, + end = range.endContainer, + startTd = domUtils.findParentByTagName(start, 'td', true), + endTd = domUtils.findParentByTagName(end, 'td', true); + if (startTd && endTd && startTd !== endTd || !startTd && endTd || startTd && !endTd) { + evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); + return; + } + } + if (tag == 'p') { + + + if (!browser.ie) { + + start = domUtils.findParentByTagName(range.startContainer, ['ol', 'ul', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'blockquote', 'caption'], true); + + //opera下执行formatblock会在table的场景下有问题,回车在opera原生支持很好,所以暂时在opera去掉调用这个原生的command + //trace:2431 + if (!start && !browser.opera) { + + me.document.execCommand('formatBlock', false, '

      '); + + if (browser.gecko) { + range = me.selection.getRange(); + start = domUtils.findParentByTagName(range.startContainer, 'p', true); + start && domUtils.removeDirtyAttr(start); + } + + + } else { + hTag = start.tagName; + start.tagName.toLowerCase() == 'p' && browser.gecko && domUtils.removeDirtyAttr(start); + } + + } + + } else { + evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); + + if (!range.collapsed) { + range.deleteContents(); + start = range.startContainer; + if (start.nodeType == 1 && (start = start.childNodes[range.startOffset])) { + while (start.nodeType == 1) { + if (dtd.$empty[start.tagName]) { + range.setStartBefore(start).setCursor(); + if (me.undoManger) { + me.undoManger.save(); + } + return false; + } + if (!start.firstChild) { + var br = range.document.createElement('br'); + start.appendChild(br); + range.setStart(start, 0).setCursor(); + if (me.undoManger) { + me.undoManger.save(); + } + return false; + } + start = start.firstChild; + } + if (start === range.startContainer.childNodes[range.startOffset]) { + br = range.document.createElement('br'); + range.insertNode(br).setCursor(); + + } else { + range.setStart(start, 0).setCursor(); + } + + + } else { + br = range.document.createElement('br'); + range.insertNode(br).setStartAfter(br).setCursor(); + } + + + } else { + br = range.document.createElement('br'); + range.insertNode(br); + var parent = br.parentNode; + if (parent.lastChild === br) { + br.parentNode.insertBefore(br.cloneNode(true), br); + range.setStartBefore(br); + } else { + range.setStartAfter(br); + } + range.setCursor(); + + } + + } + + } + }); + }; + + +// plugins/keystrokes.js + /* 处理特殊键的兼容性问题 */ + UE.plugins['keystrokes'] = function () { + var me = this; + var collapsed = true; + me.addListener('keydown', function (type, evt) { + var keyCode = evt.keyCode || evt.which, + rng = me.selection.getRange(); + + //处理全选的情况 + if (!rng.collapsed && !(evt.ctrlKey || evt.shiftKey || evt.altKey || evt.metaKey) && (keyCode >= 65 && keyCode <= 90 + || keyCode >= 48 && keyCode <= 57 || + keyCode >= 96 && keyCode <= 111 || { + 13: 1, + 8: 1, + 46: 1 + }[keyCode]) + ) { + + var tmpNode = rng.startContainer; + if (domUtils.isFillChar(tmpNode)) { + rng.setStartBefore(tmpNode) + } + tmpNode = rng.endContainer; + if (domUtils.isFillChar(tmpNode)) { + rng.setEndAfter(tmpNode) + } + rng.txtToElmBoundary(); + //结束边界可能放到了br的前边,要把br包含进来 + // x[xxx]
      + if (rng.endContainer && rng.endContainer.nodeType == 1) { + tmpNode = rng.endContainer.childNodes[rng.endOffset]; + if (tmpNode && domUtils.isBr(tmpNode)) { + rng.setEndAfter(tmpNode); + } + } + if (rng.startOffset == 0) { + tmpNode = rng.startContainer; + if (domUtils.isBoundaryNode(tmpNode, 'firstChild')) { + tmpNode = rng.endContainer; + if (rng.endOffset == (tmpNode.nodeType == 3 ? tmpNode.nodeValue.length : tmpNode.childNodes.length) && domUtils.isBoundaryNode(tmpNode, 'lastChild')) { + me.fireEvent('saveScene'); + me.body.innerHTML = '

      ' + (browser.ie ? '' : '
      ') + '

      '; + rng.setStart(me.body.firstChild, 0).setCursor(false, true); + me._selectionChange(); + return; + } + } + } + } + + //处理backspace + if (keyCode == keymap.Backspace) { + rng = me.selection.getRange(); + collapsed = rng.collapsed; + if (me.fireEvent('delkeydown', evt)) { + return; + } + var start, end; + //避免按两次删除才能生效的问题 + if (rng.collapsed && rng.inFillChar()) { + start = rng.startContainer; + + if (domUtils.isFillChar(start)) { + rng.setStartBefore(start).shrinkBoundary(true).collapse(true); + domUtils.remove(start) + } else { + start.nodeValue = start.nodeValue.replace(new RegExp('^' + domUtils.fillChar), ''); + rng.startOffset--; + rng.collapse(true).select(true) + } + } + + //解决选中control元素不能删除的问题 + if (start = rng.getClosedNode()) { + me.fireEvent('saveScene'); + rng.setStartBefore(start); + domUtils.remove(start); + rng.setCursor(); + me.fireEvent('saveScene'); + domUtils.preventDefault(evt); + return; + } + //阻止在table上的删除 + if (!browser.ie) { + start = domUtils.findParentByTagName(rng.startContainer, 'table', true); + end = domUtils.findParentByTagName(rng.endContainer, 'table', true); + if (start && !end || !start && end || start !== end) { + evt.preventDefault(); + return; + } + } + + } + //处理tab键的逻辑 + if (keyCode == keymap.Tab) { + //不处理以下标签 + var excludeTagNameForTabKey = { + 'ol': 1, + 'ul': 1, + 'table': 1 + }; + //处理组件里的tab按下事件 + if (me.fireEvent('tabkeydown', evt)) { + domUtils.preventDefault(evt); + return; + } + var range = me.selection.getRange(); + me.fireEvent('saveScene'); + for (var i = 0, txt = '', tabSize = me.options.tabSize || 4, tabNode = me.options.tabNode || ' '; i < tabSize; i++) { + txt += tabNode; + } + var span = me.document.createElement('span'); + span.innerHTML = txt + domUtils.fillChar; + if (range.collapsed) { + range.insertNode(span.cloneNode(true).firstChild).setCursor(true); + } else { + var filterFn = function (node) { + return domUtils.isBlockElm(node) && !excludeTagNameForTabKey[node.tagName.toLowerCase()] + + }; + //普通的情况 + start = domUtils.findParent(range.startContainer, filterFn, true); + end = domUtils.findParent(range.endContainer, filterFn, true); + if (start && end && start === end) { + range.deleteContents(); + range.insertNode(span.cloneNode(true).firstChild).setCursor(true); + } else { + var bookmark = range.createBookmark(); + range.enlarge(true); + var bookmark2 = range.createBookmark(), + current = domUtils.getNextDomNode(bookmark2.start, false, filterFn); + while (current && !(domUtils.getPosition(current, bookmark2.end) & domUtils.POSITION_FOLLOWING)) { + current.insertBefore(span.cloneNode(true).firstChild, current.firstChild); + current = domUtils.getNextDomNode(current, false, filterFn); + } + range.moveToBookmark(bookmark2).moveToBookmark(bookmark).select(); + } + } + domUtils.preventDefault(evt) + } + //trace:1634 + //ff的del键在容器空的时候,也会删除 + if (browser.gecko && keyCode == 46) { + range = me.selection.getRange(); + if (range.collapsed) { + start = range.startContainer; + if (domUtils.isEmptyBlock(start)) { + var parent = start.parentNode; + while (domUtils.getChildCount(parent) == 1 && !domUtils.isBody(parent)) { + start = parent; + parent = parent.parentNode; + } + if (start === parent.lastChild) + evt.preventDefault(); + return; + } + } + } + }); + me.addListener('keyup', function (type, evt) { + var keyCode = evt.keyCode || evt.which, + rng, me = this; + if (keyCode == keymap.Backspace) { + if (me.fireEvent('delkeyup')) { + return; + } + rng = me.selection.getRange(); + if (rng.collapsed) { + var tmpNode, + autoClearTagName = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']; + if (tmpNode = domUtils.findParentByTagName(rng.startContainer, autoClearTagName, true)) { + if (domUtils.isEmptyBlock(tmpNode)) { + var pre = tmpNode.previousSibling; + if (pre && pre.nodeName != 'TABLE') { + domUtils.remove(tmpNode); + rng.setStartAtLast(pre).setCursor(false, true); + return; + } else { + var next = tmpNode.nextSibling; + if (next && next.nodeName != 'TABLE') { + domUtils.remove(tmpNode); + rng.setStartAtFirst(next).setCursor(false, true); + return; + } + } + } + } + //处理当删除到body时,要重新给p标签展位 + if (domUtils.isBody(rng.startContainer)) { + var tmpNode = domUtils.createElement(me.document, 'p', { + 'innerHTML': browser.ie ? domUtils.fillChar : '
      ' + }); + rng.insertNode(tmpNode).setStart(tmpNode, 0).setCursor(false, true); + } + } + + + //chrome下如果删除了inline标签,浏览器会有记忆,在输入文字还是会套上刚才删除的标签,所以这里再选一次就不会了 + if (!collapsed && (rng.startContainer.nodeType == 3 || rng.startContainer.nodeType == 1 && domUtils.isEmptyBlock(rng.startContainer))) { + if (browser.ie) { + var span = rng.document.createElement('span'); + rng.insertNode(span).setStartBefore(span).collapse(true); + rng.select(); + domUtils.remove(span) + } else { + rng.select() + } + + } + } + + + }) + }; + +// plugins/fiximgclick.js +///import core +///commands 修复chrome下图片不能点击的问题,出现八个角可改变大小 +///commandsName FixImgClick +///commandsTitle 修复chrome下图片不能点击的问题,出现八个角可改变大小 +//修复chrome下图片不能点击的问题,出现八个角可改变大小 + + UE.plugins['fiximgclick'] = (function () { + + var elementUpdated = false; + + function Scale() { + this.editor = null; + this.resizer = null; + this.cover = null; + this.doc = document; + this.prePos = {x: 0, y: 0}; + this.startPos = {x: 0, y: 0}; + } + + (function () { + var rect = [ + //[left, top, width, height] + [0, 0, -1, -1], + [0, 0, 0, -1], + [0, 0, 1, -1], + [0, 0, -1, 0], + [0, 0, 1, 0], + [0, 0, -1, 1], + [0, 0, 0, 1], + [0, 0, 1, 1] + ]; + + Scale.prototype = { + init: function (editor) { + var me = this; + me.editor = editor; + me.startPos = this.prePos = {x: 0, y: 0}; + me.dragId = -1; + + var hands = [], + cover = me.cover = document.createElement('div'), + resizer = me.resizer = document.createElement('div'); + + cover.id = me.editor.ui.id + '_imagescale_cover'; + cover.style.cssText = 'position:absolute;display:none;z-index:' + (me.editor.options.zIndex) + ';filter:alpha(opacity=0); opacity:0;background:#CCC;'; + domUtils.on(cover, 'mousedown click', function () { + me.hide(); + }); + + for (i = 0; i < 8; i++) { + hands.push(''); + } + resizer.id = me.editor.ui.id + '_imagescale'; + resizer.className = 'edui-editor-imagescale'; + resizer.innerHTML = hands.join(''); + resizer.style.cssText += ';display:none;border:1px solid #3b77ff;z-index:' + (me.editor.options.zIndex) + ';'; + + me.editor.ui.getDom().appendChild(cover); + me.editor.ui.getDom().appendChild(resizer); + + me.initStyle(); + me.initEvents(); + }, + initStyle: function () { + utils.cssRule('imagescale', '.edui-editor-imagescale{display:none;position:absolute;border:1px solid #38B2CE;cursor:hand;-webkit-box-sizing: content-box;-moz-box-sizing: content-box;box-sizing: content-box;}' + + '.edui-editor-imagescale span{position:absolute;width:6px;height:6px;overflow:hidden;font-size:0px;display:block;background-color:#3C9DD0;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand0{cursor:nw-resize;top:0;margin-top:-4px;left:0;margin-left:-4px;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand1{cursor:n-resize;top:0;margin-top:-4px;left:50%;margin-left:-4px;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand2{cursor:ne-resize;top:0;margin-top:-4px;left:100%;margin-left:-3px;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand3{cursor:w-resize;top:50%;margin-top:-4px;left:0;margin-left:-4px;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand4{cursor:e-resize;top:50%;margin-top:-4px;left:100%;margin-left:-3px;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand5{cursor:sw-resize;top:100%;margin-top:-3px;left:0;margin-left:-4px;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand6{cursor:s-resize;top:100%;margin-top:-3px;left:50%;margin-left:-4px;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand7{cursor:se-resize;top:100%;margin-top:-3px;left:100%;margin-left:-3px;}'); + }, + initEvents: function () { + var me = this; + + me.startPos.x = me.startPos.y = 0; + me.isDraging = false; + }, + _eventHandler: function (e) { + var me = this; + switch (e.type) { + case 'mousedown': + var hand = e.target || e.srcElement, hand; + if (hand.className.indexOf('edui-editor-imagescale-hand') != -1 && me.dragId == -1) { + me.dragId = hand.className.slice(-1); + me.startPos.x = me.prePos.x = e.clientX; + me.startPos.y = me.prePos.y = e.clientY; + domUtils.on(me.doc, 'mousemove', me.proxy(me._eventHandler, me)); + } + break; + case 'mousemove': + if (me.dragId != -1) { + me.updateContainerStyle(me.dragId, { + x: e.clientX - me.prePos.x, + y: e.clientY - me.prePos.y + }); + me.prePos.x = e.clientX; + me.prePos.y = e.clientY; + elementUpdated = true; + me.updateTargetElement(); + + } + break; + case 'mouseup': + if (me.dragId != -1) { + me.updateContainerStyle(me.dragId, { + x: e.clientX - me.prePos.x, + y: e.clientY - me.prePos.y + }); + me.updateTargetElement(); + if (me.target.parentNode) me.attachTo(me.target); + me.dragId = -1; + } + domUtils.un(me.doc, 'mousemove', me.proxy(me._eventHandler, me)); + //修复只是点击挪动点,但没有改变大小,不应该触发contentchange + if (elementUpdated) { + elementUpdated = false; + me.editor.fireEvent('contentchange'); + } + + break; + default: + break; + } + }, + updateTargetElement: function () { + var me = this; + domUtils.setStyles(me.target, { + 'width': me.resizer.style.width, + 'height': me.resizer.style.height + }); + me.target.width = parseInt(me.resizer.style.width); + me.target.height = parseInt(me.resizer.style.height); + me.attachTo(me.target); + }, + updateContainerStyle: function (dir, offset) { + var me = this, + dom = me.resizer, tmp; + + if (rect[dir][0] != 0) { + tmp = parseInt(dom.style.left) + offset.x; + dom.style.left = me._validScaledProp('left', tmp) + 'px'; + } + if (rect[dir][1] != 0) { + tmp = parseInt(dom.style.top) + offset.y; + dom.style.top = me._validScaledProp('top', tmp) + 'px'; + } + if (rect[dir][2] != 0) { + tmp = dom.clientWidth + rect[dir][2] * offset.x; + dom.style.width = me._validScaledProp('width', tmp) + 'px'; + } + if (rect[dir][3] != 0) { + tmp = dom.clientHeight + rect[dir][3] * offset.y; + dom.style.height = me._validScaledProp('height', tmp) + 'px'; + } + }, + _validScaledProp: function (prop, value) { + var ele = this.resizer, + wrap = document; + + value = isNaN(value) ? 0 : value; + switch (prop) { + case 'left': + return value < 0 ? 0 : (value + ele.clientWidth) > wrap.clientWidth ? wrap.clientWidth - ele.clientWidth : value; + case 'top': + return value < 0 ? 0 : (value + ele.clientHeight) > wrap.clientHeight ? wrap.clientHeight - ele.clientHeight : value; + case 'width': + return value <= 0 ? 1 : (value + ele.offsetLeft) > wrap.clientWidth ? wrap.clientWidth - ele.offsetLeft : value; + case 'height': + return value <= 0 ? 1 : (value + ele.offsetTop) > wrap.clientHeight ? wrap.clientHeight - ele.offsetTop : value; + } + }, + hideCover: function () { + this.cover.style.display = 'none'; + }, + showCover: function () { + var me = this, + editorPos = domUtils.getXY(me.editor.ui.getDom()), + iframePos = domUtils.getXY(me.editor.iframe); + + domUtils.setStyles(me.cover, { + 'width': me.editor.iframe.offsetWidth + 'px', + 'height': me.editor.iframe.offsetHeight + 'px', + 'top': iframePos.y - editorPos.y + 'px', + 'left': iframePos.x - editorPos.x + 'px', + 'position': 'absolute', + 'display': '' + }) + }, + show: function (targetObj) { + var me = this; + me.resizer.style.display = 'block'; + if (targetObj) me.attachTo(targetObj); + + domUtils.on(this.resizer, 'mousedown', me.proxy(me._eventHandler, me)); + domUtils.on(me.doc, 'mouseup', me.proxy(me._eventHandler, me)); + + me.showCover(); + me.editor.fireEvent('afterscaleshow', me); + me.editor.fireEvent('saveScene'); + }, + hide: function () { + var me = this; + me.hideCover(); + me.resizer.style.display = 'none'; + + domUtils.un(me.resizer, 'mousedown', me.proxy(me._eventHandler, me)); + domUtils.un(me.doc, 'mouseup', me.proxy(me._eventHandler, me)); + me.editor.fireEvent('afterscalehide', me); + }, + proxy: function (fn, context) { + return function (e) { + return fn.apply(context || this, arguments); + }; + }, + attachTo: function (targetObj) { + var me = this, + target = me.target = targetObj, + resizer = this.resizer, + imgPos = domUtils.getXY(target), + iframePos = domUtils.getXY(me.editor.iframe), + editorPos = domUtils.getXY(resizer.parentNode); + + domUtils.setStyles(resizer, { + 'width': target.width + 'px', + 'height': target.height + 'px', + 'left': iframePos.x + imgPos.x - me.editor.document.body.scrollLeft - editorPos.x - parseInt(resizer.style.borderLeftWidth) + 'px', + 'top': iframePos.y + imgPos.y - me.editor.document.body.scrollTop - editorPos.y - parseInt(resizer.style.borderTopWidth) + 'px' + }); + } + } + })(); + + return function () { + var me = this, + imageScale; + + me.setOpt('imageScaleEnabled', true); + + if (!browser.ie && me.options.imageScaleEnabled) { + me.addListener('click', function (type, e) { + + var range = me.selection.getRange(), + img = range.getClosedNode(); + + if (img && img.tagName == 'IMG' && me.body.contentEditable != "false") { + + if (img.className.indexOf("edui-faked-music") != -1 || + img.getAttribute("anchorname") || + domUtils.hasClass(img, 'loadingclass') || + domUtils.hasClass(img, 'loaderrorclass')) { + return + } + + if (!imageScale) { + imageScale = new Scale(); + imageScale.init(me); + me.ui.getDom().appendChild(imageScale.resizer); + + var _keyDownHandler = function (e) { + imageScale.hide(); + if (imageScale.target) me.selection.getRange().selectNode(imageScale.target).select(); + }, _mouseDownHandler = function (e) { + var ele = e.target || e.srcElement; + if (ele && (ele.className === undefined || ele.className.indexOf('edui-editor-imagescale') == -1)) { + _keyDownHandler(e); + } + }, timer; + + me.addListener('afterscaleshow', function (e) { + me.addListener('beforekeydown', _keyDownHandler); + me.addListener('beforemousedown', _mouseDownHandler); + domUtils.on(document, 'keydown', _keyDownHandler); + domUtils.on(document, 'mousedown', _mouseDownHandler); + me.selection.getNative().removeAllRanges(); + }); + me.addListener('afterscalehide', function (e) { + me.removeListener('beforekeydown', _keyDownHandler); + me.removeListener('beforemousedown', _mouseDownHandler); + domUtils.un(document, 'keydown', _keyDownHandler); + domUtils.un(document, 'mousedown', _mouseDownHandler); + var target = imageScale.target; + if (target.parentNode) { + me.selection.getRange().selectNode(target).select(); + } + }); + //TODO 有iframe的情况,mousedown不能往下传。。 + domUtils.on(imageScale.resizer, 'mousedown', function (e) { + me.selection.getNative().removeAllRanges(); + var ele = e.target || e.srcElement; + if (ele && ele.className.indexOf('edui-editor-imagescale-hand') == -1) { + timer = setTimeout(function () { + imageScale.hide(); + if (imageScale.target) me.selection.getRange().selectNode(ele).select(); + }, 200); + } + }); + domUtils.on(imageScale.resizer, 'mouseup', function (e) { + var ele = e.target || e.srcElement; + if (ele && ele.className.indexOf('edui-editor-imagescale-hand') == -1) { + clearTimeout(timer); + } + }); + } + imageScale.show(img); + } else { + if (imageScale && imageScale.resizer.style.display != 'none') imageScale.hide(); + } + }); + } + + if (browser.webkit) { + me.addListener('click', function (type, e) { + if (e.target.tagName == 'IMG' && me.body.contentEditable != "false") { + var range = new dom.Range(me.document); + range.selectNode(e.target).select(); + } + }); + } + } + })(); + +// plugins/autolink.js +///import core +///commands 为非ie浏览器自动添加a标签 +///commandsName AutoLink +///commandsTitle 自动增加链接 + /** + * @description 为非ie浏览器自动添加a标签 + * @author zhanyi + */ + + UE.plugin.register('autolink', function () { + var cont = 0; + + return !browser.ie ? { + + bindEvents: { + 'reset': function () { + cont = 0; + }, + 'keydown': function (type, evt) { + var me = this; + var keyCode = evt.keyCode || evt.which; + + if (keyCode == 32 || keyCode == 13) { + + var sel = me.selection.getNative(), + range = sel.getRangeAt(0).cloneRange(), + offset, + charCode; + + var start = range.startContainer; + while (start.nodeType == 1 && range.startOffset > 0) { + start = range.startContainer.childNodes[range.startOffset - 1]; + if (!start) { + break; + } + range.setStart(start, start.nodeType == 1 ? start.childNodes.length : start.nodeValue.length); + range.collapse(true); + start = range.startContainer; + } + + do { + if (range.startOffset == 0) { + start = range.startContainer.previousSibling; + + while (start && start.nodeType == 1) { + start = start.lastChild; + } + if (!start || domUtils.isFillChar(start)) { + break; + } + offset = start.nodeValue.length; + } else { + start = range.startContainer; + offset = range.startOffset; + } + range.setStart(start, offset - 1); + charCode = range.toString().charCodeAt(0); + } while (charCode != 160 && charCode != 32); + + if (range.toString().replace(new RegExp(domUtils.fillChar, 'g'), '').match(/(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i)) { + while (range.toString().length) { + if (/^(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i.test(range.toString())) { + break; + } + try { + range.setStart(range.startContainer, range.startOffset + 1); + } catch (e) { + //trace:2121 + var start = range.startContainer; + while (!(next = start.nextSibling)) { + if (domUtils.isBody(start)) { + return; + } + start = start.parentNode; + + } + range.setStart(next, 0); + + } + + } + //range的开始边界已经在a标签里的不再处理 + if (domUtils.findParentByTagName(range.startContainer, 'a', true)) { + return; + } + var a = me.document.createElement('a'), text = me.document.createTextNode(' '), href; + + me.undoManger && me.undoManger.save(); + a.appendChild(range.extractContents()); + a.href = a.innerHTML = a.innerHTML.replace(/<[^>]+>/g, ''); + href = a.getAttribute("href").replace(new RegExp(domUtils.fillChar, 'g'), ''); + href = /^(?:https?:\/\/)/ig.test(href) ? href : "http://" + href; + a.setAttribute('_src', utils.html(href)); + a.href = utils.html(href); + + range.insertNode(a); + a.parentNode.insertBefore(text, a.nextSibling); + range.setStart(text, 0); + range.collapse(true); + sel.removeAllRanges(); + sel.addRange(range); + me.undoManger && me.undoManger.save(); + } + } + } + } + } : {} + }, function () { + var keyCodes = { + 37: 1, 38: 1, 39: 1, 40: 1, + 13: 1, 32: 1 + }; + + function checkIsCludeLink(node) { + if (node.nodeType == 3) { + return null + } + if (node.nodeName == 'A') { + return node; + } + var lastChild = node.lastChild; + + while (lastChild) { + if (lastChild.nodeName == 'A') { + return lastChild; + } + if (lastChild.nodeType == 3) { + if (domUtils.isWhitespace(lastChild)) { + lastChild = lastChild.previousSibling; + continue; + } + return null + } + lastChild = lastChild.lastChild; + } + } + + browser.ie && this.addListener('keyup', function (cmd, evt) { + var me = this, keyCode = evt.keyCode; + if (keyCodes[keyCode]) { + var rng = me.selection.getRange(); + var start = rng.startContainer; + + if (keyCode == 13) { + while (start && !domUtils.isBody(start) && !domUtils.isBlockElm(start)) { + start = start.parentNode; + } + if (start && !domUtils.isBody(start) && start.nodeName == 'P') { + var pre = start.previousSibling; + if (pre && pre.nodeType == 1) { + var pre = checkIsCludeLink(pre); + if (pre && !pre.getAttribute('_href')) { + domUtils.remove(pre, true); + } + } + } + } else if (keyCode == 32) { + if (start.nodeType == 3 && /^\s$/.test(start.nodeValue)) { + start = start.previousSibling; + if (start && start.nodeName == 'A' && !start.getAttribute('_href')) { + domUtils.remove(start, true); + } + } + } else { + start = domUtils.findParentByTagName(start, 'a', true); + if (start && !start.getAttribute('_href')) { + var bk = rng.createBookmark(); + + domUtils.remove(start, true); + rng.moveToBookmark(bk).select(true) + } + } + + } + + + }); + } + ); + +// plugins/autoheight.js +///import core +///commands 当输入内容超过编辑器高度时,编辑器自动增高 +///commandsName AutoHeight,autoHeightEnabled +///commandsTitle 自动增高 + /** + * @description 自动伸展 + * @author zhanyi + */ + UE.plugins['autoheight'] = function () { + var me = this; + //提供开关,就算加载也可以关闭 + me.autoHeightEnabled = me.options.autoHeightEnabled !== false; + if (!me.autoHeightEnabled) { + return; + } + + var bakOverflow, + lastHeight = 0, + options = me.options, + currentHeight, + timer; + + function adjustHeight() { + var me = this; + clearTimeout(timer); + if (isFullscreen) return; + if (!me.queryCommandState || me.queryCommandState && me.queryCommandState('source') != 1) { + timer = setTimeout(function () { + + var node = me.body.lastChild; + while (node && node.nodeType != 1) { + node = node.previousSibling; + } + if (node && node.nodeType == 1) { + node.style.clear = 'both'; + currentHeight = Math.max(domUtils.getXY(node).y + node.offsetHeight + 25, Math.max(options.minFrameHeight, options.initialFrameHeight)); + if (currentHeight != lastHeight) { + if (currentHeight !== parseInt(me.iframe.parentNode.style.height)) { + me.iframe.parentNode.style.height = currentHeight + 'px'; + } + me.body.style.height = currentHeight + 'px'; + lastHeight = currentHeight; + } + domUtils.removeStyle(node, 'clear'); + } + + + }, 50) + } + } + + var isFullscreen; + me.addListener('fullscreenchanged', function (cmd, f) { + isFullscreen = f + }); + me.addListener('destroy', function () { + me.removeListener('contentchange afterinserthtml keyup mouseup', adjustHeight) + }); + me.enableAutoHeight = function () { + var me = this; + if (!me.autoHeightEnabled) { + return; + } + var doc = me.document; + me.autoHeightEnabled = true; + bakOverflow = doc.body.style.overflowY; + doc.body.style.overflowY = 'hidden'; + me.addListener('contentchange afterinserthtml keyup mouseup', adjustHeight); + //ff不给事件算得不对 + + setTimeout(function () { + adjustHeight.call(me); + }, browser.gecko ? 100 : 0); + me.fireEvent('autoheightchanged', me.autoHeightEnabled); + }; + me.disableAutoHeight = function () { + + me.body.style.overflowY = bakOverflow || ''; + + me.removeListener('contentchange', adjustHeight); + me.removeListener('keyup', adjustHeight); + me.removeListener('mouseup', adjustHeight); + me.autoHeightEnabled = false; + me.fireEvent('autoheightchanged', me.autoHeightEnabled); + }; + + me.on('setHeight', function () { + me.disableAutoHeight() + }); + me.addListener('ready', function () { + me.enableAutoHeight(); + //trace:1764 + var timer; + domUtils.on(browser.ie ? me.body : me.document, browser.webkit ? 'dragover' : 'drop', function () { + clearTimeout(timer); + timer = setTimeout(function () { + //trace:3681 + adjustHeight.call(me); + }, 100); + + }); + //修复内容过多时,回到顶部,顶部内容被工具栏遮挡问题 + var lastScrollY; + window.onscroll = function () { + if (lastScrollY === null) { + lastScrollY = this.scrollY + } else if (this.scrollY == 0 && lastScrollY != 0) { + me.window.scrollTo(0, 0); + lastScrollY = null; + } + } + }); + + + }; + + +// plugins/autofloat.js +///import core +///commands 悬浮工具栏 +///commandsName AutoFloat,autoFloatEnabled +///commandsTitle 悬浮工具栏 + /** + * modified by chengchao01 + * 注意: 引入此功能后,在IE6下会将body的背景图片覆盖掉! + */ + UE.plugins['autofloat'] = function () { + var me = this, + lang = me.getLang(); + me.setOpt({ + topOffset: 0 + }); + var optsAutoFloatEnabled = me.options.autoFloatEnabled !== false, + topOffset = me.options.topOffset; + + + //如果不固定toolbar的位置,则直接退出 + if (!optsAutoFloatEnabled) { + return; + } + var uiUtils = UE.ui.uiUtils, + LteIE6 = browser.ie && browser.version <= 6, + quirks = browser.quirks; + + function checkHasUI() { + if (!UE.ui) { + alert(lang.autofloatMsg); + return 0; + } + return 1; + } + + function fixIE6FixedPos() { + var docStyle = document.body.style; + docStyle.backgroundImage = 'url("about:blank")'; + docStyle.backgroundAttachment = 'fixed'; + } + + var bakCssText, + placeHolder = document.createElement('div'), + toolbarBox, orgTop, + getPosition, + flag = true; //ie7模式下需要偏移 + function setFloating() { + var toobarBoxPos = domUtils.getXY(toolbarBox), + origalFloat = domUtils.getComputedStyle(toolbarBox, 'position'), + origalLeft = domUtils.getComputedStyle(toolbarBox, 'left'); + toolbarBox.style.width = toolbarBox.offsetWidth + 'px'; + toolbarBox.style.zIndex = me.options.zIndex * 1 + 1; + toolbarBox.parentNode.insertBefore(placeHolder, toolbarBox); + if (LteIE6 || (quirks && browser.ie)) { + if (toolbarBox.style.position != 'absolute') { + toolbarBox.style.position = 'absolute'; + } + toolbarBox.style.top = (document.body.scrollTop || document.documentElement.scrollTop) - orgTop + topOffset + 'px'; + } else { + if (browser.ie7Compat && flag) { + flag = false; + toolbarBox.style.left = domUtils.getXY(toolbarBox).x - document.documentElement.getBoundingClientRect().left + 2 + 'px'; + } + if (toolbarBox.style.position != 'fixed') { + toolbarBox.style.position = 'fixed'; + toolbarBox.style.top = topOffset + "px"; + ((origalFloat == 'absolute' || origalFloat == 'relative') && parseFloat(origalLeft)) && (toolbarBox.style.left = toobarBoxPos.x + 'px'); + } + } + } + + function unsetFloating() { + flag = true; + if (placeHolder.parentNode) { + placeHolder.parentNode.removeChild(placeHolder); + } + + toolbarBox.style.cssText = bakCssText; + } + + function updateFloating() { + var rect3 = getPosition(me.container); + var offset = me.options.toolbarTopOffset || 0; + if (rect3.top < 0 && rect3.bottom - toolbarBox.offsetHeight > offset) { + setFloating(); + } else { + unsetFloating(); + } + } + + var defer_updateFloating = utils.defer(function () { + updateFloating(); + }, browser.ie ? 200 : 100, true); + + me.addListener('destroy', function () { + domUtils.un(window, ['scroll', 'resize'], updateFloating); + me.removeListener('keydown', defer_updateFloating); + }); + + me.addListener('ready', function () { + if (checkHasUI(me)) { + //加载了ui组件,但在new时,没有加载ui,导致编辑器实例上没有ui类,所以这里做判断 + if (!me.ui) { + return; + } + getPosition = uiUtils.getClientRect; + toolbarBox = me.ui.getDom('toolbarbox'); + orgTop = getPosition(toolbarBox).top; + bakCssText = toolbarBox.style.cssText; + placeHolder.style.height = toolbarBox.offsetHeight + 'px'; + if (LteIE6) { + fixIE6FixedPos(); + } + domUtils.on(window, ['scroll', 'resize'], updateFloating); + me.addListener('keydown', defer_updateFloating); + + me.addListener('beforefullscreenchange', function (t, enabled) { + if (enabled) { + unsetFloating(); + } + }); + me.addListener('fullscreenchanged', function (t, enabled) { + if (!enabled) { + updateFloating(); + } + }); + me.addListener('sourcemodechanged', function (t, enabled) { + setTimeout(function () { + updateFloating(); + }, 0); + }); + me.addListener("clearDoc", function () { + setTimeout(function () { + updateFloating(); + }, 0); + + }) + } + }); + }; + + +// plugins/video.js + /** + * video插件, 为UEditor提供视频插入支持 + * @file + * @since 1.2.6.1 + */ + + UE.plugins['video'] = function () { + var me = this; + + /** + * 创建插入视频字符窜 + * @param url 视频地址 + * @param width 视频宽度 + * @param height 视频高度 + * @param align 视频对齐 + * @param toEmbed 是否以flash代替显示 + * @param addParagraph 是否需要添加P 标签 + */ + function creatInsertStr(url, width, height, id, align, classname, type) { + + url = utils.unhtmlForUrl(url); + align = utils.unhtml(align); + classname = utils.unhtml(classname); + + width = parseInt(width, 10) || 0; + height = parseInt(height, 10) || 0; + + var str; + switch (type) { + case 'image': + str = '' + break; + case 'embed': + str = ''; + break; + case 'video': + var ext = url.substr(url.lastIndexOf('.') + 1); + if (ext == 'ogv') ext = 'ogg'; + str = '' + + ''; + break; + } + return str; + } + + function switchImgAndVideo(root, img2video) { + utils.each(root.getNodesByTagName(img2video ? 'img' : 'embed video'), function (node) { + var className = node.getAttr('class'); + if (className && className.indexOf('edui-faked-video') != -1) { + var html = creatInsertStr(img2video ? node.getAttr('_url') : node.getAttr('src'), node.getAttr('width'), node.getAttr('height'), null, node.getStyle('float') || '', className, img2video ? 'embed' : 'image'); + node.parentNode.replaceChild(UE.uNode.createElement(html), node); + } + if (className && className.indexOf('edui-upload-video') != -1) { + var html = creatInsertStr(img2video ? node.getAttr('_url') : node.getAttr('src'), node.getAttr('width'), node.getAttr('height'), null, node.getStyle('float') || '', className, img2video ? 'video' : 'image'); + node.parentNode.replaceChild(UE.uNode.createElement(html), node); + } + }) + } + + me.addOutputRule(function (root) { + switchImgAndVideo(root, true) + }); + me.addInputRule(function (root) { + switchImgAndVideo(root) + }); + + /** + * 插入视频 + * @command insertvideo + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Object } videoAttr 键值对对象, 描述一个视频的所有属性 + * @example + * ```javascript + * + * var videoAttr = { + * //视频地址 + * url: 'http://www.youku.com/xxx', + * //视频宽高值, 单位px + * width: 200, + * height: 100 + * }; + * + * //editor 是编辑器实例 + * //向编辑器插入单个视频 + * editor.execCommand( 'insertvideo', videoAttr ); + * ``` + */ + + /** + * 插入视频 + * @command insertvideo + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Array } videoArr 需要插入的视频的数组, 其中的每一个元素都是一个键值对对象, 描述了一个视频的所有属性 + * @example + * ```javascript + * + * var videoAttr1 = { + * //视频地址 + * url: 'http://www.youku.com/xxx', + * //视频宽高值, 单位px + * width: 200, + * height: 100 + * }, + * videoAttr2 = { + * //视频地址 + * url: 'http://www.youku.com/xxx', + * //视频宽高值, 单位px + * width: 200, + * height: 100 + * } + * + * //editor 是编辑器实例 + * //该方法将会向编辑器内插入两个视频 + * editor.execCommand( 'insertvideo', [ videoAttr1, videoAttr2 ] ); + * ``` + */ + + /** + * 查询当前光标所在处是否是一个视频 + * @command insertvideo + * @method queryCommandState + * @param { String } cmd 需要查询的命令字符串 + * @return { int } 如果当前光标所在处的元素是一个视频对象, 则返回1,否则返回0 + * @example + * ```javascript + * + * //editor 是编辑器实例 + * editor.queryCommandState( 'insertvideo' ); + * ``` + */ + me.commands["insertvideo"] = { + execCommand: function (cmd, videoObjs, type) { + videoObjs = utils.isArray(videoObjs) ? videoObjs : [videoObjs]; + var html = [], id = 'tmpVedio', cl; + for (var i = 0, vi, len = videoObjs.length; i < len; i++) { + vi = videoObjs[i]; + cl = (type == 'upload' ? 'edui-upload-video video-js vjs-default-skin' : 'edui-faked-video'); + html.push(creatInsertStr(vi.url, vi.width || 420, vi.height || 280, id + i, null, cl, 'image')); + } + me.execCommand("inserthtml", html.join(""), true); + var rng = this.selection.getRange(); + for (var i = 0, len = videoObjs.length; i < len; i++) { + var img = this.document.getElementById('tmpVedio' + i); + domUtils.removeAttributes(img, 'id'); + rng.selectNode(img).select(); + me.execCommand('imagefloat', videoObjs[i].align) + } + }, + queryCommandState: function () { + var img = me.selection.getRange().getClosedNode(), + flag = img && (img.className == "edui-faked-video" || img.className.indexOf("edui-upload-video") != -1); + return flag ? 1 : 0; + } + }; + }; + + +// plugins/table.core.js + /** + * Created with JetBrains WebStorm. + * User: taoqili + * Date: 13-1-18 + * Time: 上午11:09 + * To change this template use File | Settings | File Templates. + */ + /** + * UE表格操作类 + * @param table + * @constructor + */ + (function () { + var UETable = UE.UETable = function (table) { + this.table = table; + this.indexTable = []; + this.selectedTds = []; + this.cellsRange = {}; + this.update(table); + }; + + //===以下为静态工具方法=== + UETable.removeSelectedClass = function (cells) { + utils.each(cells, function (cell) { + domUtils.removeClasses(cell, "selectTdClass"); + }) + }; + UETable.addSelectedClass = function (cells) { + utils.each(cells, function (cell) { + domUtils.addClass(cell, "selectTdClass"); + }) + }; + UETable.isEmptyBlock = function (node) { + var reg = new RegExp(domUtils.fillChar, 'g'); + if (node[browser.ie ? 'innerText' : 'textContent'].replace(/^\s*$/, '').replace(reg, '').length > 0) { + return 0; + } + for (var i in dtd.$isNotEmpty) if (dtd.$isNotEmpty.hasOwnProperty(i)) { + if (node.getElementsByTagName(i).length) { + return 0; + } + } + return 1; + }; + UETable.getWidth = function (cell) { + if (!cell) return 0; + return parseInt(domUtils.getComputedStyle(cell, "width"), 10); + }; + + /** + * 获取单元格或者单元格组的“对齐”状态。 如果当前的检测对象是一个单元格组, 只有在满足所有单元格的 水平和竖直 对齐属性都相同的 + * 条件时才会返回其状态值,否则将返回null; 如果当前只检测了一个单元格, 则直接返回当前单元格的对齐状态; + * @param table cell or table cells , 支持单个单元格dom对象 或者 单元格dom对象数组 + * @return { align: 'left' || 'right' || 'center', valign: 'top' || 'middle' || 'bottom' } 或者 null + */ + UETable.getTableCellAlignState = function (cells) { + + !utils.isArray(cells) && (cells = [cells]); + + var result = {}, + status = ['align', 'valign'], + tempStatus = null, + isSame = true;//状态是否相同 + + utils.each(cells, function (cellNode) { + + utils.each(status, function (currentState) { + + tempStatus = cellNode.getAttribute(currentState); + + if (!result[currentState] && tempStatus) { + result[currentState] = tempStatus; + } else if (!result[currentState] || (tempStatus !== result[currentState])) { + isSame = false; + return false; + } + + }); + + return isSame; + + }); + + return isSame ? result : null; + + }; + + /** + * 根据当前选区获取相关的table信息 + * @return {Object} + */ + UETable.getTableItemsByRange = function (editor) { + var start = editor.selection.getStart(); + + //ff下会选中bookmark + if (start && start.id && start.id.indexOf('_baidu_bookmark_start_') === 0 && start.nextSibling) { + start = start.nextSibling; + } + + //在table或者td边缘有可能存在选中tr的情况 + var cell = start && domUtils.findParentByTagName(start, ["td", "th"], true), + tr = cell && cell.parentNode, + caption = start && domUtils.findParentByTagName(start, 'caption', true), + table = caption ? caption.parentNode : tr && tr.parentNode.parentNode; + + return { + cell: cell, + tr: tr, + table: table, + caption: caption + } + }; + UETable.getUETableBySelected = function (editor) { + var table = UETable.getTableItemsByRange(editor).table; + if (table && table.ueTable && table.ueTable.selectedTds.length) { + return table.ueTable; + } + return null; + }; + + UETable.getDefaultValue = function (editor, table) { + var borderMap = { + thin: '0px', + medium: '1px', + thick: '2px' + }, + tableBorder, tdPadding, tdBorder, tmpValue; + if (!table) { + table = editor.document.createElement('table'); + table.insertRow(0).insertCell(0).innerHTML = 'xxx'; + editor.body.appendChild(table); + var td = table.getElementsByTagName('td')[0]; + tmpValue = domUtils.getComputedStyle(table, 'border-left-width'); + tableBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); + tmpValue = domUtils.getComputedStyle(td, 'padding-left'); + tdPadding = parseInt(borderMap[tmpValue] || tmpValue, 10); + tmpValue = domUtils.getComputedStyle(td, 'border-left-width'); + tdBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); + domUtils.remove(table); + return { + tableBorder: tableBorder, + tdPadding: tdPadding, + tdBorder: tdBorder + }; + } else { + td = table.getElementsByTagName('td')[0]; + tmpValue = domUtils.getComputedStyle(table, 'border-left-width'); + tableBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); + tmpValue = domUtils.getComputedStyle(td, 'padding-left'); + tdPadding = parseInt(borderMap[tmpValue] || tmpValue, 10); + tmpValue = domUtils.getComputedStyle(td, 'border-left-width'); + tdBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); + return { + tableBorder: tableBorder, + tdPadding: tdPadding, + tdBorder: tdBorder + }; + } + }; + /** + * 根据当前点击的td或者table获取索引对象 + * @param tdOrTable + */ + UETable.getUETable = function (tdOrTable) { + var tag = tdOrTable.tagName.toLowerCase(); + tdOrTable = (tag == "td" || tag == "th" || tag == 'caption') ? domUtils.findParentByTagName(tdOrTable, "table", true) : tdOrTable; + if (!tdOrTable.ueTable) { + tdOrTable.ueTable = new UETable(tdOrTable); + } + return tdOrTable.ueTable; + }; + + UETable.cloneCell = function (cell, ignoreMerge, keepPro) { + if (!cell || utils.isString(cell)) { + return this.table.ownerDocument.createElement(cell || 'td'); + } + var flag = domUtils.hasClass(cell, "selectTdClass"); + flag && domUtils.removeClasses(cell, "selectTdClass"); + var tmpCell = cell.cloneNode(true); + if (ignoreMerge) { + tmpCell.rowSpan = tmpCell.colSpan = 1; + } + //去掉宽高 + !keepPro && domUtils.removeAttributes(tmpCell, 'width height'); + !keepPro && domUtils.removeAttributes(tmpCell, 'style'); + + tmpCell.style.borderLeftStyle = ""; + tmpCell.style.borderTopStyle = ""; + tmpCell.style.borderLeftColor = cell.style.borderRightColor; + tmpCell.style.borderLeftWidth = cell.style.borderRightWidth; + tmpCell.style.borderTopColor = cell.style.borderBottomColor; + tmpCell.style.borderTopWidth = cell.style.borderBottomWidth; + flag && domUtils.addClass(cell, "selectTdClass"); + return tmpCell; + } + + UETable.prototype = { + getMaxRows: function () { + var rows = this.table.rows, maxLen = 1; + for (var i = 0, row; row = rows[i]; i++) { + var currentMax = 1; + for (var j = 0, cj; cj = row.cells[j++];) { + currentMax = Math.max(cj.rowSpan || 1, currentMax); + } + maxLen = Math.max(currentMax + i, maxLen); + } + return maxLen; + }, + /** + * 获取当前表格的最大列数 + */ + getMaxCols: function () { + var rows = this.table.rows, maxLen = 0, cellRows = {}; + for (var i = 0, row; row = rows[i]; i++) { + var cellsNum = 0; + for (var j = 0, cj; cj = row.cells[j++];) { + cellsNum += (cj.colSpan || 1); + if (cj.rowSpan && cj.rowSpan > 1) { + for (var k = 1; k < cj.rowSpan; k++) { + if (!cellRows['row_' + (i + k)]) { + cellRows['row_' + (i + k)] = (cj.colSpan || 1); + } else { + cellRows['row_' + (i + k)]++ + } + } + + } + } + cellsNum += cellRows['row_' + i] || 0; + maxLen = Math.max(cellsNum, maxLen); + } + return maxLen; + }, + getCellColIndex: function (cell) { + + }, + /** + * 获取当前cell旁边的单元格, + * @param cell + * @param right + */ + getHSideCell: function (cell, right) { + try { + var cellInfo = this.getCellInfo(cell), + previewRowIndex, previewColIndex; + var len = this.selectedTds.length, + range = this.cellsRange; + //首行或者首列没有前置单元格 + if ((!right && (!len ? !cellInfo.colIndex : !range.beginColIndex)) || (right && (!len ? (cellInfo.colIndex == (this.colsNum - 1)) : (range.endColIndex == this.colsNum - 1)))) return null; + + previewRowIndex = !len ? cellInfo.rowIndex : range.beginRowIndex; + previewColIndex = !right ? (!len ? (cellInfo.colIndex < 1 ? 0 : (cellInfo.colIndex - 1)) : range.beginColIndex - 1) + : (!len ? cellInfo.colIndex + 1 : range.endColIndex + 1); + return this.getCell(this.indexTable[previewRowIndex][previewColIndex].rowIndex, this.indexTable[previewRowIndex][previewColIndex].cellIndex); + } catch (e) { + showError(e); + } + }, + getTabNextCell: function (cell, preRowIndex) { + var cellInfo = this.getCellInfo(cell), + rowIndex = preRowIndex || cellInfo.rowIndex, + colIndex = cellInfo.colIndex + 1 + (cellInfo.colSpan - 1), + nextCell; + try { + nextCell = this.getCell(this.indexTable[rowIndex][colIndex].rowIndex, this.indexTable[rowIndex][colIndex].cellIndex); + } catch (e) { + try { + rowIndex = rowIndex * 1 + 1; + colIndex = 0; + nextCell = this.getCell(this.indexTable[rowIndex][colIndex].rowIndex, this.indexTable[rowIndex][colIndex].cellIndex); + } catch (e) { + } + } + return nextCell; + + }, + /** + * 获取视觉上的后置单元格 + * @param cell + * @param bottom + */ + getVSideCell: function (cell, bottom, ignoreRange) { + try { + var cellInfo = this.getCellInfo(cell), + nextRowIndex, nextColIndex; + var len = this.selectedTds.length && !ignoreRange, + range = this.cellsRange; + //末行或者末列没有后置单元格 + if ((!bottom && (cellInfo.rowIndex == 0)) || (bottom && (!len ? (cellInfo.rowIndex + cellInfo.rowSpan > this.rowsNum - 1) : (range.endRowIndex == this.rowsNum - 1)))) return null; + + nextRowIndex = !bottom ? (!len ? cellInfo.rowIndex - 1 : range.beginRowIndex - 1) + : (!len ? (cellInfo.rowIndex + cellInfo.rowSpan) : range.endRowIndex + 1); + nextColIndex = !len ? cellInfo.colIndex : range.beginColIndex; + return this.getCell(this.indexTable[nextRowIndex][nextColIndex].rowIndex, this.indexTable[nextRowIndex][nextColIndex].cellIndex); + } catch (e) { + showError(e); + } + }, + /** + * 获取相同结束位置的单元格,xOrY指代了是获取x轴相同还是y轴相同 + */ + getSameEndPosCells: function (cell, xOrY) { + try { + var flag = (xOrY.toLowerCase() === "x"), + end = domUtils.getXY(cell)[flag ? 'x' : 'y'] + cell["offset" + (flag ? 'Width' : 'Height')], + rows = this.table.rows, + cells = null, returns = []; + for (var i = 0; i < this.rowsNum; i++) { + cells = rows[i].cells; + for (var j = 0, tmpCell; tmpCell = cells[j++];) { + var tmpEnd = domUtils.getXY(tmpCell)[flag ? 'x' : 'y'] + tmpCell["offset" + (flag ? 'Width' : 'Height')]; + //对应行的td已经被上面行rowSpan了 + if (tmpEnd > end && flag) break; + if (cell == tmpCell || end == tmpEnd) { + //只获取单一的单元格 + //todo 仅获取单一单元格在特定情况下会造成returns为空,从而影响后续的拖拽实现,修正这个。需考虑性能 + if (tmpCell[flag ? "colSpan" : "rowSpan"] == 1) { + returns.push(tmpCell); + } + if (flag) break; + } + } + } + return returns; + } catch (e) { + showError(e); + } + }, + setCellContent: function (cell, content) { + cell.innerHTML = content || (browser.ie ? domUtils.fillChar : "
      "); + }, + cloneCell: UETable.cloneCell, + /** + * 获取跟当前单元格的右边竖线为左边的所有未合并单元格 + */ + getSameStartPosXCells: function (cell) { + try { + var start = domUtils.getXY(cell).x + cell.offsetWidth, + rows = this.table.rows, cells, returns = []; + for (var i = 0; i < this.rowsNum; i++) { + cells = rows[i].cells; + for (var j = 0, tmpCell; tmpCell = cells[j++];) { + var tmpStart = domUtils.getXY(tmpCell).x; + if (tmpStart > start) break; + if (tmpStart == start && tmpCell.colSpan == 1) { + returns.push(tmpCell); + break; + } + } + } + return returns; + } catch (e) { + showError(e); + } + }, + /** + * 更新table对应的索引表 + */ + update: function (table) { + this.table = table || this.table; + this.selectedTds = []; + this.cellsRange = {}; + this.indexTable = []; + var rows = this.table.rows, + rowsNum = this.getMaxRows(), + dNum = rowsNum - rows.length, + colsNum = this.getMaxCols(); + while (dNum--) { + this.table.insertRow(rows.length); + } + this.rowsNum = rowsNum; + this.colsNum = colsNum; + for (var i = 0, len = rows.length; i < len; i++) { + this.indexTable[i] = new Array(colsNum); + } + //填充索引表 + for (var rowIndex = 0, row; row = rows[rowIndex]; rowIndex++) { + for (var cellIndex = 0, cell, cells = row.cells; cell = cells[cellIndex]; cellIndex++) { + //修正整行被rowSpan时导致的行数计算错误 + if (cell.rowSpan > rowsNum) { + cell.rowSpan = rowsNum; + } + var colIndex = cellIndex, + rowSpan = cell.rowSpan || 1, + colSpan = cell.colSpan || 1; + //当已经被上一行rowSpan或者被前一列colSpan了,则跳到下一个单元格进行 + while (this.indexTable[rowIndex][colIndex]) colIndex++; + for (var j = 0; j < rowSpan; j++) { + for (var k = 0; k < colSpan; k++) { + this.indexTable[rowIndex + j][colIndex + k] = { + rowIndex: rowIndex, + cellIndex: cellIndex, + colIndex: colIndex, + rowSpan: rowSpan, + colSpan: colSpan + } + } + } + } + } + //修复残缺td + for (j = 0; j < rowsNum; j++) { + for (k = 0; k < colsNum; k++) { + if (this.indexTable[j][k] === undefined) { + row = rows[j]; + cell = row.cells[row.cells.length - 1]; + cell = cell ? cell.cloneNode(true) : this.table.ownerDocument.createElement("td"); + this.setCellContent(cell); + if (cell.colSpan !== 1) cell.colSpan = 1; + if (cell.rowSpan !== 1) cell.rowSpan = 1; + row.appendChild(cell); + this.indexTable[j][k] = { + rowIndex: j, + cellIndex: cell.cellIndex, + colIndex: k, + rowSpan: 1, + colSpan: 1 + } + } + } + } + //当框选后删除行或者列后撤销,需要重建选区。 + var tds = domUtils.getElementsByTagName(this.table, "td"), + selectTds = []; + utils.each(tds, function (td) { + if (domUtils.hasClass(td, "selectTdClass")) { + selectTds.push(td); + } + }); + if (selectTds.length) { + var start = selectTds[0], + end = selectTds[selectTds.length - 1], + startInfo = this.getCellInfo(start), + endInfo = this.getCellInfo(end); + this.selectedTds = selectTds; + this.cellsRange = { + beginRowIndex: startInfo.rowIndex, + beginColIndex: startInfo.colIndex, + endRowIndex: endInfo.rowIndex + endInfo.rowSpan - 1, + endColIndex: endInfo.colIndex + endInfo.colSpan - 1 + }; + } + //给第一行设置firstRow的样式名称,在排序图标的样式上使用到 + if (!domUtils.hasClass(this.table.rows[0], "firstRow")) { + domUtils.addClass(this.table.rows[0], "firstRow"); + for (var i = 1; i < this.table.rows.length; i++) { + domUtils.removeClasses(this.table.rows[i], "firstRow"); + } + } + }, + /** + * 获取单元格的索引信息 + */ + getCellInfo: function (cell) { + if (!cell) return; + var cellIndex = cell.cellIndex, + rowIndex = cell.parentNode.rowIndex, + rowInfo = this.indexTable[rowIndex], + numCols = this.colsNum; + for (var colIndex = cellIndex; colIndex < numCols; colIndex++) { + var cellInfo = rowInfo[colIndex]; + if (cellInfo.rowIndex === rowIndex && cellInfo.cellIndex === cellIndex) { + return cellInfo; + } + } + }, + /** + * 根据行列号获取单元格 + */ + getCell: function (rowIndex, cellIndex) { + return rowIndex < this.rowsNum && this.table.rows[rowIndex].cells[cellIndex] || null; + }, + /** + * 删除单元格 + */ + deleteCell: function (cell, rowIndex) { + rowIndex = typeof rowIndex == 'number' ? rowIndex : cell.parentNode.rowIndex; + var row = this.table.rows[rowIndex]; + row.deleteCell(cell.cellIndex); + }, + /** + * 根据始末两个单元格获取被框选的所有单元格范围 + */ + getCellsRange: function (cellA, cellB) { + function checkRange(beginRowIndex, beginColIndex, endRowIndex, endColIndex) { + var tmpBeginRowIndex = beginRowIndex, + tmpBeginColIndex = beginColIndex, + tmpEndRowIndex = endRowIndex, + tmpEndColIndex = endColIndex, + cellInfo, colIndex, rowIndex; + // 通过indexTable检查是否存在超出TableRange上边界的情况 + if (beginRowIndex > 0) { + for (colIndex = beginColIndex; colIndex < endColIndex; colIndex++) { + cellInfo = me.indexTable[beginRowIndex][colIndex]; + rowIndex = cellInfo.rowIndex; + if (rowIndex < beginRowIndex) { + tmpBeginRowIndex = Math.min(rowIndex, tmpBeginRowIndex); + } + } + } + // 通过indexTable检查是否存在超出TableRange右边界的情况 + if (endColIndex < me.colsNum) { + for (rowIndex = beginRowIndex; rowIndex < endRowIndex; rowIndex++) { + cellInfo = me.indexTable[rowIndex][endColIndex]; + colIndex = cellInfo.colIndex + cellInfo.colSpan - 1; + if (colIndex > endColIndex) { + tmpEndColIndex = Math.max(colIndex, tmpEndColIndex); + } + } + } + // 检查是否有超出TableRange下边界的情况 + if (endRowIndex < me.rowsNum) { + for (colIndex = beginColIndex; colIndex < endColIndex; colIndex++) { + cellInfo = me.indexTable[endRowIndex][colIndex]; + rowIndex = cellInfo.rowIndex + cellInfo.rowSpan - 1; + if (rowIndex > endRowIndex) { + tmpEndRowIndex = Math.max(rowIndex, tmpEndRowIndex); + } + } + } + // 检查是否有超出TableRange左边界的情况 + if (beginColIndex > 0) { + for (rowIndex = beginRowIndex; rowIndex < endRowIndex; rowIndex++) { + cellInfo = me.indexTable[rowIndex][beginColIndex]; + colIndex = cellInfo.colIndex; + if (colIndex < beginColIndex) { + tmpBeginColIndex = Math.min(cellInfo.colIndex, tmpBeginColIndex); + } + } + } + //递归调用直至所有完成所有框选单元格的扩展 + if (tmpBeginRowIndex != beginRowIndex || tmpBeginColIndex != beginColIndex || tmpEndRowIndex != endRowIndex || tmpEndColIndex != endColIndex) { + return checkRange(tmpBeginRowIndex, tmpBeginColIndex, tmpEndRowIndex, tmpEndColIndex); + } else { + // 不需要扩展TableRange的情况 + return { + beginRowIndex: beginRowIndex, + beginColIndex: beginColIndex, + endRowIndex: endRowIndex, + endColIndex: endColIndex + }; + } + } + + try { + var me = this, + cellAInfo = me.getCellInfo(cellA); + if (cellA === cellB) { + return { + beginRowIndex: cellAInfo.rowIndex, + beginColIndex: cellAInfo.colIndex, + endRowIndex: cellAInfo.rowIndex + cellAInfo.rowSpan - 1, + endColIndex: cellAInfo.colIndex + cellAInfo.colSpan - 1 + }; + } + var cellBInfo = me.getCellInfo(cellB); + // 计算TableRange的四个边 + var beginRowIndex = Math.min(cellAInfo.rowIndex, cellBInfo.rowIndex), + beginColIndex = Math.min(cellAInfo.colIndex, cellBInfo.colIndex), + endRowIndex = Math.max(cellAInfo.rowIndex + cellAInfo.rowSpan - 1, cellBInfo.rowIndex + cellBInfo.rowSpan - 1), + endColIndex = Math.max(cellAInfo.colIndex + cellAInfo.colSpan - 1, cellBInfo.colIndex + cellBInfo.colSpan - 1); + + return checkRange(beginRowIndex, beginColIndex, endRowIndex, endColIndex); + } catch (e) { + //throw e; + } + }, + /** + * 依据cellsRange获取对应的单元格集合 + */ + getCells: function (range) { + //每次获取cells之前必须先清除上次的选择,否则会对后续获取操作造成影响 + this.clearSelected(); + var beginRowIndex = range.beginRowIndex, + beginColIndex = range.beginColIndex, + endRowIndex = range.endRowIndex, + endColIndex = range.endColIndex, + cellInfo, rowIndex, colIndex, tdHash = {}, returnTds = []; + for (var i = beginRowIndex; i <= endRowIndex; i++) { + for (var j = beginColIndex; j <= endColIndex; j++) { + cellInfo = this.indexTable[i][j]; + rowIndex = cellInfo.rowIndex; + colIndex = cellInfo.colIndex; + // 如果Cells里已经包含了此Cell则跳过 + var key = rowIndex + '|' + colIndex; + if (tdHash[key]) continue; + tdHash[key] = 1; + if (rowIndex < i || colIndex < j || rowIndex + cellInfo.rowSpan - 1 > endRowIndex || colIndex + cellInfo.colSpan - 1 > endColIndex) { + return null; + } + returnTds.push(this.getCell(rowIndex, cellInfo.cellIndex)); + } + } + return returnTds; + }, + /** + * 清理已经选中的单元格 + */ + clearSelected: function () { + UETable.removeSelectedClass(this.selectedTds); + this.selectedTds = []; + this.cellsRange = {}; + }, + /** + * 根据range设置已经选中的单元格 + */ + setSelected: function (range) { + var cells = this.getCells(range); + UETable.addSelectedClass(cells); + this.selectedTds = cells; + this.cellsRange = range; + }, + isFullRow: function () { + var range = this.cellsRange; + return (range.endColIndex - range.beginColIndex + 1) == this.colsNum; + }, + isFullCol: function () { + var range = this.cellsRange, + table = this.table, + ths = table.getElementsByTagName("th"), + rows = range.endRowIndex - range.beginRowIndex + 1; + return !ths.length ? rows == this.rowsNum : rows == this.rowsNum || (rows == this.rowsNum - 1); + + }, + /** + * 获取视觉上的前置单元格,默认是左边,top传入时 + * @param cell + * @param top + */ + getNextCell: function (cell, bottom, ignoreRange) { + try { + var cellInfo = this.getCellInfo(cell), + nextRowIndex, nextColIndex; + var len = this.selectedTds.length && !ignoreRange, + range = this.cellsRange; + //末行或者末列没有后置单元格 + if ((!bottom && (cellInfo.rowIndex == 0)) || (bottom && (!len ? (cellInfo.rowIndex + cellInfo.rowSpan > this.rowsNum - 1) : (range.endRowIndex == this.rowsNum - 1)))) return null; + + nextRowIndex = !bottom ? (!len ? cellInfo.rowIndex - 1 : range.beginRowIndex - 1) + : (!len ? (cellInfo.rowIndex + cellInfo.rowSpan) : range.endRowIndex + 1); + nextColIndex = !len ? cellInfo.colIndex : range.beginColIndex; + return this.getCell(this.indexTable[nextRowIndex][nextColIndex].rowIndex, this.indexTable[nextRowIndex][nextColIndex].cellIndex); + } catch (e) { + showError(e); + } + }, + getPreviewCell: function (cell, top) { + try { + var cellInfo = this.getCellInfo(cell), + previewRowIndex, previewColIndex; + var len = this.selectedTds.length, + range = this.cellsRange; + //首行或者首列没有前置单元格 + if ((!top && (!len ? !cellInfo.colIndex : !range.beginColIndex)) || (top && (!len ? (cellInfo.rowIndex > (this.colsNum - 1)) : (range.endColIndex == this.colsNum - 1)))) return null; + + previewRowIndex = !top ? (!len ? cellInfo.rowIndex : range.beginRowIndex) + : (!len ? (cellInfo.rowIndex < 1 ? 0 : (cellInfo.rowIndex - 1)) : range.beginRowIndex); + previewColIndex = !top ? (!len ? (cellInfo.colIndex < 1 ? 0 : (cellInfo.colIndex - 1)) : range.beginColIndex - 1) + : (!len ? cellInfo.colIndex : range.endColIndex + 1); + return this.getCell(this.indexTable[previewRowIndex][previewColIndex].rowIndex, this.indexTable[previewRowIndex][previewColIndex].cellIndex); + } catch (e) { + showError(e); + } + }, + /** + * 移动单元格中的内容 + */ + moveContent: function (cellTo, cellFrom) { + if (UETable.isEmptyBlock(cellFrom)) return; + if (UETable.isEmptyBlock(cellTo)) { + cellTo.innerHTML = cellFrom.innerHTML; + return; + } + var child = cellTo.lastChild; + if (child.nodeType == 3 || !dtd.$block[child.tagName]) { + cellTo.appendChild(cellTo.ownerDocument.createElement('br')) + } + while (child = cellFrom.firstChild) { + cellTo.appendChild(child); + } + }, + /** + * 向右合并单元格 + */ + mergeRight: function (cell) { + var cellInfo = this.getCellInfo(cell), + rightColIndex = cellInfo.colIndex + cellInfo.colSpan, + rightCellInfo = this.indexTable[cellInfo.rowIndex][rightColIndex], + rightCell = this.getCell(rightCellInfo.rowIndex, rightCellInfo.cellIndex); + //合并 + cell.colSpan = cellInfo.colSpan + rightCellInfo.colSpan; + //被合并的单元格不应存在宽度属性 + cell.removeAttribute("width"); + //移动内容 + this.moveContent(cell, rightCell); + //删掉被合并的Cell + this.deleteCell(rightCell, rightCellInfo.rowIndex); + this.update(); + }, + /** + * 向下合并单元格 + */ + mergeDown: function (cell) { + var cellInfo = this.getCellInfo(cell), + downRowIndex = cellInfo.rowIndex + cellInfo.rowSpan, + downCellInfo = this.indexTable[downRowIndex][cellInfo.colIndex], + downCell = this.getCell(downCellInfo.rowIndex, downCellInfo.cellIndex); + cell.rowSpan = cellInfo.rowSpan + downCellInfo.rowSpan; + cell.removeAttribute("height"); + this.moveContent(cell, downCell); + this.deleteCell(downCell, downCellInfo.rowIndex); + this.update(); + }, + /** + * 合并整个range中的内容 + */ + mergeRange: function () { + //由于合并操作可以在任意时刻进行,所以无法通过鼠标位置等信息实时生成range,只能通过缓存实例中的cellsRange对象来访问 + var range = this.cellsRange, + leftTopCell = this.getCell(range.beginRowIndex, this.indexTable[range.beginRowIndex][range.beginColIndex].cellIndex); + + if (leftTopCell.tagName == "TH" && range.endRowIndex !== range.beginRowIndex) { + var index = this.indexTable, + info = this.getCellInfo(leftTopCell); + leftTopCell = this.getCell(1, index[1][info.colIndex].cellIndex); + range = this.getCellsRange(leftTopCell, this.getCell(index[this.rowsNum - 1][info.colIndex].rowIndex, index[this.rowsNum - 1][info.colIndex].cellIndex)); + } + + // 删除剩余的Cells + var cells = this.getCells(range); + for (var i = 0, ci; ci = cells[i++];) { + if (ci !== leftTopCell) { + this.moveContent(leftTopCell, ci); + this.deleteCell(ci); + } + } + // 修改左上角Cell的rowSpan和colSpan,并调整宽度属性设置 + leftTopCell.rowSpan = range.endRowIndex - range.beginRowIndex + 1; + leftTopCell.rowSpan > 1 && leftTopCell.removeAttribute("height"); + leftTopCell.colSpan = range.endColIndex - range.beginColIndex + 1; + leftTopCell.colSpan > 1 && leftTopCell.removeAttribute("width"); + if (leftTopCell.rowSpan == this.rowsNum && leftTopCell.colSpan != 1) { + leftTopCell.colSpan = 1; + } + + if (leftTopCell.colSpan == this.colsNum && leftTopCell.rowSpan != 1) { + var rowIndex = leftTopCell.parentNode.rowIndex; + //解决IE下的表格操作问题 + if (this.table.deleteRow) { + for (var i = rowIndex + 1, curIndex = rowIndex + 1, len = leftTopCell.rowSpan; i < len; i++) { + this.table.deleteRow(curIndex); + } + } else { + for (var i = 0, len = leftTopCell.rowSpan - 1; i < len; i++) { + var row = this.table.rows[rowIndex + 1]; + row.parentNode.removeChild(row); + } + } + leftTopCell.rowSpan = 1; + } + this.update(); + }, + /** + * 插入一行单元格 + */ + insertRow: function (rowIndex, sourceCell) { + var numCols = this.colsNum, + table = this.table, + row = table.insertRow(rowIndex), cell, + isInsertTitle = typeof sourceCell == 'string' && sourceCell.toUpperCase() == 'TH'; + + function replaceTdToTh(colIndex, cell, tableRow) { + if (colIndex == 0) { + var tr = tableRow.nextSibling || tableRow.previousSibling, + th = tr.cells[colIndex]; + if (th.tagName == 'TH') { + th = cell.ownerDocument.createElement("th"); + th.appendChild(cell.firstChild); + tableRow.insertBefore(th, cell); + domUtils.remove(cell) + } + } else { + if (cell.tagName == 'TH') { + var td = cell.ownerDocument.createElement("td"); + td.appendChild(cell.firstChild); + tableRow.insertBefore(td, cell); + domUtils.remove(cell) + } + } + } + + //首行直接插入,无需考虑部分单元格被rowspan的情况 + if (rowIndex == 0 || rowIndex == this.rowsNum) { + for (var colIndex = 0; colIndex < numCols; colIndex++) { + cell = this.cloneCell(sourceCell, true); + this.setCellContent(cell); + cell.getAttribute('vAlign') && cell.setAttribute('vAlign', cell.getAttribute('vAlign')); + row.appendChild(cell); + if (!isInsertTitle) replaceTdToTh(colIndex, cell, row); + } + } else { + var infoRow = this.indexTable[rowIndex], + cellIndex = 0; + for (colIndex = 0; colIndex < numCols; colIndex++) { + var cellInfo = infoRow[colIndex]; + //如果存在某个单元格的rowspan穿过待插入行的位置,则修改该单元格的rowspan即可,无需插入单元格 + if (cellInfo.rowIndex < rowIndex) { + cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); + cell.rowSpan = cellInfo.rowSpan + 1; + } else { + cell = this.cloneCell(sourceCell, true); + this.setCellContent(cell); + row.appendChild(cell); + } + if (!isInsertTitle) replaceTdToTh(colIndex, cell, row); + } + } + //框选时插入不触发contentchange,需要手动更新索引。 + this.update(); + return row; + }, + /** + * 删除一行单元格 + * @param rowIndex + */ + deleteRow: function (rowIndex) { + var row = this.table.rows[rowIndex], + infoRow = this.indexTable[rowIndex], + colsNum = this.colsNum, + count = 0; //处理计数 + for (var colIndex = 0; colIndex < colsNum;) { + var cellInfo = infoRow[colIndex], + cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); + if (cell.rowSpan > 1) { + if (cellInfo.rowIndex == rowIndex) { + var clone = cell.cloneNode(true); + clone.rowSpan = cell.rowSpan - 1; + clone.innerHTML = ""; + cell.rowSpan = 1; + var nextRowIndex = rowIndex + 1, + nextRow = this.table.rows[nextRowIndex], + insertCellIndex, + preMerged = this.getPreviewMergedCellsNum(nextRowIndex, colIndex) - count; + if (preMerged < colIndex) { + insertCellIndex = colIndex - preMerged - 1; + //nextRow.insertCell(insertCellIndex); + domUtils.insertAfter(nextRow.cells[insertCellIndex], clone); + } else { + if (nextRow.cells.length) nextRow.insertBefore(clone, nextRow.cells[0]) + } + count += 1; + //cell.parentNode.removeChild(cell); + } + } + colIndex += cell.colSpan || 1; + } + var deleteTds = [], cacheMap = {}; + for (colIndex = 0; colIndex < colsNum; colIndex++) { + var tmpRowIndex = infoRow[colIndex].rowIndex, + tmpCellIndex = infoRow[colIndex].cellIndex, + key = tmpRowIndex + "_" + tmpCellIndex; + if (cacheMap[key]) continue; + cacheMap[key] = 1; + cell = this.getCell(tmpRowIndex, tmpCellIndex); + deleteTds.push(cell); + } + var mergeTds = []; + utils.each(deleteTds, function (td) { + if (td.rowSpan == 1) { + td.parentNode.removeChild(td); + } else { + mergeTds.push(td); + } + }); + utils.each(mergeTds, function (td) { + td.rowSpan--; + }); + row.parentNode.removeChild(row); + //浏览器方法本身存在bug,采用自定义方法删除 + //this.table.deleteRow(rowIndex); + this.update(); + }, + insertCol: function (colIndex, sourceCell, defaultValue) { + var rowsNum = this.rowsNum, + rowIndex = 0, + tableRow, cell, + backWidth = parseInt((this.table.offsetWidth - (this.colsNum + 1) * 20 - (this.colsNum + 1)) / (this.colsNum + 1), 10), + isInsertTitleCol = typeof sourceCell == 'string' && sourceCell.toUpperCase() == 'TH'; + + function replaceTdToTh(rowIndex, cell, tableRow) { + if (rowIndex == 0) { + var th = cell.nextSibling || cell.previousSibling; + if (th.tagName == 'TH') { + th = cell.ownerDocument.createElement("th"); + th.appendChild(cell.firstChild); + tableRow.insertBefore(th, cell); + domUtils.remove(cell) + } + } else { + if (cell.tagName == 'TH') { + var td = cell.ownerDocument.createElement("td"); + td.appendChild(cell.firstChild); + tableRow.insertBefore(td, cell); + domUtils.remove(cell) + } + } + } + + var preCell; + if (colIndex == 0 || colIndex == this.colsNum) { + for (; rowIndex < rowsNum; rowIndex++) { + tableRow = this.table.rows[rowIndex]; + preCell = tableRow.cells[colIndex == 0 ? colIndex : tableRow.cells.length]; + cell = this.cloneCell(sourceCell, true); //tableRow.insertCell(colIndex == 0 ? colIndex : tableRow.cells.length); + this.setCellContent(cell); + cell.setAttribute('vAlign', cell.getAttribute('vAlign')); + preCell && cell.setAttribute('width', preCell.getAttribute('width')); + if (!colIndex) { + tableRow.insertBefore(cell, tableRow.cells[0]); + } else { + domUtils.insertAfter(tableRow.cells[tableRow.cells.length - 1], cell); + } + if (!isInsertTitleCol) replaceTdToTh(rowIndex, cell, tableRow) + } + } else { + for (; rowIndex < rowsNum; rowIndex++) { + var cellInfo = this.indexTable[rowIndex][colIndex]; + if (cellInfo.colIndex < colIndex) { + cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); + cell.colSpan = cellInfo.colSpan + 1; + } else { + tableRow = this.table.rows[rowIndex]; + preCell = tableRow.cells[cellInfo.cellIndex]; + + cell = this.cloneCell(sourceCell, true);//tableRow.insertCell(cellInfo.cellIndex); + this.setCellContent(cell); + cell.setAttribute('vAlign', cell.getAttribute('vAlign')); + preCell && cell.setAttribute('width', preCell.getAttribute('width')); + //防止IE下报错 + preCell ? tableRow.insertBefore(cell, preCell) : tableRow.appendChild(cell); + } + if (!isInsertTitleCol) replaceTdToTh(rowIndex, cell, tableRow); + } + } + //框选时插入不触发contentchange,需要手动更新索引 + this.update(); + this.updateWidth(backWidth, defaultValue || {tdPadding: 10, tdBorder: 1}); + }, + updateWidth: function (width, defaultValue) { + var table = this.table, + tmpWidth = UETable.getWidth(table) - defaultValue.tdPadding * 2 - defaultValue.tdBorder + width; + if (tmpWidth < table.ownerDocument.body.offsetWidth) { + table.setAttribute("width", tmpWidth); + return; + } + var tds = domUtils.getElementsByTagName(this.table, "td th"); + utils.each(tds, function (td) { + td.setAttribute("width", width); + }) + }, + deleteCol: function (colIndex) { + var indexTable = this.indexTable, + tableRows = this.table.rows, + backTableWidth = this.table.getAttribute("width"), + backTdWidth = 0, + rowsNum = this.rowsNum, + cacheMap = {}; + for (var rowIndex = 0; rowIndex < rowsNum;) { + var infoRow = indexTable[rowIndex], + cellInfo = infoRow[colIndex], + key = cellInfo.rowIndex + '_' + cellInfo.colIndex; + // 跳过已经处理过的Cell + if (cacheMap[key]) continue; + cacheMap[key] = 1; + var cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); + if (!backTdWidth) backTdWidth = cell && parseInt(cell.offsetWidth / cell.colSpan, 10).toFixed(0); + // 如果Cell的colSpan大于1, 就修改colSpan, 否则就删掉这个Cell + if (cell.colSpan > 1) { + cell.colSpan--; + } else { + tableRows[rowIndex].deleteCell(cellInfo.cellIndex); + } + rowIndex += cellInfo.rowSpan || 1; + } + this.table.setAttribute("width", backTableWidth - backTdWidth); + this.update(); + }, + splitToCells: function (cell) { + var me = this, + cells = this.splitToRows(cell); + utils.each(cells, function (cell) { + me.splitToCols(cell); + }) + }, + splitToRows: function (cell) { + var cellInfo = this.getCellInfo(cell), + rowIndex = cellInfo.rowIndex, + colIndex = cellInfo.colIndex, + results = []; + // 修改Cell的rowSpan + cell.rowSpan = 1; + results.push(cell); + // 补齐单元格 + for (var i = rowIndex, endRow = rowIndex + cellInfo.rowSpan; i < endRow; i++) { + if (i == rowIndex) continue; + var tableRow = this.table.rows[i], + tmpCell = tableRow.insertCell(colIndex - this.getPreviewMergedCellsNum(i, colIndex)); + tmpCell.colSpan = cellInfo.colSpan; + this.setCellContent(tmpCell); + tmpCell.setAttribute('vAlign', cell.getAttribute('vAlign')); + tmpCell.setAttribute('align', cell.getAttribute('align')); + if (cell.style.cssText) { + tmpCell.style.cssText = cell.style.cssText; + } + results.push(tmpCell); + } + this.update(); + return results; + }, + getPreviewMergedCellsNum: function (rowIndex, colIndex) { + var indexRow = this.indexTable[rowIndex], + num = 0; + for (var i = 0; i < colIndex;) { + var colSpan = indexRow[i].colSpan, + tmpRowIndex = indexRow[i].rowIndex; + num += (colSpan - (tmpRowIndex == rowIndex ? 1 : 0)); + i += colSpan; + } + return num; + }, + splitToCols: function (cell) { + var backWidth = (cell.offsetWidth / cell.colSpan - 22).toFixed(0), + + cellInfo = this.getCellInfo(cell), + rowIndex = cellInfo.rowIndex, + colIndex = cellInfo.colIndex, + results = []; + // 修改Cell的rowSpan + cell.colSpan = 1; + cell.setAttribute("width", backWidth); + results.push(cell); + // 补齐单元格 + for (var j = colIndex, endCol = colIndex + cellInfo.colSpan; j < endCol; j++) { + if (j == colIndex) continue; + var tableRow = this.table.rows[rowIndex], + tmpCell = tableRow.insertCell(this.indexTable[rowIndex][j].cellIndex + 1); + tmpCell.rowSpan = cellInfo.rowSpan; + this.setCellContent(tmpCell); + tmpCell.setAttribute('vAlign', cell.getAttribute('vAlign')); + tmpCell.setAttribute('align', cell.getAttribute('align')); + tmpCell.setAttribute('width', backWidth); + if (cell.style.cssText) { + tmpCell.style.cssText = cell.style.cssText; + } + //处理th的情况 + if (cell.tagName == 'TH') { + var th = cell.ownerDocument.createElement('th'); + th.appendChild(tmpCell.firstChild); + th.setAttribute('vAlign', cell.getAttribute('vAlign')); + th.rowSpan = tmpCell.rowSpan; + tableRow.insertBefore(th, tmpCell); + domUtils.remove(tmpCell); + } + results.push(tmpCell); + } + this.update(); + return results; + }, + isLastCell: function (cell, rowsNum, colsNum) { + rowsNum = rowsNum || this.rowsNum; + colsNum = colsNum || this.colsNum; + var cellInfo = this.getCellInfo(cell); + return ((cellInfo.rowIndex + cellInfo.rowSpan) == rowsNum) && + ((cellInfo.colIndex + cellInfo.colSpan) == colsNum); + }, + getLastCell: function (cells) { + cells = cells || this.table.getElementsByTagName("td"); + var firstInfo = this.getCellInfo(cells[0]); + var me = this, last = cells[0], + tr = last.parentNode, + cellsNum = 0, cols = 0, rows; + utils.each(cells, function (cell) { + if (cell.parentNode == tr) cols += cell.colSpan || 1; + cellsNum += cell.rowSpan * cell.colSpan || 1; + }); + rows = cellsNum / cols; + utils.each(cells, function (cell) { + if (me.isLastCell(cell, rows, cols)) { + last = cell; + return false; + } + }); + return last; + + }, + selectRow: function (rowIndex) { + var indexRow = this.indexTable[rowIndex], + start = this.getCell(indexRow[0].rowIndex, indexRow[0].cellIndex), + end = this.getCell(indexRow[this.colsNum - 1].rowIndex, indexRow[this.colsNum - 1].cellIndex), + range = this.getCellsRange(start, end); + this.setSelected(range); + }, + selectTable: function () { + var tds = this.table.getElementsByTagName("td"), + range = this.getCellsRange(tds[0], tds[tds.length - 1]); + this.setSelected(range); + }, + setBackground: function (cells, value) { + if (typeof value === "string") { + utils.each(cells, function (cell) { + cell.style.backgroundColor = value; + }) + } else if (typeof value === "object") { + value = utils.extend({ + repeat: true, + colorList: ["#ddd", "#fff"] + }, value); + var rowIndex = this.getCellInfo(cells[0]).rowIndex, + count = 0, + colors = value.colorList, + getColor = function (list, index, repeat) { + return list[index] ? list[index] : repeat ? list[index % list.length] : ""; + }; + for (var i = 0, cell; cell = cells[i++];) { + var cellInfo = this.getCellInfo(cell); + cell.style.backgroundColor = getColor(colors, ((rowIndex + count) == cellInfo.rowIndex) ? count : ++count, value.repeat); + } + } + }, + removeBackground: function (cells) { + utils.each(cells, function (cell) { + cell.style.backgroundColor = ""; + }) + } + + + }; + + function showError(e) { + } + })(); + +// plugins/table.cmds.js + /** + * Created with JetBrains PhpStorm. + * User: taoqili + * Date: 13-2-20 + * Time: 下午6:25 + * To change this template use File | Settings | File Templates. + */ + ; + (function () { + var UT = UE.UETable, + getTableItemsByRange = function (editor) { + return UT.getTableItemsByRange(editor); + }, + getUETableBySelected = function (editor) { + return UT.getUETableBySelected(editor) + }, + getDefaultValue = function (editor, table) { + return UT.getDefaultValue(editor, table); + }, + getUETable = function (tdOrTable) { + return UT.getUETable(tdOrTable); + }; + + + UE.commands['inserttable'] = { + queryCommandState: function () { + return getTableItemsByRange(this).table ? -1 : 0; + }, + execCommand: function (cmd, opt) { + function createTable(opt, tdWidth) { + var html = [], + rowsNum = opt.numRows, + colsNum = opt.numCols; + for (var r = 0; r < rowsNum; r++) { + html.push(''); + for (var c = 0; c < colsNum; c++) { + html.push('
    • ' + (browser.ie && browser.version < 11 ? domUtils.fillChar : '
      ') + '
      ' + html.join('') + '
      ' + } + + if (!opt) { + opt = utils.extend({}, { + numCols: this.options.defaultCols, + numRows: this.options.defaultRows, + tdvalign: this.options.tdvalign + }) + } + var me = this; + var range = this.selection.getRange(), + start = range.startContainer, + firstParentBlock = domUtils.findParent(start, function (node) { + return domUtils.isBlockElm(node); + }, true) || me.body; + + var defaultValue = getDefaultValue(me), + tableWidth = firstParentBlock.offsetWidth, + tdWidth = Math.floor(tableWidth / opt.numCols - defaultValue.tdPadding * 2 - defaultValue.tdBorder); + + //todo其他属性 + !opt.tdvalign && (opt.tdvalign = me.options.tdvalign); + me.execCommand("inserthtml", createTable(opt, tdWidth)); + } + }; + + UE.commands['insertparagraphbeforetable'] = { + queryCommandState: function () { + return getTableItemsByRange(this).cell ? 0 : -1; + }, + execCommand: function () { + var table = getTableItemsByRange(this).table; + if (table) { + var p = this.document.createElement("p"); + p.innerHTML = browser.ie ? ' ' : '
      '; + table.parentNode.insertBefore(p, table); + this.selection.getRange().setStart(p, 0).setCursor(); + } + } + }; + + UE.commands['deletetable'] = { + queryCommandState: function () { + var rng = this.selection.getRange(); + return domUtils.findParentByTagName(rng.startContainer, 'table', true) ? 0 : -1; + }, + execCommand: function (cmd, table) { + var rng = this.selection.getRange(); + table = table || domUtils.findParentByTagName(rng.startContainer, 'table', true); + if (table) { + var next = table.nextSibling; + if (!next) { + next = domUtils.createElement(this.document, 'p', { + 'innerHTML': browser.ie ? domUtils.fillChar : '
      ' + }); + table.parentNode.insertBefore(next, table); + } + domUtils.remove(table); + rng = this.selection.getRange(); + if (next.nodeType == 3) { + rng.setStartBefore(next) + } else { + rng.setStart(next, 0) + } + rng.setCursor(false, true) + this.fireEvent("tablehasdeleted") + + } + + } + }; + UE.commands['cellalign'] = { + queryCommandState: function () { + return getSelectedArr(this).length ? 0 : -1 + }, + execCommand: function (cmd, align) { + var selectedTds = getSelectedArr(this); + if (selectedTds.length) { + for (var i = 0, ci; ci = selectedTds[i++];) { + ci.setAttribute('align', align); + } + } + } + }; + UE.commands['cellvalign'] = { + queryCommandState: function () { + return getSelectedArr(this).length ? 0 : -1; + }, + execCommand: function (cmd, valign) { + var selectedTds = getSelectedArr(this); + if (selectedTds.length) { + for (var i = 0, ci; ci = selectedTds[i++];) { + ci.setAttribute('vAlign', valign); + } + } + } + }; + UE.commands['insertcaption'] = { + queryCommandState: function () { + var table = getTableItemsByRange(this).table; + if (table) { + return table.getElementsByTagName('caption').length == 0 ? 1 : -1; + } + return -1; + }, + execCommand: function () { + var table = getTableItemsByRange(this).table; + if (table) { + var caption = this.document.createElement('caption'); + caption.innerHTML = browser.ie ? domUtils.fillChar : '
      '; + table.insertBefore(caption, table.firstChild); + var range = this.selection.getRange(); + range.setStart(caption, 0).setCursor(); + } + + } + }; + UE.commands['deletecaption'] = { + queryCommandState: function () { + var rng = this.selection.getRange(), + table = domUtils.findParentByTagName(rng.startContainer, 'table'); + if (table) { + return table.getElementsByTagName('caption').length == 0 ? -1 : 1; + } + return -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + table = domUtils.findParentByTagName(rng.startContainer, 'table'); + if (table) { + domUtils.remove(table.getElementsByTagName('caption')[0]); + var range = this.selection.getRange(); + range.setStart(table.rows[0].cells[0], 0).setCursor(); + } + + } + }; + UE.commands['inserttitle'] = { + queryCommandState: function () { + var table = getTableItemsByRange(this).table; + if (table) { + var firstRow = table.rows[0]; + return firstRow.cells[firstRow.cells.length - 1].tagName.toLowerCase() != 'th' ? 0 : -1 + } + return -1; + }, + execCommand: function () { + var table = getTableItemsByRange(this).table; + if (table) { + getUETable(table).insertRow(0, 'th'); + } + var th = table.getElementsByTagName('th')[0]; + this.selection.getRange().setStart(th, 0).setCursor(false, true); + } + }; + UE.commands['deletetitle'] = { + queryCommandState: function () { + var table = getTableItemsByRange(this).table; + if (table) { + var firstRow = table.rows[0]; + return firstRow.cells[firstRow.cells.length - 1].tagName.toLowerCase() == 'th' ? 0 : -1 + } + return -1; + }, + execCommand: function () { + var table = getTableItemsByRange(this).table; + if (table) { + domUtils.remove(table.rows[0]) + } + var td = table.getElementsByTagName('td')[0]; + this.selection.getRange().setStart(td, 0).setCursor(false, true); + } + }; + UE.commands['inserttitlecol'] = { + queryCommandState: function () { + var table = getTableItemsByRange(this).table; + if (table) { + var lastRow = table.rows[table.rows.length - 1]; + return lastRow.getElementsByTagName('th').length ? -1 : 0; + } + return -1; + }, + execCommand: function (cmd) { + var table = getTableItemsByRange(this).table; + if (table) { + getUETable(table).insertCol(0, 'th'); + } + resetTdWidth(table, this); + var th = table.getElementsByTagName('th')[0]; + this.selection.getRange().setStart(th, 0).setCursor(false, true); + } + }; + UE.commands['deletetitlecol'] = { + queryCommandState: function () { + var table = getTableItemsByRange(this).table; + if (table) { + var lastRow = table.rows[table.rows.length - 1]; + return lastRow.getElementsByTagName('th').length ? 0 : -1; + } + return -1; + }, + execCommand: function () { + var table = getTableItemsByRange(this).table; + if (table) { + for (var i = 0; i < table.rows.length; i++) { + domUtils.remove(table.rows[i].children[0]) + } + } + resetTdWidth(table, this); + var td = table.getElementsByTagName('td')[0]; + this.selection.getRange().setStart(td, 0).setCursor(false, true); + } + }; + + UE.commands["mergeright"] = { + queryCommandState: function (cmd) { + var tableItems = getTableItemsByRange(this), + table = tableItems.table, + cell = tableItems.cell; + + if (!table || !cell) return -1; + var ut = getUETable(table); + if (ut.selectedTds.length) return -1; + + var cellInfo = ut.getCellInfo(cell), + rightColIndex = cellInfo.colIndex + cellInfo.colSpan; + if (rightColIndex >= ut.colsNum) return -1; // 如果处于最右边则不能向右合并 + + var rightCellInfo = ut.indexTable[cellInfo.rowIndex][rightColIndex], + rightCell = table.rows[rightCellInfo.rowIndex].cells[rightCellInfo.cellIndex]; + if (!rightCell || cell.tagName != rightCell.tagName) return -1; // TH和TD不能相互合并 + + // 当且仅当两个Cell的开始列号和结束列号一致时能进行合并 + return (rightCellInfo.rowIndex == cellInfo.rowIndex && rightCellInfo.rowSpan == cellInfo.rowSpan) ? 0 : -1; + }, + execCommand: function (cmd) { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell); + ut.mergeRight(cell); + rng.moveToBookmark(bk).select(); + } + }; + UE.commands["mergedown"] = { + queryCommandState: function (cmd) { + var tableItems = getTableItemsByRange(this), + table = tableItems.table, + cell = tableItems.cell; + + if (!table || !cell) return -1; + var ut = getUETable(table); + if (ut.selectedTds.length) return -1; + + var cellInfo = ut.getCellInfo(cell), + downRowIndex = cellInfo.rowIndex + cellInfo.rowSpan; + if (downRowIndex >= ut.rowsNum) return -1; // 如果处于最下边则不能向下合并 + + var downCellInfo = ut.indexTable[downRowIndex][cellInfo.colIndex], + downCell = table.rows[downCellInfo.rowIndex].cells[downCellInfo.cellIndex]; + if (!downCell || cell.tagName != downCell.tagName) return -1; // TH和TD不能相互合并 + + // 当且仅当两个Cell的开始列号和结束列号一致时能进行合并 + return (downCellInfo.colIndex == cellInfo.colIndex && downCellInfo.colSpan == cellInfo.colSpan) ? 0 : -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell); + ut.mergeDown(cell); + rng.moveToBookmark(bk).select(); + } + }; + UE.commands["mergecells"] = { + queryCommandState: function () { + return getUETableBySelected(this) ? 0 : -1; + }, + execCommand: function () { + var ut = getUETableBySelected(this); + if (ut && ut.selectedTds.length) { + var cell = ut.selectedTds[0]; + ut.mergeRange(); + var rng = this.selection.getRange(); + if (domUtils.isEmptyBlock(cell)) { + rng.setStart(cell, 0).collapse(true) + } else { + rng.selectNodeContents(cell) + } + rng.select(); + } + + + } + }; + UE.commands["insertrow"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + return cell && (cell.tagName == "TD" || (cell.tagName == 'TH' && tableItems.tr !== tableItems.table.rows[0])) && + getUETable(tableItems.table).rowsNum < this.options.maxRowNum ? 0 : -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell, + table = tableItems.table, + ut = getUETable(table), + cellInfo = ut.getCellInfo(cell); + //ut.insertRow(!ut.selectedTds.length ? cellInfo.rowIndex:ut.cellsRange.beginRowIndex,''); + if (!ut.selectedTds.length) { + ut.insertRow(cellInfo.rowIndex, cell); + } else { + var range = ut.cellsRange; + for (var i = 0, len = range.endRowIndex - range.beginRowIndex + 1; i < len; i++) { + ut.insertRow(range.beginRowIndex, cell); + } + } + rng.moveToBookmark(bk).select(); + if (table.getAttribute("interlaced") === "enabled") this.fireEvent("interlacetable", table); + } + }; + //后插入行 + UE.commands["insertrownext"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + return cell && (cell.tagName == "TD") && getUETable(tableItems.table).rowsNum < this.options.maxRowNum ? 0 : -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell, + table = tableItems.table, + ut = getUETable(table), + cellInfo = ut.getCellInfo(cell); + //ut.insertRow(!ut.selectedTds.length? cellInfo.rowIndex + cellInfo.rowSpan : ut.cellsRange.endRowIndex + 1,''); + if (!ut.selectedTds.length) { + ut.insertRow(cellInfo.rowIndex + cellInfo.rowSpan, cell); + } else { + var range = ut.cellsRange; + for (var i = 0, len = range.endRowIndex - range.beginRowIndex + 1; i < len; i++) { + ut.insertRow(range.endRowIndex + 1, cell); + } + } + rng.moveToBookmark(bk).select(); + if (table.getAttribute("interlaced") === "enabled") this.fireEvent("interlacetable", table); + } + }; + UE.commands["deleterow"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this); + return tableItems.cell ? 0 : -1; + }, + execCommand: function () { + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell), + cellsRange = ut.cellsRange, + cellInfo = ut.getCellInfo(cell), + preCell = ut.getVSideCell(cell), + nextCell = ut.getVSideCell(cell, true), + rng = this.selection.getRange(); + if (utils.isEmptyObject(cellsRange)) { + ut.deleteRow(cellInfo.rowIndex); + } else { + for (var i = cellsRange.beginRowIndex; i < cellsRange.endRowIndex + 1; i++) { + ut.deleteRow(cellsRange.beginRowIndex); + } + } + var table = ut.table; + if (!table.getElementsByTagName('td').length) { + var nextSibling = table.nextSibling; + domUtils.remove(table); + if (nextSibling) { + rng.setStart(nextSibling, 0).setCursor(false, true); + } + } else { + if (cellInfo.rowSpan == 1 || cellInfo.rowSpan == cellsRange.endRowIndex - cellsRange.beginRowIndex + 1) { + if (nextCell || preCell) rng.selectNodeContents(nextCell || preCell).setCursor(false, true); + } else { + var newCell = ut.getCell(cellInfo.rowIndex, ut.indexTable[cellInfo.rowIndex][cellInfo.colIndex].cellIndex); + if (newCell) rng.selectNodeContents(newCell).setCursor(false, true); + } + } + if (table.getAttribute("interlaced") === "enabled") this.fireEvent("interlacetable", table); + } + }; + UE.commands["insertcol"] = { + queryCommandState: function (cmd) { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + return cell && (cell.tagName == "TD" || (cell.tagName == 'TH' && cell !== tableItems.tr.cells[0])) && + getUETable(tableItems.table).colsNum < this.options.maxColNum ? 0 : -1; + }, + execCommand: function (cmd) { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + if (this.queryCommandState(cmd) == -1) return; + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell), + cellInfo = ut.getCellInfo(cell); + + //ut.insertCol(!ut.selectedTds.length ? cellInfo.colIndex:ut.cellsRange.beginColIndex); + if (!ut.selectedTds.length) { + ut.insertCol(cellInfo.colIndex, cell); + } else { + var range = ut.cellsRange; + for (var i = 0, len = range.endColIndex - range.beginColIndex + 1; i < len; i++) { + ut.insertCol(range.beginColIndex, cell); + } + } + rng.moveToBookmark(bk).select(true); + } + }; + UE.commands["insertcolnext"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + return cell && getUETable(tableItems.table).colsNum < this.options.maxColNum ? 0 : -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell), + cellInfo = ut.getCellInfo(cell); + //ut.insertCol(!ut.selectedTds.length ? cellInfo.colIndex + cellInfo.colSpan:ut.cellsRange.endColIndex +1); + if (!ut.selectedTds.length) { + ut.insertCol(cellInfo.colIndex + cellInfo.colSpan, cell); + } else { + var range = ut.cellsRange; + for (var i = 0, len = range.endColIndex - range.beginColIndex + 1; i < len; i++) { + ut.insertCol(range.endColIndex + 1, cell); + } + } + rng.moveToBookmark(bk).select(); + } + }; + + UE.commands["deletecol"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this); + return tableItems.cell ? 0 : -1; + }, + execCommand: function () { + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell), + range = ut.cellsRange, + cellInfo = ut.getCellInfo(cell), + preCell = ut.getHSideCell(cell), + nextCell = ut.getHSideCell(cell, true); + if (utils.isEmptyObject(range)) { + ut.deleteCol(cellInfo.colIndex); + } else { + for (var i = range.beginColIndex; i < range.endColIndex + 1; i++) { + ut.deleteCol(range.beginColIndex); + } + } + var table = ut.table, + rng = this.selection.getRange(); + + if (!table.getElementsByTagName('td').length) { + var nextSibling = table.nextSibling; + domUtils.remove(table); + if (nextSibling) { + rng.setStart(nextSibling, 0).setCursor(false, true); + } + } else { + if (domUtils.inDoc(cell, this.document)) { + rng.setStart(cell, 0).setCursor(false, true); + } else { + if (nextCell && domUtils.inDoc(nextCell, this.document)) { + rng.selectNodeContents(nextCell).setCursor(false, true); + } else { + if (preCell && domUtils.inDoc(preCell, this.document)) { + rng.selectNodeContents(preCell).setCursor(true, true); + } + } + } + } + } + }; + UE.commands["splittocells"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + if (!cell) return -1; + var ut = getUETable(tableItems.table); + if (ut.selectedTds.length > 0) return -1; + return cell && (cell.colSpan > 1 || cell.rowSpan > 1) ? 0 : -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell); + ut.splitToCells(cell); + rng.moveToBookmark(bk).select(); + } + }; + UE.commands["splittorows"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + if (!cell) return -1; + var ut = getUETable(tableItems.table); + if (ut.selectedTds.length > 0) return -1; + return cell && cell.rowSpan > 1 ? 0 : -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell); + ut.splitToRows(cell); + rng.moveToBookmark(bk).select(); + } + }; + UE.commands["splittocols"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + if (!cell) return -1; + var ut = getUETable(tableItems.table); + if (ut.selectedTds.length > 0) return -1; + return cell && cell.colSpan > 1 ? 0 : -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell); + ut.splitToCols(cell); + rng.moveToBookmark(bk).select(); + + } + }; + + UE.commands["adaptbytext"] = + UE.commands["adaptbywindow"] = { + queryCommandState: function () { + return getTableItemsByRange(this).table ? 0 : -1 + }, + execCommand: function (cmd) { + var tableItems = getTableItemsByRange(this), + table = tableItems.table; + if (table) { + if (cmd == 'adaptbywindow') { + resetTdWidth(table, this); + } else { + var cells = domUtils.getElementsByTagName(table, "td th"); + utils.each(cells, function (cell) { + cell.removeAttribute("width"); + }); + table.removeAttribute("width"); + } + } + } + }; + + //平均分配各列 + UE.commands['averagedistributecol'] = { + queryCommandState: function () { + var ut = getUETableBySelected(this); + if (!ut) return -1; + return ut.isFullRow() || ut.isFullCol() ? 0 : -1; + }, + execCommand: function (cmd) { + var me = this, + ut = getUETableBySelected(me); + + function getAverageWidth() { + var tb = ut.table, + averageWidth, sumWidth = 0, colsNum = 0, + tbAttr = getDefaultValue(me, tb); + + if (ut.isFullRow()) { + sumWidth = tb.offsetWidth; + colsNum = ut.colsNum; + } else { + var begin = ut.cellsRange.beginColIndex, + end = ut.cellsRange.endColIndex, + node; + for (var i = begin; i <= end;) { + node = ut.selectedTds[i]; + sumWidth += node.offsetWidth; + i += node.colSpan; + colsNum += 1; + } + } + averageWidth = Math.ceil(sumWidth / colsNum) - tbAttr.tdBorder * 2 - tbAttr.tdPadding * 2; + return averageWidth; + } + + function setAverageWidth(averageWidth) { + utils.each(domUtils.getElementsByTagName(ut.table, "th"), function (node) { + node.setAttribute("width", ""); + }); + var cells = ut.isFullRow() ? domUtils.getElementsByTagName(ut.table, "td") : ut.selectedTds; + + utils.each(cells, function (node) { + if (node.colSpan == 1) { + node.setAttribute("width", averageWidth); + } + }); + } + + if (ut && ut.selectedTds.length) { + setAverageWidth(getAverageWidth()); + } + } + }; + //平均分配各行 + UE.commands['averagedistributerow'] = { + queryCommandState: function () { + var ut = getUETableBySelected(this); + if (!ut) return -1; + if (ut.selectedTds && /th/ig.test(ut.selectedTds[0].tagName)) return -1; + return ut.isFullRow() || ut.isFullCol() ? 0 : -1; + }, + execCommand: function (cmd) { + var me = this, + ut = getUETableBySelected(me); + + function getAverageHeight() { + var averageHeight, rowNum, sumHeight = 0, + tb = ut.table, + tbAttr = getDefaultValue(me, tb), + tdpadding = parseInt(domUtils.getComputedStyle(tb.getElementsByTagName('td')[0], "padding-top")); + + if (ut.isFullCol()) { + var captionArr = domUtils.getElementsByTagName(tb, "caption"), + thArr = domUtils.getElementsByTagName(tb, "th"), + captionHeight, thHeight; + + if (captionArr.length > 0) { + captionHeight = captionArr[0].offsetHeight; + } + if (thArr.length > 0) { + thHeight = thArr[0].offsetHeight; + } + + sumHeight = tb.offsetHeight - (captionHeight || 0) - (thHeight || 0); + rowNum = thArr.length == 0 ? ut.rowsNum : (ut.rowsNum - 1); + } else { + var begin = ut.cellsRange.beginRowIndex, + end = ut.cellsRange.endRowIndex, + count = 0, + trs = domUtils.getElementsByTagName(tb, "tr"); + for (var i = begin; i <= end; i++) { + sumHeight += trs[i].offsetHeight; + count += 1; + } + rowNum = count; + } + //ie8下是混杂模式 + if (browser.ie && browser.version < 9) { + averageHeight = Math.ceil(sumHeight / rowNum); + } else { + averageHeight = Math.ceil(sumHeight / rowNum) - tbAttr.tdBorder * 2 - tdpadding * 2; + } + return averageHeight; + } + + function setAverageHeight(averageHeight) { + var cells = ut.isFullCol() ? domUtils.getElementsByTagName(ut.table, "td") : ut.selectedTds; + utils.each(cells, function (node) { + if (node.rowSpan == 1) { + node.setAttribute("height", averageHeight); + } + }); + } + + if (ut && ut.selectedTds.length) { + setAverageHeight(getAverageHeight()); + } + } + }; + + //单元格对齐方式 + UE.commands['cellalignment'] = { + queryCommandState: function () { + return getTableItemsByRange(this).table ? 0 : -1 + }, + execCommand: function (cmd, data) { + var me = this, + ut = getUETableBySelected(me); + + if (!ut) { + var start = me.selection.getStart(), + cell = start && domUtils.findParentByTagName(start, ["td", "th", "caption"], true); + if (!/caption/ig.test(cell.tagName)) { + domUtils.setAttributes(cell, data); + } else { + cell.style.textAlign = data.align; + cell.style.verticalAlign = data.vAlign; + } + me.selection.getRange().setCursor(true); + } else { + utils.each(ut.selectedTds, function (cell) { + domUtils.setAttributes(cell, data); + }); + } + }, + /** + * 查询当前点击的单元格的对齐状态, 如果当前已经选择了多个单元格, 则会返回所有单元格经过统一协调过后的状态 + * @see UE.UETable.getTableCellAlignState + */ + queryCommandValue: function (cmd) { + + var activeMenuCell = getTableItemsByRange(this).cell; + + if (!activeMenuCell) { + activeMenuCell = getSelectedArr(this)[0]; + } + + if (!activeMenuCell) { + + return null; + + } else { + + //获取同时选中的其他单元格 + var cells = UE.UETable.getUETable(activeMenuCell).selectedTds; + + !cells.length && (cells = activeMenuCell); + + return UE.UETable.getTableCellAlignState(cells); + + } + + } + }; + //表格对齐方式 + UE.commands['tablealignment'] = { + queryCommandState: function () { + if (browser.ie && browser.version < 8) { + return -1; + } + return getTableItemsByRange(this).table ? 0 : -1 + }, + execCommand: function (cmd, value) { + var me = this, + start = me.selection.getStart(), + table = start && domUtils.findParentByTagName(start, ["table"], true); + + if (table) { + table.setAttribute("align", value); + } + } + }; + + //表格属性 + UE.commands['edittable'] = { + queryCommandState: function () { + return getTableItemsByRange(this).table ? 0 : -1 + }, + execCommand: function (cmd, color) { + var rng = this.selection.getRange(), + table = domUtils.findParentByTagName(rng.startContainer, 'table'); + if (table) { + var arr = domUtils.getElementsByTagName(table, "td").concat( + domUtils.getElementsByTagName(table, "th"), + domUtils.getElementsByTagName(table, "caption") + ); + utils.each(arr, function (node) { + node.style.borderColor = color; + }); + } + } + }; + //单元格属性 + UE.commands['edittd'] = { + queryCommandState: function () { + return getTableItemsByRange(this).table ? 0 : -1 + }, + execCommand: function (cmd, bkColor) { + var me = this, + ut = getUETableBySelected(me); + + if (!ut) { + var start = me.selection.getStart(), + cell = start && domUtils.findParentByTagName(start, ["td", "th", "caption"], true); + if (cell) { + cell.style.backgroundColor = bkColor; + } + } else { + utils.each(ut.selectedTds, function (cell) { + cell.style.backgroundColor = bkColor; + }); + } + } + }; + + UE.commands["settablebackground"] = { + queryCommandState: function () { + return getSelectedArr(this).length > 1 ? 0 : -1; + }, + execCommand: function (cmd, value) { + var cells, ut; + cells = getSelectedArr(this); + ut = getUETable(cells[0]); + ut.setBackground(cells, value); + } + }; + + UE.commands["cleartablebackground"] = { + queryCommandState: function () { + var cells = getSelectedArr(this); + if (!cells.length) return -1; + for (var i = 0, cell; cell = cells[i++];) { + if (cell.style.backgroundColor !== "") return 0; + } + return -1; + }, + execCommand: function () { + var cells = getSelectedArr(this), + ut = getUETable(cells[0]); + ut.removeBackground(cells); + } + }; + + UE.commands["interlacetable"] = UE.commands["uninterlacetable"] = { + queryCommandState: function (cmd) { + var table = getTableItemsByRange(this).table; + if (!table) return -1; + var interlaced = table.getAttribute("interlaced"); + if (cmd == "interlacetable") { + //TODO 待定 + //是否需要待定,如果设置,则命令只能单次执行成功,但反射具备toggle效果;否则可以覆盖前次命令,但反射将不存在toggle效果 + return (interlaced === "enabled") ? -1 : 0; + } else { + return (!interlaced || interlaced === "disabled") ? -1 : 0; + } + }, + execCommand: function (cmd, classList) { + var table = getTableItemsByRange(this).table; + if (cmd == "interlacetable") { + table.setAttribute("interlaced", "enabled"); + this.fireEvent("interlacetable", table, classList); + } else { + table.setAttribute("interlaced", "disabled"); + this.fireEvent("uninterlacetable", table); + } + } + }; + UE.commands["setbordervisible"] = { + queryCommandState: function (cmd) { + var table = getTableItemsByRange(this).table; + if (!table) return -1; + return 0; + }, + execCommand: function () { + var table = getTableItemsByRange(this).table; + utils.each(domUtils.getElementsByTagName(table, 'td'), function (td) { + td.style.borderWidth = '1px'; + td.style.borderStyle = 'solid'; + }) + } + }; + + function resetTdWidth(table, editor) { + var tds = domUtils.getElementsByTagName(table, 'td th'); + utils.each(tds, function (td) { + td.removeAttribute("width"); + }); + table.setAttribute('width', getTableWidth(editor, true, getDefaultValue(editor, table))); + var tdsWidths = []; + setTimeout(function () { + utils.each(tds, function (td) { + (td.colSpan == 1) && tdsWidths.push(td.offsetWidth) + }) + utils.each(tds, function (td, i) { + (td.colSpan == 1) && td.setAttribute("width", tdsWidths[i] + ""); + }) + }, 0); + } + + function getTableWidth(editor, needIEHack, defaultValue) { + var body = editor.body; + return body.offsetWidth - (needIEHack ? parseInt(domUtils.getComputedStyle(body, 'margin-left'), 10) * 2 : 0) - defaultValue.tableBorder * 2 - (editor.options.offsetWidth || 0); + } + + function getSelectedArr(editor) { + var cell = getTableItemsByRange(editor).cell; + if (cell) { + var ut = getUETable(cell); + return ut.selectedTds.length ? ut.selectedTds : [cell]; + } else { + return []; + } + } + })(); + + +// plugins/table.action.js + /** + * Created with JetBrains PhpStorm. + * User: taoqili + * Date: 12-10-12 + * Time: 上午10:05 + * To change this template use File | Settings | File Templates. + */ + UE.plugins['table'] = function () { + var me = this, + tabTimer = null, + //拖动计时器 + tableDragTimer = null, + //双击计时器 + tableResizeTimer = null, + //单元格最小宽度 + cellMinWidth = 5, + isInResizeBuffer = false, + //单元格边框大小 + cellBorderWidth = 5, + //鼠标偏移距离 + offsetOfTableCell = 10, + //记录在有限时间内的点击状态, 共有3个取值, 0, 1, 2。 0代表未初始化, 1代表单击了1次,2代表2次 + singleClickState = 0, + userActionStatus = null, + //双击允许的时间范围 + dblclickTime = 360, + UT = UE.UETable, + getUETable = function (tdOrTable) { + return UT.getUETable(tdOrTable); + }, + getUETableBySelected = function (editor) { + return UT.getUETableBySelected(editor); + }, + getDefaultValue = function (editor, table) { + return UT.getDefaultValue(editor, table); + }, + removeSelectedClass = function (cells) { + return UT.removeSelectedClass(cells); + }; + + function showError(e) { +// throw e; + } + + me.ready(function () { + var me = this; + var orgGetText = me.selection.getText; + me.selection.getText = function () { + var table = getUETableBySelected(me); + if (table) { + var str = ''; + utils.each(table.selectedTds, function (td) { + str += td[browser.ie ? 'innerText' : 'textContent']; + }) + return str; + } else { + return orgGetText.call(me.selection) + } + + } + }) + + //处理拖动及框选相关方法 + var startTd = null, //鼠标按下时的锚点td + currentTd = null, //当前鼠标经过时的td + onDrag = "", //指示当前拖动状态,其值可为"","h","v" ,分别表示未拖动状态,横向拖动状态,纵向拖动状态,用于鼠标移动过程中的判断 + onBorder = false, //检测鼠标按下时是否处在单元格边缘位置 + dragButton = null, + dragOver = false, + dragLine = null, //模拟的拖动线 + dragTd = null; //发生拖动的目标td + + var mousedown = false, + //todo 判断混乱模式 + needIEHack = true; + + me.setOpt({ + 'maxColNum': 20, + 'maxRowNum': 100, + 'defaultCols': 5, + 'defaultRows': 5, + 'tdvalign': 'top', + 'cursorpath': me.options.UEDITOR_HOME_URL + "themes/default/images/cursor_", + 'tableDragable': false, + 'classList': ["ue-table-interlace-color-single", "ue-table-interlace-color-double"] + }); + me.getUETable = getUETable; + var commands = { + 'deletetable': 1, + 'inserttable': 1, + 'cellvalign': 1, + 'insertcaption': 1, + 'deletecaption': 1, + 'inserttitle': 1, + 'deletetitle': 1, + "mergeright": 1, + "mergedown": 1, + "mergecells": 1, + "insertrow": 1, + "insertrownext": 1, + "deleterow": 1, + "insertcol": 1, + "insertcolnext": 1, + "deletecol": 1, + "splittocells": 1, + "splittorows": 1, + "splittocols": 1, + "adaptbytext": 1, + "adaptbywindow": 1, + "adaptbycustomer": 1, + "insertparagraph": 1, + "insertparagraphbeforetable": 1, + "averagedistributecol": 1, + "averagedistributerow": 1 + }; + me.ready(function () { + utils.cssRule('table', + //选中的td上的样式 + '.selectTdClass{background-color:#edf5fa !important}' + + 'table.noBorderTable td,table.noBorderTable th,table.noBorderTable caption{border:1px dashed #ddd !important}' + + //插入的表格的默认样式 + 'table{margin-bottom:10px;border-collapse:collapse;display:table;}' + + 'td,th{padding: 5px 10px;border: 1px solid #DDD;}' + + 'caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}' + + 'th{border-top:1px solid #BBB;background-color:#F7F7F7;}' + + 'table tr.firstRow th{border-top-width:2px;}' + + '.ue-table-interlace-color-single{ background-color: #fcfcfc; } .ue-table-interlace-color-double{ background-color: #f7faff; }' + + 'td p{margin:0;padding:0;}', me.document); + + var tableCopyList, isFullCol, isFullRow; + //注册del/backspace事件 + me.addListener('keydown', function (cmd, evt) { + var me = this; + var keyCode = evt.keyCode || evt.which; + + if (keyCode == 8) { + + var ut = getUETableBySelected(me); + if (ut && ut.selectedTds.length) { + + if (ut.isFullCol()) { + me.execCommand('deletecol') + } else if (ut.isFullRow()) { + me.execCommand('deleterow') + } else { + me.fireEvent('delcells'); + } + domUtils.preventDefault(evt); + } + + var caption = domUtils.findParentByTagName(me.selection.getStart(), 'caption', true), + range = me.selection.getRange(); + if (range.collapsed && caption && isEmptyBlock(caption)) { + me.fireEvent('saveScene'); + var table = caption.parentNode; + domUtils.remove(caption); + if (table) { + range.setStart(table.rows[0].cells[0], 0).setCursor(false, true); + } + me.fireEvent('saveScene'); + } + + } + + if (keyCode == 46) { + + ut = getUETableBySelected(me); + if (ut) { + me.fireEvent('saveScene'); + for (var i = 0, ci; ci = ut.selectedTds[i++];) { + domUtils.fillNode(me.document, ci) + } + me.fireEvent('saveScene'); + domUtils.preventDefault(evt); + + } + + } + if (keyCode == 13) { + + var rng = me.selection.getRange(), + caption = domUtils.findParentByTagName(rng.startContainer, 'caption', true); + if (caption) { + var table = domUtils.findParentByTagName(caption, 'table'); + if (!rng.collapsed) { + + rng.deleteContents(); + me.fireEvent('saveScene'); + } else { + if (caption) { + rng.setStart(table.rows[0].cells[0], 0).setCursor(false, true); + } + } + domUtils.preventDefault(evt); + return; + } + if (rng.collapsed) { + var table = domUtils.findParentByTagName(rng.startContainer, 'table'); + if (table) { + var cell = table.rows[0].cells[0], + start = domUtils.findParentByTagName(me.selection.getStart(), ['td', 'th'], true), + preNode = table.previousSibling; + if (cell === start && (!preNode || preNode.nodeType == 1 && preNode.tagName == 'TABLE') && domUtils.isStartInblock(rng)) { + var first = domUtils.findParent(me.selection.getStart(), function (n) { + return domUtils.isBlockElm(n) + }, true); + if (first && (/t(h|d)/i.test(first.tagName) || first === start.firstChild)) { + me.execCommand('insertparagraphbeforetable'); + domUtils.preventDefault(evt); + } + + } + } + } + } + + if ((evt.ctrlKey || evt.metaKey) && evt.keyCode == '67') { + tableCopyList = null; + var ut = getUETableBySelected(me); + if (ut) { + var tds = ut.selectedTds; + isFullCol = ut.isFullCol(); + isFullRow = ut.isFullRow(); + tableCopyList = [ + [ut.cloneCell(tds[0], null, true)] + ]; + for (var i = 1, ci; ci = tds[i]; i++) { + if (ci.parentNode !== tds[i - 1].parentNode) { + tableCopyList.push([ut.cloneCell(ci, null, true)]); + } else { + tableCopyList[tableCopyList.length - 1].push(ut.cloneCell(ci, null, true)); + } + + } + } + } + }); + me.addListener("tablehasdeleted", function () { + toggleDraggableState(this, false, "", null); + if (dragButton) domUtils.remove(dragButton); + }); + + me.addListener('beforepaste', function (cmd, html) { + var me = this; + var rng = me.selection.getRange(); + if (domUtils.findParentByTagName(rng.startContainer, 'caption', true)) { + var div = me.document.createElement("div"); + div.innerHTML = html.html; + //trace:3729 + html.html = div[browser.ie9below ? 'innerText' : 'textContent']; + return; + } + var table = getUETableBySelected(me); + if (tableCopyList) { + me.fireEvent('saveScene'); + var rng = me.selection.getRange(); + var td = domUtils.findParentByTagName(rng.startContainer, ['td', 'th'], true), tmpNode, preNode; + if (td) { + var ut = getUETable(td); + if (isFullRow) { + var rowIndex = ut.getCellInfo(td).rowIndex; + if (td.tagName == 'TH') { + rowIndex++; + } + for (var i = 0, ci; ci = tableCopyList[i++];) { + var tr = ut.insertRow(rowIndex++, "td"); + for (var j = 0, cj; cj = ci[j]; j++) { + var cell = tr.cells[j]; + if (!cell) { + cell = tr.insertCell(j) + } + cell.innerHTML = cj.innerHTML; + cj.getAttribute('width') && cell.setAttribute('width', cj.getAttribute('width')); + cj.getAttribute('vAlign') && cell.setAttribute('vAlign', cj.getAttribute('vAlign')); + cj.getAttribute('align') && cell.setAttribute('align', cj.getAttribute('align')); + cj.style.cssText && (cell.style.cssText = cj.style.cssText) + } + for (var j = 0, cj; cj = tr.cells[j]; j++) { + if (!ci[j]) + break; + cj.innerHTML = ci[j].innerHTML; + ci[j].getAttribute('width') && cj.setAttribute('width', ci[j].getAttribute('width')); + ci[j].getAttribute('vAlign') && cj.setAttribute('vAlign', ci[j].getAttribute('vAlign')); + ci[j].getAttribute('align') && cj.setAttribute('align', ci[j].getAttribute('align')); + ci[j].style.cssText && (cj.style.cssText = ci[j].style.cssText) + } + } + } else { + if (isFullCol) { + cellInfo = ut.getCellInfo(td); + var maxColNum = 0; + for (var j = 0, ci = tableCopyList[0], cj; cj = ci[j++];) { + maxColNum += cj.colSpan || 1; + } + me.__hasEnterExecCommand = true; + for (i = 0; i < maxColNum; i++) { + me.execCommand('insertcol'); + } + me.__hasEnterExecCommand = false; + td = ut.table.rows[0].cells[cellInfo.cellIndex]; + if (td.tagName == 'TH') { + td = ut.table.rows[1].cells[cellInfo.cellIndex]; + } + } + for (var i = 0, ci; ci = tableCopyList[i++];) { + tmpNode = td; + for (var j = 0, cj; cj = ci[j++];) { + if (td) { + td.innerHTML = cj.innerHTML; + //todo 定制处理 + cj.getAttribute('width') && td.setAttribute('width', cj.getAttribute('width')); + cj.getAttribute('vAlign') && td.setAttribute('vAlign', cj.getAttribute('vAlign')); + cj.getAttribute('align') && td.setAttribute('align', cj.getAttribute('align')); + cj.style.cssText && (td.style.cssText = cj.style.cssText); + preNode = td; + td = td.nextSibling; + } else { + var cloneTd = cj.cloneNode(true); + domUtils.removeAttributes(cloneTd, ['class', 'rowSpan', 'colSpan']); + + preNode.parentNode.appendChild(cloneTd) + } + } + td = ut.getNextCell(tmpNode, true, true); + if (!tableCopyList[i]) + break; + if (!td) { + var cellInfo = ut.getCellInfo(tmpNode); + ut.table.insertRow(ut.table.rows.length); + ut.update(); + td = ut.getVSideCell(tmpNode, true); + } + } + } + ut.update(); + } else { + table = me.document.createElement('table'); + for (var i = 0, ci; ci = tableCopyList[i++];) { + var tr = table.insertRow(table.rows.length); + for (var j = 0, cj; cj = ci[j++];) { + cloneTd = UT.cloneCell(cj, null, true); + domUtils.removeAttributes(cloneTd, ['class']); + tr.appendChild(cloneTd) + } + if (j == 2 && cloneTd.rowSpan > 1) { + cloneTd.rowSpan = 1; + } + } + + var defaultValue = getDefaultValue(me), + width = me.body.offsetWidth - + (needIEHack ? parseInt(domUtils.getComputedStyle(me.body, 'margin-left'), 10) * 2 : 0) - defaultValue.tableBorder * 2 - (me.options.offsetWidth || 0); + me.execCommand('insertHTML', '' + table.innerHTML.replace(/>\s*<').replace(/\bth\b/gi, "td") + '
      ') + } + me.fireEvent('contentchange'); + me.fireEvent('saveScene'); + html.html = ''; + return true; + } else { + var div = me.document.createElement("div"), tables; + div.innerHTML = html.html; + tables = div.getElementsByTagName("table"); + if (domUtils.findParentByTagName(me.selection.getStart(), 'table')) { + utils.each(tables, function (t) { + domUtils.remove(t) + }); + if (domUtils.findParentByTagName(me.selection.getStart(), 'caption', true)) { + div.innerHTML = div[browser.ie ? 'innerText' : 'textContent']; + } + } else { + utils.each(tables, function (table) { + removeStyleSize(table, true); + domUtils.removeAttributes(table, ['style', 'border']); + utils.each(domUtils.getElementsByTagName(table, "td"), function (td) { + if (isEmptyBlock(td)) { + domUtils.fillNode(me.document, td); + } + removeStyleSize(td, true); +// domUtils.removeAttributes(td, ['style']) + }); + }); + } + html.html = div.innerHTML; + } + }); + + me.addListener('afterpaste', function () { + utils.each(domUtils.getElementsByTagName(me.body, "table"), function (table) { + if (table.offsetWidth > me.body.offsetWidth) { + var defaultValue = getDefaultValue(me, table); + table.style.width = me.body.offsetWidth - (needIEHack ? parseInt(domUtils.getComputedStyle(me.body, 'margin-left'), 10) * 2 : 0) - defaultValue.tableBorder * 2 - (me.options.offsetWidth || 0) + 'px' + } + }) + }); + me.addListener('blur', function () { + tableCopyList = null; + }); + var timer; + me.addListener('keydown', function () { + clearTimeout(timer); + timer = setTimeout(function () { + var rng = me.selection.getRange(), + cell = domUtils.findParentByTagName(rng.startContainer, ['th', 'td'], true); + if (cell) { + var table = cell.parentNode.parentNode.parentNode; + if (table.offsetWidth > table.getAttribute("width")) { + cell.style.wordBreak = "break-all"; + } + } + + }, 100); + }); + me.addListener("selectionchange", function () { + toggleDraggableState(me, false, "", null); + }); + + + //内容变化时触发索引更新 + //todo 可否考虑标记检测,如果不涉及表格的变化就不进行索引重建和更新 + me.addListener("contentchange", function () { + var me = this; + //尽可能排除一些不需要更新的状况 + hideDragLine(me); + if (getUETableBySelected(me)) return; + var rng = me.selection.getRange(); + var start = rng.startContainer; + start = domUtils.findParentByTagName(start, ['td', 'th'], true); + utils.each(domUtils.getElementsByTagName(me.document, 'table'), function (table) { + if (me.fireEvent("excludetable", table) === true) return; + table.ueTable = new UT(table); + //trace:3742 +// utils.each(domUtils.getElementsByTagName(me.document, 'td'), function (td) { +// +// if (domUtils.isEmptyBlock(td) && td !== start) { +// domUtils.fillNode(me.document, td); +// if (browser.ie && browser.version == 6) { +// td.innerHTML = ' ' +// } +// } +// }); +// utils.each(domUtils.getElementsByTagName(me.document, 'th'), function (th) { +// if (domUtils.isEmptyBlock(th) && th !== start) { +// domUtils.fillNode(me.document, th); +// if (browser.ie && browser.version == 6) { +// th.innerHTML = ' ' +// } +// } +// }); + table.onmouseover = function () { + me.fireEvent('tablemouseover', table); + }; + table.onmousemove = function () { + me.fireEvent('tablemousemove', table); + me.options.tableDragable && toggleDragButton(true, this, me); + utils.defer(function () { + me.fireEvent('contentchange', 50) + }, true) + }; + table.onmouseout = function () { + me.fireEvent('tablemouseout', table); + toggleDraggableState(me, false, "", null); + hideDragLine(me); + }; + table.onclick = function (evt) { + evt = me.window.event || evt; + var target = getParentTdOrTh(evt.target || evt.srcElement); + if (!target) return; + var ut = getUETable(target), + table = ut.table, + cellInfo = ut.getCellInfo(target), + cellsRange, + rng = me.selection.getRange(); +// if ("topLeft" == inPosition(table, mouseCoords(evt))) { +// cellsRange = ut.getCellsRange(ut.table.rows[0].cells[0], ut.getLastCell()); +// ut.setSelected(cellsRange); +// return; +// } +// if ("bottomRight" == inPosition(table, mouseCoords(evt))) { +// +// return; +// } + if (inTableSide(table, target, evt, true)) { + var endTdCol = ut.getCell(ut.indexTable[ut.rowsNum - 1][cellInfo.colIndex].rowIndex, ut.indexTable[ut.rowsNum - 1][cellInfo.colIndex].cellIndex); + if (evt.shiftKey && ut.selectedTds.length) { + if (ut.selectedTds[0] !== endTdCol) { + cellsRange = ut.getCellsRange(ut.selectedTds[0], endTdCol); + ut.setSelected(cellsRange); + } else { + rng && rng.selectNodeContents(endTdCol).select(); + } + } else { + if (target !== endTdCol) { + cellsRange = ut.getCellsRange(target, endTdCol); + ut.setSelected(cellsRange); + } else { + rng && rng.selectNodeContents(endTdCol).select(); + } + } + return; + } + if (inTableSide(table, target, evt)) { + var endTdRow = ut.getCell(ut.indexTable[cellInfo.rowIndex][ut.colsNum - 1].rowIndex, ut.indexTable[cellInfo.rowIndex][ut.colsNum - 1].cellIndex); + if (evt.shiftKey && ut.selectedTds.length) { + if (ut.selectedTds[0] !== endTdRow) { + cellsRange = ut.getCellsRange(ut.selectedTds[0], endTdRow); + ut.setSelected(cellsRange); + } else { + rng && rng.selectNodeContents(endTdRow).select(); + } + } else { + if (target !== endTdRow) { + cellsRange = ut.getCellsRange(target, endTdRow); + ut.setSelected(cellsRange); + } else { + rng && rng.selectNodeContents(endTdRow).select(); + } + } + } + }; + }); + + switchBorderColor(me, true); + }); + + domUtils.on(me.document, "mousemove", mouseMoveEvent); + + domUtils.on(me.document, "mouseout", function (evt) { + var target = evt.target || evt.srcElement; + if (target.tagName == "TABLE") { + toggleDraggableState(me, false, "", null); + } + }); + /** + * 表格隔行变色 + */ + me.addListener("interlacetable", function (type, table, classList) { + if (!table) return; + var me = this, + rows = table.rows, + len = rows.length, + getClass = function (list, index, repeat) { + return list[index] ? list[index] : repeat ? list[index % list.length] : ""; + }; + for (var i = 0; i < len; i++) { + rows[i].className = getClass(classList || me.options.classList, i, true); + } + }); + me.addListener("uninterlacetable", function (type, table) { + if (!table) return; + var me = this, + rows = table.rows, + classList = me.options.classList, + len = rows.length; + for (var i = 0; i < len; i++) { + domUtils.removeClasses(rows[i], classList); + } + }); + + me.addListener("mousedown", mouseDownEvent); + me.addListener("mouseup", mouseUpEvent); + //拖动的时候触发mouseup + domUtils.on(me.body, 'dragstart', function (evt) { + mouseUpEvent.call(me, 'dragstart', evt); + }); + me.addOutputRule(function (root) { + utils.each(root.getNodesByTagName('div'), function (n) { + if (n.getAttr('id') == 'ue_tableDragLine') { + n.parentNode.removeChild(n); + } + }); + }); + + var currentRowIndex = 0; + me.addListener("mousedown", function () { + currentRowIndex = 0; + }); + me.addListener('tabkeydown', function () { + var range = this.selection.getRange(), + common = range.getCommonAncestor(true, true), + table = domUtils.findParentByTagName(common, 'table'); + if (table) { + if (domUtils.findParentByTagName(common, 'caption', true)) { + var cell = domUtils.getElementsByTagName(table, 'th td'); + if (cell && cell.length) { + range.setStart(cell[0], 0).setCursor(false, true) + } + } else { + var cell = domUtils.findParentByTagName(common, ['td', 'th'], true), + ua = getUETable(cell); + currentRowIndex = cell.rowSpan > 1 ? currentRowIndex : ua.getCellInfo(cell).rowIndex; + var nextCell = ua.getTabNextCell(cell, currentRowIndex); + if (nextCell) { + if (isEmptyBlock(nextCell)) { + range.setStart(nextCell, 0).setCursor(false, true) + } else { + range.selectNodeContents(nextCell).select() + } + } else { + me.fireEvent('saveScene'); + me.__hasEnterExecCommand = true; + this.execCommand('insertrownext'); + me.__hasEnterExecCommand = false; + range = this.selection.getRange(); + range.setStart(table.rows[table.rows.length - 1].cells[0], 0).setCursor(); + me.fireEvent('saveScene'); + } + } + return true; + } + + }); + browser.ie && me.addListener('selectionchange', function () { + toggleDraggableState(this, false, "", null); + }); + me.addListener("keydown", function (type, evt) { + var me = this; + //处理在表格的最后一个输入tab产生新的表格 + var keyCode = evt.keyCode || evt.which; + if (keyCode == 8 || keyCode == 46) { + return; + } + var notCtrlKey = !evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey; + notCtrlKey && removeSelectedClass(domUtils.getElementsByTagName(me.body, "td")); + var ut = getUETableBySelected(me); + if (!ut) return; + notCtrlKey && ut.clearSelected(); + }); + + me.addListener("beforegetcontent", function () { + switchBorderColor(this, false); + browser.ie && utils.each(this.document.getElementsByTagName('caption'), function (ci) { + if (domUtils.isEmptyNode(ci)) { + ci.innerHTML = ' ' + } + }); + }); + me.addListener("aftergetcontent", function () { + switchBorderColor(this, true); + }); + me.addListener("getAllHtml", function () { + removeSelectedClass(me.document.getElementsByTagName("td")); + }); + //修正全屏状态下插入的表格宽度在非全屏状态下撑开编辑器的情况 + me.addListener("fullscreenchanged", function (type, fullscreen) { + if (!fullscreen) { + var ratio = this.body.offsetWidth / document.body.offsetWidth, + tables = domUtils.getElementsByTagName(this.body, "table"); + utils.each(tables, function (table) { + if (table.offsetWidth < me.body.offsetWidth) return false; + var tds = domUtils.getElementsByTagName(table, "td"), + backWidths = []; + utils.each(tds, function (td) { + backWidths.push(td.offsetWidth); + }); + for (var i = 0, td; td = tds[i]; i++) { + td.setAttribute("width", Math.floor(backWidths[i] * ratio)); + } + table.setAttribute("width", Math.floor(getTableWidth(me, needIEHack, getDefaultValue(me)))) + }); + } + }); + + //重写execCommand命令,用于处理框选时的处理 + var oldExecCommand = me.execCommand; + me.execCommand = function (cmd, datatat) { + + var me = this, + args = arguments; + + cmd = cmd.toLowerCase(); + var ut = getUETableBySelected(me), tds, + range = new dom.Range(me.document), + cmdFun = me.commands[cmd] || UE.commands[cmd], + result; + if (!cmdFun) return; + if (ut && !commands[cmd] && !cmdFun.notNeedUndo && !me.__hasEnterExecCommand) { + me.__hasEnterExecCommand = true; + me.fireEvent("beforeexeccommand", cmd); + tds = ut.selectedTds; + var lastState = -2, lastValue = -2, value, state; + for (var i = 0, td; td = tds[i]; i++) { + if (isEmptyBlock(td)) { + range.setStart(td, 0).setCursor(false, true) + } else { + range.selectNode(td).select(true); + } + state = me.queryCommandState(cmd); + value = me.queryCommandValue(cmd); + if (state != -1) { + if (lastState !== state || lastValue !== value) { + me._ignoreContentChange = true; + result = oldExecCommand.apply(me, arguments); + me._ignoreContentChange = false; + + } + lastState = me.queryCommandState(cmd); + lastValue = me.queryCommandValue(cmd); + if (domUtils.isEmptyBlock(td)) { + domUtils.fillNode(me.document, td) + } + } + } + range.setStart(tds[0], 0).shrinkBoundary(true).setCursor(false, true); + me.fireEvent('contentchange'); + me.fireEvent("afterexeccommand", cmd); + me.__hasEnterExecCommand = false; + me._selectionChange(); + } else { + result = oldExecCommand.apply(me, arguments); + } + return result; + }; + + + }); + + /** + * 删除obj的宽高style,改成属性宽高 + * @param obj + * @param replaceToProperty + */ + function removeStyleSize(obj, replaceToProperty) { + removeStyle(obj, "width", true); + removeStyle(obj, "height", true); + } + + function removeStyle(obj, styleName, replaceToProperty) { + if (obj.style[styleName]) { + replaceToProperty && obj.setAttribute(styleName, parseInt(obj.style[styleName], 10)); + obj.style[styleName] = ""; + } + } + + function getParentTdOrTh(ele) { + if (ele.tagName == "TD" || ele.tagName == "TH") return ele; + var td; + if (td = domUtils.findParentByTagName(ele, "td", true) || domUtils.findParentByTagName(ele, "th", true)) return td; + return null; + } + + function isEmptyBlock(node) { + var reg = new RegExp(domUtils.fillChar, 'g'); + if (node[browser.ie ? 'innerText' : 'textContent'].replace(/^\s*$/, '').replace(reg, '').length > 0) { + return 0; + } + for (var n in dtd.$isNotEmpty) { + if (node.getElementsByTagName(n).length) { + return 0; + } + } + return 1; + } + + + function mouseCoords(evt) { + if (evt.pageX || evt.pageY) { + return {x: evt.pageX, y: evt.pageY}; + } + return { + x: evt.clientX + me.document.body.scrollLeft - me.document.body.clientLeft, + y: evt.clientY + me.document.body.scrollTop - me.document.body.clientTop + }; + } + + function mouseMoveEvent(evt) { + + if (isEditorDisabled()) { + return; + } + + try { + + //普通状态下鼠标移动 + var target = getParentTdOrTh(evt.target || evt.srcElement), + pos; + + //区分用户的行为是拖动还是双击 + if (isInResizeBuffer) { + + me.body.style.webkitUserSelect = 'none'; + + if (Math.abs(userActionStatus.x - evt.clientX) > offsetOfTableCell || Math.abs(userActionStatus.y - evt.clientY) > offsetOfTableCell) { + clearTableDragTimer(); + isInResizeBuffer = false; + singleClickState = 0; + //drag action + tableBorderDrag(evt); + } + } + + //修改单元格大小时的鼠标移动 + if (onDrag && dragTd) { + singleClickState = 0; + me.body.style.webkitUserSelect = 'none'; + me.selection.getNative()[browser.ie9below ? 'empty' : 'removeAllRanges'](); + pos = mouseCoords(evt); + toggleDraggableState(me, true, onDrag, pos, target); + if (onDrag == "h") { + dragLine.style.left = getPermissionX(dragTd, evt) + "px"; + } else if (onDrag == "v") { + dragLine.style.top = getPermissionY(dragTd, evt) + "px"; + } + return; + } + //当鼠标处于table上时,修改移动过程中的光标状态 + if (target) { + //针对使用table作为容器的组件不触发拖拽效果 + if (me.fireEvent('excludetable', target) === true) + return; + pos = mouseCoords(evt); + var state = getRelation(target, pos), + table = domUtils.findParentByTagName(target, "table", true); + + if (inTableSide(table, target, evt, true)) { + if (me.fireEvent("excludetable", table) === true) return; + me.body.style.cursor = "url(" + me.options.cursorpath + "h.png),pointer"; + } else if (inTableSide(table, target, evt)) { + if (me.fireEvent("excludetable", table) === true) return; + me.body.style.cursor = "url(" + me.options.cursorpath + "v.png),pointer"; + } else { + me.body.style.cursor = "text"; + var curCell = target; + if (/\d/.test(state)) { + state = state.replace(/\d/, ''); + target = getUETable(target).getPreviewCell(target, state == "v"); + } + //位于第一行的顶部或者第一列的左边时不可拖动 + toggleDraggableState(me, target ? !!state : false, target ? state : '', pos, target); + + } + } else { + toggleDragButton(false, table, me); + } + + } catch (e) { + showError(e); + } + } + + var dragButtonTimer; + + function toggleDragButton(show, table, editor) { + if (!show) { + if (dragOver) return; + dragButtonTimer = setTimeout(function () { + !dragOver && dragButton && dragButton.parentNode && dragButton.parentNode.removeChild(dragButton); + }, 2000); + } else { + createDragButton(table, editor); + } + } + + function createDragButton(table, editor) { + var pos = domUtils.getXY(table), + doc = table.ownerDocument; + if (dragButton && dragButton.parentNode) return dragButton; + dragButton = doc.createElement("div"); + dragButton.contentEditable = false; + dragButton.innerHTML = ""; + dragButton.style.cssText = "width:15px;height:15px;background-image:url(" + editor.options.UEDITOR_HOME_URL + "dialogs/table/dragicon.png);position: absolute;cursor:move;top:" + (pos.y - 15) + "px;left:" + (pos.x) + "px;"; + domUtils.unSelectable(dragButton); + dragButton.onmouseover = function (evt) { + dragOver = true; + }; + dragButton.onmouseout = function (evt) { + dragOver = false; + }; + domUtils.on(dragButton, 'click', function (type, evt) { + doClick(evt, this); + }); + domUtils.on(dragButton, 'dblclick', function (type, evt) { + doDblClick(evt); + }); + domUtils.on(dragButton, 'dragstart', function (type, evt) { + domUtils.preventDefault(evt); + }); + var timer; + + function doClick(evt, button) { + // 部分浏览器下需要清理 + clearTimeout(timer); + timer = setTimeout(function () { + editor.fireEvent("tableClicked", table, button); + }, 300); + } + + function doDblClick(evt) { + clearTimeout(timer); + var ut = getUETable(table), + start = table.rows[0].cells[0], + end = ut.getLastCell(), + range = ut.getCellsRange(start, end); + editor.selection.getRange().setStart(start, 0).setCursor(false, true); + ut.setSelected(range); + } + + doc.body.appendChild(dragButton); + } + + +// function inPosition(table, pos) { +// var tablePos = domUtils.getXY(table), +// width = table.offsetWidth, +// height = table.offsetHeight; +// if (pos.x - tablePos.x < 5 && pos.y - tablePos.y < 5) { +// return "topLeft"; +// } else if (tablePos.x + width - pos.x < 5 && tablePos.y + height - pos.y < 5) { +// return "bottomRight"; +// } +// } + + function inTableSide(table, cell, evt, top) { + var pos = mouseCoords(evt), + state = getRelation(cell, pos); + + if (top) { + var caption = table.getElementsByTagName("caption")[0], + capHeight = caption ? caption.offsetHeight : 0; + return (state == "v1") && ((pos.y - domUtils.getXY(table).y - capHeight) < 8); + } else { + return (state == "h1") && ((pos.x - domUtils.getXY(table).x) < 8); + } + } + + /** + * 获取拖动时允许的X轴坐标 + * @param dragTd + * @param evt + */ + function getPermissionX(dragTd, evt) { + var ut = getUETable(dragTd); + if (ut) { + var preTd = ut.getSameEndPosCells(dragTd, "x")[0], + nextTd = ut.getSameStartPosXCells(dragTd)[0], + mouseX = mouseCoords(evt).x, + left = (preTd ? domUtils.getXY(preTd).x : domUtils.getXY(ut.table).x) + 20, + right = nextTd ? domUtils.getXY(nextTd).x + nextTd.offsetWidth - 20 : (me.body.offsetWidth + 5 || parseInt(domUtils.getComputedStyle(me.body, "width"), 10)); + + left += cellMinWidth; + right -= cellMinWidth; + + return mouseX < left ? left : mouseX > right ? right : mouseX; + } + } + + /** + * 获取拖动时允许的Y轴坐标 + */ + function getPermissionY(dragTd, evt) { + try { + var top = domUtils.getXY(dragTd).y, + mousePosY = mouseCoords(evt).y; + return mousePosY < top ? top : mousePosY; + } catch (e) { + showError(e); + } + } + + /** + * 移动状态切换 + */ + function toggleDraggableState(editor, draggable, dir, mousePos, cell) { + try { + editor.body.style.cursor = dir == "h" ? "col-resize" : dir == "v" ? "row-resize" : "text"; + if (browser.ie) { + if (dir && !mousedown && !getUETableBySelected(editor)) { + getDragLine(editor, editor.document); + showDragLineAt(dir, cell); + } else { + hideDragLine(editor) + } + } + onBorder = draggable; + } catch (e) { + showError(e); + } + } + + /** + * 获取与UETable相关的resize line + * @param uetable UETable对象 + */ + function getResizeLineByUETable() { + + var lineId = '_UETableResizeLine', + line = this.document.getElementById(lineId); + + if (!line) { + line = this.document.createElement("div"); + line.id = lineId; + line.contnetEditable = false; + line.setAttribute("unselectable", "on"); + + var styles = { + width: 2 * cellBorderWidth + 1 + 'px', + position: 'absolute', + 'z-index': 100000, + cursor: 'col-resize', + background: 'red', + display: 'none' + }; + + //切换状态 + line.onmouseout = function () { + this.style.display = 'none'; + }; + + utils.extend(line.style, styles); + + this.document.body.appendChild(line); + + } + + return line; + + } + + /** + * 更新resize-line + */ + function updateResizeLine(cell, uetable) { + + var line = getResizeLineByUETable.call(this), + table = uetable.table, + styles = { + top: domUtils.getXY(table).y + 'px', + left: domUtils.getXY(cell).x + cell.offsetWidth - cellBorderWidth + 'px', + display: 'block', + height: table.offsetHeight + 'px' + }; + + utils.extend(line.style, styles); + + } + + /** + * 显示resize-line + */ + function showResizeLine(cell) { + + var uetable = getUETable(cell); + + updateResizeLine.call(this, cell, uetable); + + } + + /** + * 获取鼠标与当前单元格的相对位置 + * @param ele + * @param mousePos + */ + function getRelation(ele, mousePos) { + var elePos = domUtils.getXY(ele); + + if (!elePos) { + return ''; + } + + if (elePos.x + ele.offsetWidth - mousePos.x < cellBorderWidth) { + return "h"; + } + if (mousePos.x - elePos.x < cellBorderWidth) { + return 'h1' + } + if (elePos.y + ele.offsetHeight - mousePos.y < cellBorderWidth) { + return "v"; + } + if (mousePos.y - elePos.y < cellBorderWidth) { + return 'v1' + } + return ''; + } + + function mouseDownEvent(type, evt) { + + if (isEditorDisabled()) { + return; + } + + userActionStatus = { + x: evt.clientX, + y: evt.clientY + }; + + //右键菜单单独处理 + if (evt.button == 2) { + var ut = getUETableBySelected(me), + flag = false; + + if (ut) { + var td = getTargetTd(me, evt); + utils.each(ut.selectedTds, function (ti) { + if (ti === td) { + flag = true; + } + }); + if (!flag) { + removeSelectedClass(domUtils.getElementsByTagName(me.body, "th td")); + ut.clearSelected() + } else { + td = ut.selectedTds[0]; + setTimeout(function () { + me.selection.getRange().setStart(td, 0).setCursor(false, true); + }, 0); + + } + } + } else { + tableClickHander(evt); + } + + } + + //清除表格的计时器 + function clearTableTimer() { + tabTimer && clearTimeout(tabTimer); + tabTimer = null; + } + + //双击收缩 + function tableDbclickHandler(evt) { + singleClickState = 0; + evt = evt || me.window.event; + var target = getParentTdOrTh(evt.target || evt.srcElement); + if (target) { + var h; + if (h = getRelation(target, mouseCoords(evt))) { + + hideDragLine(me); + + if (h == 'h1') { + h = 'h'; + if (inTableSide(domUtils.findParentByTagName(target, "table"), target, evt)) { + me.execCommand('adaptbywindow'); + } else { + target = getUETable(target).getPreviewCell(target); + if (target) { + var rng = me.selection.getRange(); + rng.selectNodeContents(target).setCursor(true, true) + } + } + } + if (h == 'h') { + var ut = getUETable(target), + table = ut.table, + cells = getCellsByMoveBorder(target, table, true); + + cells = extractArray(cells, 'left'); + + ut.width = ut.offsetWidth; + + var oldWidth = [], + newWidth = []; + + utils.each(cells, function (cell) { + + oldWidth.push(cell.offsetWidth); + + }); + + utils.each(cells, function (cell) { + + cell.removeAttribute("width"); + + }); + + window.setTimeout(function () { + + //是否允许改变 + var changeable = true; + + utils.each(cells, function (cell, index) { + + var width = cell.offsetWidth; + + if (width > oldWidth[index]) { + changeable = false; + return false; + } + + newWidth.push(width); + + }); + + var change = changeable ? newWidth : oldWidth; + + utils.each(cells, function (cell, index) { + + cell.width = change[index] - getTabcellSpace(); + + }); + + + }, 0); + +// minWidth -= cellMinWidth; +// +// table.removeAttribute("width"); +// utils.each(cells, function (cell) { +// cell.style.width = ""; +// cell.width -= minWidth; +// }); + + } + } + } + } + + function tableClickHander(evt) { + + removeSelectedClass(domUtils.getElementsByTagName(me.body, "td th")); + //trace:3113 + //选中单元格,点击table外部,不会清掉table上挂的ueTable,会引起getUETableBySelected方法返回值 + utils.each(me.document.getElementsByTagName('table'), function (t) { + t.ueTable = null; + }); + startTd = getTargetTd(me, evt); + if (!startTd) return; + var table = domUtils.findParentByTagName(startTd, "table", true); + ut = getUETable(table); + ut && ut.clearSelected(); + + //判断当前鼠标状态 + if (!onBorder) { + me.document.body.style.webkitUserSelect = ''; + mousedown = true; + me.addListener('mouseover', mouseOverEvent); + } else { + //边框上的动作处理 + borderActionHandler(evt); + } + + + } + + //处理表格边框上的动作, 这里做延时处理,避免两种动作互相影响 + function borderActionHandler(evt) { + + if (browser.ie) { + evt = reconstruct(evt); + } + + clearTableDragTimer(); + + //是否正在等待resize的缓冲中 + isInResizeBuffer = true; + + tableDragTimer = setTimeout(function () { + tableBorderDrag(evt); + }, dblclickTime); + + } + + function extractArray(originArr, key) { + + var result = [], + tmp = null; + + for (var i = 0, len = originArr.length; i < len; i++) { + + tmp = originArr[i][key]; + + if (tmp) { + result.push(tmp); + } + + } + + return result; + + } + + function clearTableDragTimer() { + tableDragTimer && clearTimeout(tableDragTimer); + tableDragTimer = null; + } + + function reconstruct(obj) { + + var attrs = ['pageX', 'pageY', 'clientX', 'clientY', 'srcElement', 'target'], + newObj = {}; + + if (obj) { + + for (var i = 0, key, val; key = attrs[i]; i++) { + val = obj[key]; + val && (newObj[key] = val); + } + + } + + return newObj; + + } + + //边框拖动 + function tableBorderDrag(evt) { + + isInResizeBuffer = false; + + startTd = evt.target || evt.srcElement; + if (!startTd) return; + var state = getRelation(startTd, mouseCoords(evt)); + if (/\d/.test(state)) { + state = state.replace(/\d/, ''); + startTd = getUETable(startTd).getPreviewCell(startTd, state == 'v'); + } + hideDragLine(me); + getDragLine(me, me.document); + me.fireEvent('saveScene'); + showDragLineAt(state, startTd); + mousedown = true; + //拖动开始 + onDrag = state; + dragTd = startTd; + } + + function mouseUpEvent(type, evt) { + + if (isEditorDisabled()) { + return; + } + + clearTableDragTimer(); + + isInResizeBuffer = false; + + if (onBorder) { + singleClickState = ++singleClickState % 3; + + userActionStatus = { + x: evt.clientX, + y: evt.clientY + }; + + tableResizeTimer = setTimeout(function () { + singleClickState > 0 && singleClickState--; + }, dblclickTime); + + if (singleClickState === 2) { + + singleClickState = 0; + tableDbclickHandler(evt); + return; + + } + + } + + if (evt.button == 2) return; + var me = this; + //清除表格上原生跨选问题 + var range = me.selection.getRange(), + start = domUtils.findParentByTagName(range.startContainer, 'table', true), + end = domUtils.findParentByTagName(range.endContainer, 'table', true); + + if (start || end) { + if (start === end) { + start = domUtils.findParentByTagName(range.startContainer, ['td', 'th', 'caption'], true); + end = domUtils.findParentByTagName(range.endContainer, ['td', 'th', 'caption'], true); + if (start !== end) { + me.selection.clearRange() + } + } else { + me.selection.clearRange() + } + } + mousedown = false; + me.document.body.style.webkitUserSelect = ''; + //拖拽状态下的mouseUP + if (onDrag && dragTd) { + + me.selection.getNative()[browser.ie9below ? 'empty' : 'removeAllRanges'](); + + singleClickState = 0; + dragLine = me.document.getElementById('ue_tableDragLine'); + + // trace 3973 + if (dragLine) { + var dragTdPos = domUtils.getXY(dragTd), + dragLinePos = domUtils.getXY(dragLine); + + switch (onDrag) { + case "h": + changeColWidth(dragTd, dragLinePos.x - dragTdPos.x); + break; + case "v": + changeRowHeight(dragTd, dragLinePos.y - dragTdPos.y - dragTd.offsetHeight); + break; + default: + } + onDrag = ""; + dragTd = null; + + hideDragLine(me); + me.fireEvent('saveScene'); + return; + } + } + //正常状态下的mouseup + if (!startTd) { + var target = domUtils.findParentByTagName(evt.target || evt.srcElement, "td", true); + if (!target) target = domUtils.findParentByTagName(evt.target || evt.srcElement, "th", true); + if (target && (target.tagName == "TD" || target.tagName == "TH")) { + if (me.fireEvent("excludetable", target) === true) return; + range = new dom.Range(me.document); + range.setStart(target, 0).setCursor(false, true); + } + } else { + var ut = getUETable(startTd), + cell = ut ? ut.selectedTds[0] : null; + if (cell) { + range = new dom.Range(me.document); + if (domUtils.isEmptyBlock(cell)) { + range.setStart(cell, 0).setCursor(false, true); + } else { + range.selectNodeContents(cell).shrinkBoundary().setCursor(false, true); + } + } else { + range = me.selection.getRange().shrinkBoundary(); + if (!range.collapsed) { + var start = domUtils.findParentByTagName(range.startContainer, ['td', 'th'], true), + end = domUtils.findParentByTagName(range.endContainer, ['td', 'th'], true); + //在table里边的不能清除 + if (start && !end || !start && end || start && end && start !== end) { + range.setCursor(false, true); + } + } + } + startTd = null; + me.removeListener('mouseover', mouseOverEvent); + } + me._selectionChange(250, evt); + } + + function mouseOverEvent(type, evt) { + + if (isEditorDisabled()) { + return; + } + + var me = this, + tar = evt.target || evt.srcElement; + currentTd = domUtils.findParentByTagName(tar, "td", true) || domUtils.findParentByTagName(tar, "th", true); + //需要判断两个TD是否位于同一个表格内 + if (startTd && currentTd && + ((startTd.tagName == "TD" && currentTd.tagName == "TD") || (startTd.tagName == "TH" && currentTd.tagName == "TH")) && + domUtils.findParentByTagName(startTd, 'table') == domUtils.findParentByTagName(currentTd, 'table')) { + var ut = getUETable(currentTd); + if (startTd != currentTd) { + me.document.body.style.webkitUserSelect = 'none'; + me.selection.getNative()[browser.ie9below ? 'empty' : 'removeAllRanges'](); + var range = ut.getCellsRange(startTd, currentTd); + ut.setSelected(range); + } else { + me.document.body.style.webkitUserSelect = ''; + ut.clearSelected(); + } + + } + evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); + } + + function setCellHeight(cell, height, backHeight) { + var lineHight = parseInt(domUtils.getComputedStyle(cell, "line-height"), 10), + tmpHeight = backHeight + height; + height = tmpHeight < lineHight ? lineHight : tmpHeight; + if (cell.style.height) cell.style.height = ""; + cell.rowSpan == 1 ? cell.setAttribute("height", height) : (cell.removeAttribute && cell.removeAttribute("height")); + } + + function getWidth(cell) { + if (!cell) return 0; + return parseInt(domUtils.getComputedStyle(cell, "width"), 10); + } + + function changeColWidth(cell, changeValue) { + + var ut = getUETable(cell); + if (ut) { + + //根据当前移动的边框获取相关的单元格 + var table = ut.table, + cells = getCellsByMoveBorder(cell, table); + + table.style.width = ""; + table.removeAttribute("width"); + + //修正改变量 + changeValue = correctChangeValue(changeValue, cell, cells); + + if (cell.nextSibling) { + + var i = 0; + + utils.each(cells, function (cellGroup) { + + cellGroup.left.width = (+cellGroup.left.width) + changeValue; + cellGroup.right && (cellGroup.right.width = (+cellGroup.right.width) - changeValue); + + }); + + } else { + + utils.each(cells, function (cellGroup) { + cellGroup.left.width -= -changeValue; + }); + + } + } + + } + + function isEditorDisabled() { + return me.body.contentEditable === "false"; + } + + function changeRowHeight(td, changeValue) { + if (Math.abs(changeValue) < 10) return; + var ut = getUETable(td); + if (ut) { + var cells = ut.getSameEndPosCells(td, "y"), + //备份需要连带变化的td的原始高度,否则后期无法获取正确的值 + backHeight = cells[0] ? cells[0].offsetHeight : 0; + for (var i = 0, cell; cell = cells[i++];) { + setCellHeight(cell, changeValue, backHeight); + } + } + + } + + /** + * 获取调整单元格大小的相关单元格 + * @isContainMergeCell 返回的结果中是否包含发生合并后的单元格 + */ + function getCellsByMoveBorder(cell, table, isContainMergeCell) { + + if (!table) { + table = domUtils.findParentByTagName(cell, 'table'); + } + + if (!table) { + return null; + } + + //获取到该单元格所在行的序列号 + var index = domUtils.getNodeIndex(cell), + temp = cell, + rows = table.rows, + colIndex = 0; + + while (temp) { + //获取到当前单元格在未发生单元格合并时的序列 + if (temp.nodeType === 1) { + colIndex += (temp.colSpan || 1); + } + temp = temp.previousSibling; + } + + temp = null; + + //记录想关的单元格 + var borderCells = []; + + utils.each(rows, function (tabRow) { + + var cells = tabRow.cells, + currIndex = 0; + + utils.each(cells, function (tabCell) { + + currIndex += (tabCell.colSpan || 1); + + if (currIndex === colIndex) { + + borderCells.push({ + left: tabCell, + right: tabCell.nextSibling || null + }); + + return false; + + } else if (currIndex > colIndex) { + + if (isContainMergeCell) { + borderCells.push({ + left: tabCell + }); + } + + return false; + } + + + }); + + }); + + return borderCells; + + } + + + /** + * 通过给定的单元格集合获取最小的单元格width + */ + function getMinWidthByTableCells(cells) { + + var minWidth = Number.MAX_VALUE; + + for (var i = 0, curCell; curCell = cells[i]; i++) { + + minWidth = Math.min(minWidth, curCell.width || getTableCellWidth(curCell)); + + } + + return minWidth; + + } + + function correctChangeValue(changeValue, relatedCell, cells) { + + //为单元格的paading预留空间 + changeValue -= getTabcellSpace(); + + if (changeValue < 0) { + return 0; + } + + changeValue -= getTableCellWidth(relatedCell); + + //确定方向 + var direction = changeValue < 0 ? 'left' : 'right'; + + changeValue = Math.abs(changeValue); + + //只关心非最后一个单元格就可以 + utils.each(cells, function (cellGroup) { + + var curCell = cellGroup[direction]; + + //为单元格保留最小空间 + if (curCell) { + changeValue = Math.min(changeValue, getTableCellWidth(curCell) - cellMinWidth); + } + + + }); + + + //修正越界 + changeValue = changeValue < 0 ? 0 : changeValue; + + return direction === 'left' ? -changeValue : changeValue; + + } + + function getTableCellWidth(cell) { + + var width = 0, + //偏移纠正量 + offset = 0, + width = cell.offsetWidth - getTabcellSpace(); + + //最后一个节点纠正一下 + if (!cell.nextSibling) { + + width -= getTableCellOffset(cell); + + } + + width = width < 0 ? 0 : width; + + try { + cell.width = width; + } catch (e) { + } + + return width; + + } + + /** + * 获取单元格所在表格的最末单元格的偏移量 + */ + function getTableCellOffset(cell) { + + tab = domUtils.findParentByTagName(cell, "table", false); + + if (tab.offsetVal === undefined) { + + var prev = cell.previousSibling; + + if (prev) { + + //最后一个单元格和前一个单元格的width diff结果 如果恰好为一个border width, 则条件成立 + tab.offsetVal = cell.offsetWidth - prev.offsetWidth === UT.borderWidth ? UT.borderWidth : 0; + + } else { + tab.offsetVal = 0; + } + + } + + return tab.offsetVal; + + } + + function getTabcellSpace() { + + if (UT.tabcellSpace === undefined) { + + var cell = null, + tab = me.document.createElement("table"), + tbody = me.document.createElement("tbody"), + trow = me.document.createElement("tr"), + tabcell = me.document.createElement("td"), + mirror = null; + + tabcell.style.cssText = 'border: 0;'; + tabcell.width = 1; + + trow.appendChild(tabcell); + trow.appendChild(mirror = tabcell.cloneNode(false)); + + tbody.appendChild(trow); + + tab.appendChild(tbody); + + tab.style.cssText = "visibility: hidden;"; + + me.body.appendChild(tab); + + UT.paddingSpace = tabcell.offsetWidth - 1; + + var tmpTabWidth = tab.offsetWidth; + + tabcell.style.cssText = ''; + mirror.style.cssText = ''; + + UT.borderWidth = (tab.offsetWidth - tmpTabWidth) / 3; + + UT.tabcellSpace = UT.paddingSpace + UT.borderWidth; + + me.body.removeChild(tab); + + } + + getTabcellSpace = function () { + return UT.tabcellSpace; + }; + + return UT.tabcellSpace; + + } + + function getDragLine(editor, doc) { + if (mousedown) return; + dragLine = editor.document.createElement("div"); + domUtils.setAttributes(dragLine, { + id: "ue_tableDragLine", + unselectable: 'on', + contenteditable: false, + 'onresizestart': 'return false', + 'ondragstart': 'return false', + 'onselectstart': 'return false', + style: "background-color:blue;position:absolute;padding:0;margin:0;background-image:none;border:0px none;opacity:0;filter:alpha(opacity=0)" + }); + editor.body.appendChild(dragLine); + } + + function hideDragLine(editor) { + if (mousedown) return; + var line; + while (line = editor.document.getElementById('ue_tableDragLine')) { + domUtils.remove(line) + } + } + + /** + * 依据state(v|h)在cell位置显示横线 + * @param state + * @param cell + */ + function showDragLineAt(state, cell) { + if (!cell) return; + var table = domUtils.findParentByTagName(cell, "table"), + caption = table.getElementsByTagName('caption'), + width = table.offsetWidth, + height = table.offsetHeight - (caption.length > 0 ? caption[0].offsetHeight : 0), + tablePos = domUtils.getXY(table), + cellPos = domUtils.getXY(cell), css; + switch (state) { + case "h": + css = 'height:' + height + 'px;top:' + (tablePos.y + (caption.length > 0 ? caption[0].offsetHeight : 0)) + 'px;left:' + (cellPos.x + cell.offsetWidth); + dragLine.style.cssText = css + 'px;position: absolute;display:block;background-color:blue;width:1px;border:0; color:blue;opacity:.3;filter:alpha(opacity=30)'; + break; + case "v": + css = 'width:' + width + 'px;left:' + tablePos.x + 'px;top:' + (cellPos.y + cell.offsetHeight); + //必须加上border:0和color:blue,否则低版ie不支持背景色显示 + dragLine.style.cssText = css + 'px;overflow:hidden;position: absolute;display:block;background-color:blue;height:1px;border:0;color:blue;opacity:.2;filter:alpha(opacity=20)'; + break; + default: + } + } + + /** + * 当表格边框颜色为白色时设置为虚线,true为添加虚线 + * @param editor + * @param flag + */ + function switchBorderColor(editor, flag) { + var tableArr = domUtils.getElementsByTagName(editor.body, "table"), color; + for (var i = 0, node; node = tableArr[i++];) { + var td = domUtils.getElementsByTagName(node, "td"); + if (td[0]) { + if (flag) { + color = (td[0].style.borderColor).replace(/\s/g, ""); + if (/(#ffffff)|(rgb\(255,255,255\))/ig.test(color)) + domUtils.addClass(node, "noBorderTable") + } else { + domUtils.removeClasses(node, "noBorderTable") + } + } + + } + } + + function getTableWidth(editor, needIEHack, defaultValue) { + var body = editor.body; + return body.offsetWidth - (needIEHack ? parseInt(domUtils.getComputedStyle(body, 'margin-left'), 10) * 2 : 0) - defaultValue.tableBorder * 2 - (editor.options.offsetWidth || 0); + } + + /** + * 获取当前拖动的单元格 + */ + function getTargetTd(editor, evt) { + + var target = domUtils.findParentByTagName(evt.target || evt.srcElement, ["td", "th"], true), + dir = null; + + if (!target) { + return null; + } + + dir = getRelation(target, mouseCoords(evt)); + + //如果有前一个节点, 需要做一个修正, 否则可能会得到一个错误的td + + if (!target) { + return null; + } + + if (dir === 'h1' && target.previousSibling) { + + var position = domUtils.getXY(target), + cellWidth = target.offsetWidth; + + if (Math.abs(position.x + cellWidth - evt.clientX) > cellWidth / 3) { + target = target.previousSibling; + } + + } else if (dir === 'v1' && target.parentNode.previousSibling) { + + var position = domUtils.getXY(target), + cellHeight = target.offsetHeight; + + if (Math.abs(position.y + cellHeight - evt.clientY) > cellHeight / 3) { + target = target.parentNode.previousSibling.firstChild; + } + + } + + + //排除了非td内部以及用于代码高亮部分的td + return target && !(editor.fireEvent("excludetable", target) === true) ? target : null; + } + + }; + + +// plugins/table.sort.js + /** + * Created with JetBrains PhpStorm. + * User: Jinqn + * Date: 13-10-12 + * Time: 上午10:20 + * To change this template use File | Settings | File Templates. + */ + + UE.UETable.prototype.sortTable = function (sortByCellIndex, compareFn) { + var table = this.table, + rows = table.rows, + trArray = [], + flag = rows[0].cells[0].tagName === "TH", + lastRowIndex = 0; + if (this.selectedTds.length) { + var range = this.cellsRange, + len = range.endRowIndex + 1; + for (var i = range.beginRowIndex; i < len; i++) { + trArray[i] = rows[i]; + } + trArray.splice(0, range.beginRowIndex); + lastRowIndex = (range.endRowIndex + 1) === this.rowsNum ? 0 : range.endRowIndex + 1; + } else { + for (var i = 0, len = rows.length; i < len; i++) { + trArray[i] = rows[i]; + } + } + + var Fn = { + 'reversecurrent': function (td1, td2) { + return 1; + }, + 'orderbyasc': function (td1, td2) { + var value1 = td1.innerText || td1.textContent, + value2 = td2.innerText || td2.textContent; + return value1.localeCompare(value2); + }, + 'reversebyasc': function (td1, td2) { + var value1 = td1.innerHTML, + value2 = td2.innerHTML; + return value2.localeCompare(value1); + }, + 'orderbynum': function (td1, td2) { + var value1 = td1[browser.ie ? 'innerText' : 'textContent'].match(/\d+/), + value2 = td2[browser.ie ? 'innerText' : 'textContent'].match(/\d+/); + if (value1) value1 = +value1[0]; + if (value2) value2 = +value2[0]; + return (value1 || 0) - (value2 || 0); + }, + 'reversebynum': function (td1, td2) { + var value1 = td1[browser.ie ? 'innerText' : 'textContent'].match(/\d+/), + value2 = td2[browser.ie ? 'innerText' : 'textContent'].match(/\d+/); + if (value1) value1 = +value1[0]; + if (value2) value2 = +value2[0]; + return (value2 || 0) - (value1 || 0); + } + }; + + //对表格设置排序的标记data-sort-type + table.setAttribute('data-sort-type', compareFn && typeof compareFn === "string" && Fn[compareFn] ? compareFn : ''); + + //th不参与排序 + flag && trArray.splice(0, 1); + trArray = utils.sort(trArray, function (tr1, tr2) { + var result; + if (compareFn && typeof compareFn === "function") { + result = compareFn.call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]); + } else if (compareFn && typeof compareFn === "number") { + result = 1; + } else if (compareFn && typeof compareFn === "string" && Fn[compareFn]) { + result = Fn[compareFn].call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]); + } else { + result = Fn['orderbyasc'].call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]); + } + return result; + }); + var fragment = table.ownerDocument.createDocumentFragment(); + for (var j = 0, len = trArray.length; j < len; j++) { + fragment.appendChild(trArray[j]); + } + var tbody = table.getElementsByTagName("tbody")[0]; + if (!lastRowIndex) { + tbody.appendChild(fragment); + } else { + tbody.insertBefore(fragment, rows[lastRowIndex - range.endRowIndex + range.beginRowIndex - 1]) + } + }; + + UE.plugins['tablesort'] = function () { + var me = this, + UT = UE.UETable, + getUETable = function (tdOrTable) { + return UT.getUETable(tdOrTable); + }, + getTableItemsByRange = function (editor) { + return UT.getTableItemsByRange(editor); + }; + + + me.ready(function () { + //添加表格可排序的样式 + utils.cssRule('tablesort', + 'table.sortEnabled tr.firstRow th,table.sortEnabled tr.firstRow td{padding-right:20px;background-repeat: no-repeat;background-position: center right;' + + ' background-image:url(' + me.options.themePath + me.options.theme + '/images/sortable.png);}', + me.document); + + //做单元格合并操作时,清除可排序标识 + me.addListener("afterexeccommand", function (type, cmd) { + if (cmd == 'mergeright' || cmd == 'mergedown' || cmd == 'mergecells') { + this.execCommand('disablesort'); + } + }); + }); + + + //表格排序 + UE.commands['sorttable'] = { + queryCommandState: function () { + var me = this, + tableItems = getTableItemsByRange(me); + if (!tableItems.cell) return -1; + var table = tableItems.table, + cells = table.getElementsByTagName("td"); + for (var i = 0, cell; cell = cells[i++];) { + if (cell.rowSpan != 1 || cell.colSpan != 1) return -1; + } + return 0; + }, + execCommand: function (cmd, fn) { + var me = this, + range = me.selection.getRange(), + bk = range.createBookmark(true), + tableItems = getTableItemsByRange(me), + cell = tableItems.cell, + ut = getUETable(tableItems.table), + cellInfo = ut.getCellInfo(cell); + ut.sortTable(cellInfo.cellIndex, fn); + range.moveToBookmark(bk); + try { + range.select(); + } catch (e) { + } + } + }; + + //设置表格可排序,清除表格可排序 + UE.commands["enablesort"] = UE.commands["disablesort"] = { + queryCommandState: function (cmd) { + var table = getTableItemsByRange(this).table; + if (table && cmd == 'enablesort') { + var cells = domUtils.getElementsByTagName(table, 'th td'); + for (var i = 0; i < cells.length; i++) { + if (cells[i].getAttribute('colspan') > 1 || cells[i].getAttribute('rowspan') > 1) return -1; + } + } + + return !table ? -1 : cmd == 'enablesort' ^ table.getAttribute('data-sort') != 'sortEnabled' ? -1 : 0; + }, + execCommand: function (cmd) { + var table = getTableItemsByRange(this).table; + table.setAttribute("data-sort", cmd == "enablesort" ? "sortEnabled" : "sortDisabled"); + cmd == "enablesort" ? domUtils.addClass(table, "sortEnabled") : domUtils.removeClasses(table, "sortEnabled"); + } + }; + }; + + +// plugins/contextmenu.js +///import core +///commands 右键菜单 +///commandsName ContextMenu +///commandsTitle 右键菜单 + /** + * 右键菜单 + * @function + * @name baidu.editor.plugins.contextmenu + * @author zhanyi + */ + + UE.plugins['contextmenu'] = function () { + var me = this; + me.setOpt('enableContextMenu', true); + if (me.getOpt('enableContextMenu') === false) { + return; + } + var lang = me.getLang("contextMenu"), + menu, + items = me.options.contextMenu || [ + {label: lang['selectall'], cmdName: 'selectall'}, + { + label: lang.cleardoc, + cmdName: 'cleardoc', + exec: function () { + if (confirm(lang.confirmclear)) { + this.execCommand('cleardoc'); + } + } + }, + '-', + { + label: lang.unlink, + cmdName: 'unlink' + }, + '-', + { + group: lang.paragraph, + icon: 'justifyjustify', + subMenu: [ + { + label: lang.justifyleft, + cmdName: 'justify', + value: 'left' + }, + { + label: lang.justifyright, + cmdName: 'justify', + value: 'right' + }, + { + label: lang.justifycenter, + cmdName: 'justify', + value: 'center' + }, + { + label: lang.justifyjustify, + cmdName: 'justify', + value: 'justify' + } + ] + }, + '-', + { + group: lang.table, + icon: 'table', + subMenu: [ + { + label: lang.inserttable, + cmdName: 'inserttable' + }, + { + label: lang.deletetable, + cmdName: 'deletetable' + }, + '-', + { + label: lang.deleterow, + cmdName: 'deleterow' + }, + { + label: lang.deletecol, + cmdName: 'deletecol' + }, + { + label: lang.insertcol, + cmdName: 'insertcol' + }, + { + label: lang.insertcolnext, + cmdName: 'insertcolnext' + }, + { + label: lang.insertrow, + cmdName: 'insertrow' + }, + { + label: lang.insertrownext, + cmdName: 'insertrownext' + }, + '-', + { + label: lang.insertcaption, + cmdName: 'insertcaption' + }, + { + label: lang.deletecaption, + cmdName: 'deletecaption' + }, + { + label: lang.inserttitle, + cmdName: 'inserttitle' + }, + { + label: lang.deletetitle, + cmdName: 'deletetitle' + }, + { + label: lang.inserttitlecol, + cmdName: 'inserttitlecol' + }, + { + label: lang.deletetitlecol, + cmdName: 'deletetitlecol' + }, + '-', + { + label: lang.mergecells, + cmdName: 'mergecells' + }, + { + label: lang.mergeright, + cmdName: 'mergeright' + }, + { + label: lang.mergedown, + cmdName: 'mergedown' + }, + '-', + { + label: lang.splittorows, + cmdName: 'splittorows' + }, + { + label: lang.splittocols, + cmdName: 'splittocols' + }, + { + label: lang.splittocells, + cmdName: 'splittocells' + }, + '-', + { + label: lang.averageDiseRow, + cmdName: 'averagedistributerow' + }, + { + label: lang.averageDisCol, + cmdName: 'averagedistributecol' + }, + '-', + { + label: lang.edittd, + cmdName: 'edittd', + exec: function () { + if (UE.ui['edittd']) { + new UE.ui['edittd'](this); + } + this.getDialog('edittd').open(); + } + }, + { + label: lang.edittable, + cmdName: 'edittable', + exec: function () { + if (UE.ui['edittable']) { + new UE.ui['edittable'](this); + } + this.getDialog('edittable').open(); + } + }, + { + label: lang.setbordervisible, + cmdName: 'setbordervisible' + } + ] + }, + { + group: lang.tablesort, + icon: 'tablesort', + subMenu: [ + { + label: lang.enablesort, + cmdName: 'enablesort' + }, + { + label: lang.disablesort, + cmdName: 'disablesort' + }, + '-', + { + label: lang.reversecurrent, + cmdName: 'sorttable', + value: 'reversecurrent' + }, + { + label: lang.orderbyasc, + cmdName: 'sorttable', + value: 'orderbyasc' + }, + { + label: lang.reversebyasc, + cmdName: 'sorttable', + value: 'reversebyasc' + }, + { + label: lang.orderbynum, + cmdName: 'sorttable', + value: 'orderbynum' + }, + { + label: lang.reversebynum, + cmdName: 'sorttable', + value: 'reversebynum' + } + ] + }, + { + group: lang.borderbk, + icon: 'borderBack', + subMenu: [ + { + label: lang.setcolor, + cmdName: "interlacetable", + exec: function () { + this.execCommand("interlacetable"); + } + }, + { + label: lang.unsetcolor, + cmdName: "uninterlacetable", + exec: function () { + this.execCommand("uninterlacetable"); + } + }, + { + label: lang.setbackground, + cmdName: "settablebackground", + exec: function () { + this.execCommand("settablebackground", {repeat: true, colorList: ["#bbb", "#ccc"]}); + } + }, + { + label: lang.unsetbackground, + cmdName: "cleartablebackground", + exec: function () { + this.execCommand("cleartablebackground"); + } + }, + { + label: lang.redandblue, + cmdName: "settablebackground", + exec: function () { + this.execCommand("settablebackground", {repeat: true, colorList: ["red", "blue"]}); + } + }, + { + label: lang.threecolorgradient, + cmdName: "settablebackground", + exec: function () { + this.execCommand("settablebackground", { + repeat: true, + colorList: ["#aaa", "#bbb", "#ccc"] + }); + } + } + ] + }, + { + group: lang.aligntd, + icon: 'aligntd', + subMenu: [ + { + cmdName: 'cellalignment', + value: {align: 'left', vAlign: 'top'} + }, + { + cmdName: 'cellalignment', + value: {align: 'center', vAlign: 'top'} + }, + { + cmdName: 'cellalignment', + value: {align: 'right', vAlign: 'top'} + }, + { + cmdName: 'cellalignment', + value: {align: 'left', vAlign: 'middle'} + }, + { + cmdName: 'cellalignment', + value: {align: 'center', vAlign: 'middle'} + }, + { + cmdName: 'cellalignment', + value: {align: 'right', vAlign: 'middle'} + }, + { + cmdName: 'cellalignment', + value: {align: 'left', vAlign: 'bottom'} + }, + { + cmdName: 'cellalignment', + value: {align: 'center', vAlign: 'bottom'} + }, + { + cmdName: 'cellalignment', + value: {align: 'right', vAlign: 'bottom'} + } + ] + }, + { + group: lang.aligntable, + icon: 'aligntable', + subMenu: [ + { + cmdName: 'tablealignment', + className: 'left', + label: lang.tableleft, + value: "left" + }, + { + cmdName: 'tablealignment', + className: 'center', + label: lang.tablecenter, + value: "center" + }, + { + cmdName: 'tablealignment', + className: 'right', + label: lang.tableright, + value: "right" + } + ] + }, + '-', + { + label: lang.insertparagraphbefore, + cmdName: 'insertparagraph', + value: true + }, + { + label: lang.insertparagraphafter, + cmdName: 'insertparagraph' + }, + { + label: lang['copy'], + cmdName: 'copy' + }, + { + label: lang['paste'], + cmdName: 'paste' + } + ]; + if (!items.length) { + return; + } + var uiUtils = UE.ui.uiUtils; + + me.addListener('contextmenu', function (type, evt) { + + var offset = uiUtils.getViewportOffsetByEvent(evt); + me.fireEvent('beforeselectionchange'); + if (menu) { + menu.destroy(); + } + for (var i = 0, ti, contextItems = []; ti = items[i]; i++) { + var last; + (function (item) { + if (item == '-') { + if ((last = contextItems[contextItems.length - 1]) && last !== '-') { + contextItems.push('-'); + } + } else if (item.hasOwnProperty("group")) { + for (var j = 0, cj, subMenu = []; cj = item.subMenu[j]; j++) { + (function (subItem) { + if (subItem == '-') { + if ((last = subMenu[subMenu.length - 1]) && last !== '-') { + subMenu.push('-'); + } else { + subMenu.splice(subMenu.length - 1); + } + } else { + if ((me.commands[subItem.cmdName] || UE.commands[subItem.cmdName] || subItem.query) && + (subItem.query ? subItem.query() : me.queryCommandState(subItem.cmdName)) > -1) { + subMenu.push({ + 'label': subItem.label || me.getLang("contextMenu." + subItem.cmdName + (subItem.value || '')) || "", + 'className': 'edui-for-' + subItem.cmdName + (subItem.className ? (' edui-for-' + subItem.cmdName + '-' + subItem.className) : ''), + onclick: subItem.exec ? function () { + subItem.exec.call(me); + } : function () { + me.execCommand(subItem.cmdName, subItem.value); + } + }); + } + } + })(cj); + } + if (subMenu.length) { + function getLabel() { + switch (item.icon) { + case "table": + return me.getLang("contextMenu.table"); + case "justifyjustify": + return me.getLang("contextMenu.paragraph"); + case "aligntd": + return me.getLang("contextMenu.aligntd"); + case "aligntable": + return me.getLang("contextMenu.aligntable"); + case "tablesort": + return lang.tablesort; + case "borderBack": + return lang.borderbk; + default : + return ''; + } + } + + contextItems.push({ + //todo 修正成自动获取方式 + 'label': getLabel(), + className: 'edui-for-' + item.icon, + 'subMenu': { + items: subMenu, + editor: me + } + }); + } + + } else { + //有可能commmand没有加载右键不能出来,或者没有command也想能展示出来添加query方法 + if ((me.commands[item.cmdName] || UE.commands[item.cmdName] || item.query) && + (item.query ? item.query.call(me) : me.queryCommandState(item.cmdName)) > -1) { + + contextItems.push({ + 'label': item.label || me.getLang("contextMenu." + item.cmdName), + className: 'edui-for-' + (item.icon ? item.icon : item.cmdName + (item.value || '')), + onclick: item.exec ? function () { + item.exec.call(me); + } : function () { + me.execCommand(item.cmdName, item.value); + } + }); + } + + } + + })(ti); + } + if (contextItems[contextItems.length - 1] == '-') { + contextItems.pop(); + } + + menu = new UE.ui.Menu({ + items: contextItems, + className: "edui-contextmenu", + editor: me + }); + menu.render(); + menu.showAt(offset); + + me.fireEvent("aftershowcontextmenu", menu); + + domUtils.preventDefault(evt); + if (browser.ie) { + var ieRange; + try { + ieRange = me.selection.getNative().createRange(); + } catch (e) { + return; + } + if (ieRange.item) { + var range = new dom.Range(me.document); + range.selectNode(ieRange.item(0)).select(true, true); + } + } + }); + + // 添加复制的flash按钮 + me.addListener('aftershowcontextmenu', function (type, menu) { + if (me.zeroclipboard) { + var items = menu.items; + for (var key in items) { + if (items[key].className == 'edui-for-copy') { + me.zeroclipboard.clip(items[key].getDom()); + } + } + } + }); + + }; + + +// plugins/shortcutmenu.js +///import core +///commands 弹出菜单 +// commandsName popupmenu +///commandsTitle 弹出菜单 + /** + * 弹出菜单 + * @function + * @name baidu.editor.plugins.popupmenu + * @author xuheng + */ + + UE.plugins['shortcutmenu'] = function () { + var me = this, + menu, + items = me.options.shortcutMenu || []; + + if (!items.length) { + return; + } + + me.addListener('contextmenu mouseup', function (type, e) { + var me = this, + customEvt = { + type: type, + target: e.target || e.srcElement, + screenX: e.screenX, + screenY: e.screenY, + clientX: e.clientX, + clientY: e.clientY + }; + + setTimeout(function () { + var rng = me.selection.getRange(); + if (rng.collapsed === false || type == "contextmenu") { + + if (!menu) { + menu = new baidu.editor.ui.ShortCutMenu({ + editor: me, + items: items, + theme: me.options.theme, + className: 'edui-shortcutmenu' + }); + + menu.render(); + me.fireEvent("afterrendershortcutmenu", menu); + } + + menu.show(customEvt, !!UE.plugins['contextmenu']); + } + }); + + if (type == 'contextmenu') { + domUtils.preventDefault(e); + if (browser.ie9below) { + var ieRange; + try { + ieRange = me.selection.getNative().createRange(); + } catch (e) { + return; + } + if (ieRange.item) { + var range = new dom.Range(me.document); + range.selectNode(ieRange.item(0)).select(true, true); + + } + } + } + }); + + me.addListener('keydown', function (type) { + if (type == "keydown") { + menu && !menu.isHidden && menu.hide(); + } + + }); + + }; + + +// plugins/basestyle.js + /** + * B、I、sub、super命令支持 + * @file + * @since 1.2.6.1 + */ + + UE.plugins['basestyle'] = function () { + + /** + * 字体加粗 + * @command bold + * @param { String } cmd 命令字符串 + * @remind 对已加粗的文本内容执行该命令, 将取消加粗 + * @method execCommand + * @example + * ```javascript + * //editor是编辑器实例 + * //对当前选中的文本内容执行加粗操作 + * //第一次执行, 文本内容加粗 + * editor.execCommand( 'bold' ); + * + * //第二次执行, 文本内容取消加粗 + * editor.execCommand( 'bold' ); + * ``` + */ + + + /** + * 字体倾斜 + * @command italic + * @method execCommand + * @param { String } cmd 命令字符串 + * @remind 对已倾斜的文本内容执行该命令, 将取消倾斜 + * @example + * ```javascript + * //editor是编辑器实例 + * //对当前选中的文本内容执行斜体操作 + * //第一次操作, 文本内容将变成斜体 + * editor.execCommand( 'italic' ); + * + * //再次对同一文本内容执行, 则文本内容将恢复正常 + * editor.execCommand( 'italic' ); + * ``` + */ + + /** + * 下标文本,与“superscript”命令互斥 + * @command subscript + * @method execCommand + * @remind 把选中的文本内容切换成下标文本, 如果当前选中的文本已经是下标, 则该操作会把文本内容还原成正常文本 + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * //editor是编辑器实例 + * //对当前选中的文本内容执行下标操作 + * //第一次操作, 文本内容将变成下标文本 + * editor.execCommand( 'subscript' ); + * + * //再次对同一文本内容执行, 则文本内容将恢复正常 + * editor.execCommand( 'subscript' ); + * ``` + */ + + /** + * 上标文本,与“subscript”命令互斥 + * @command superscript + * @method execCommand + * @remind 把选中的文本内容切换成上标文本, 如果当前选中的文本已经是上标, 则该操作会把文本内容还原成正常文本 + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * //editor是编辑器实例 + * //对当前选中的文本内容执行上标操作 + * //第一次操作, 文本内容将变成上标文本 + * editor.execCommand( 'superscript' ); + * + * //再次对同一文本内容执行, 则文本内容将恢复正常 + * editor.execCommand( 'superscript' ); + * ``` + */ + var basestyles = { + 'bold': ['strong', 'b'], + 'italic': ['em', 'i'], + 'subscript': ['sub'], + 'superscript': ['sup'] + }, + getObj = function (editor, tagNames) { + return domUtils.filterNodeList(editor.selection.getStartElementPath(), tagNames); + }, + me = this; + //添加快捷键 + me.addshortcutkey({ + "Bold": "ctrl+66",//^B + "Italic": "ctrl+73", //^I + "Underline": "ctrl+85"//^U + }); + me.addInputRule(function (root) { + utils.each(root.getNodesByTagName('b i'), function (node) { + switch (node.tagName) { + case 'b': + node.tagName = 'strong'; + break; + case 'i': + node.tagName = 'em'; + } + }); + }); + for (var style in basestyles) { + (function (cmd, tagNames) { + me.commands[cmd] = { + execCommand: function (cmdName) { + var range = me.selection.getRange(), obj = getObj(this, tagNames); + if (range.collapsed) { + if (obj) { + var tmpText = me.document.createTextNode(''); + range.insertNode(tmpText).removeInlineStyle(tagNames); + range.setStartBefore(tmpText); + domUtils.remove(tmpText); + } else { + var tmpNode = range.document.createElement(tagNames[0]); + if (cmdName == 'superscript' || cmdName == 'subscript') { + tmpText = me.document.createTextNode(''); + range.insertNode(tmpText) + .removeInlineStyle(['sub', 'sup']) + .setStartBefore(tmpText) + .collapse(true); + } + range.insertNode(tmpNode).setStart(tmpNode, 0); + } + range.collapse(true); + } else { + if (cmdName == 'superscript' || cmdName == 'subscript') { + if (!obj || obj.tagName.toLowerCase() != cmdName) { + range.removeInlineStyle(['sub', 'sup']); + } + } + obj ? range.removeInlineStyle(tagNames) : range.applyInlineStyle(tagNames[0]); + } + range.select(); + }, + queryCommandState: function () { + return getObj(this, tagNames) ? 1 : 0; + } + }; + })(style, basestyles[style]); + } + }; + + +// plugins/elementpath.js + /** + * 选取路径命令 + * @file + */ + UE.plugins['elementpath'] = function () { + var currentLevel, + tagNames, + me = this; + me.setOpt('elementPathEnabled', true); + if (!me.options.elementPathEnabled) { + return; + } + me.commands['elementpath'] = { + execCommand: function (cmdName, level) { + var start = tagNames[level], + range = me.selection.getRange(); + currentLevel = level * 1; + range.selectNode(start).select(); + }, + queryCommandValue: function () { + //产生一个副本,不能修改原来的startElementPath; + var parents = [].concat(this.selection.getStartElementPath()).reverse(), + names = []; + tagNames = parents; + for (var i = 0, ci; ci = parents[i]; i++) { + if (ci.nodeType == 3) { + continue; + } + var name = ci.tagName.toLowerCase(); + if (name == 'img' && ci.getAttribute('anchorname')) { + name = 'anchor'; + } + names[i] = name; + if (currentLevel == i) { + currentLevel = -1; + break; + } + } + return names; + } + }; + }; + + +// plugins/formatmatch.js + /** + * 格式刷,只格式inline的 + * @file + * @since 1.2.6.1 + */ + + /** + * 格式刷 + * @command formatmatch + * @method execCommand + * @remind 该操作不能复制段落格式 + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * //editor是编辑器实例 + * //获取格式刷 + * editor.execCommand( 'formatmatch' ); + * ``` + */ + UE.plugins['formatmatch'] = function () { + + var me = this, + list = [], img, + flag = 0; + + me.addListener('reset', function () { + list = []; + flag = 0; + }); + + function addList(type, evt) { + + if (browser.webkit) { + var target = evt.target.tagName == 'IMG' ? evt.target : null; + } + + function addFormat(range) { + + if (text) { + range.selectNode(text); + } + return range.applyInlineStyle(list[list.length - 1].tagName, null, list); + + } + + me.undoManger && me.undoManger.save(); + + var range = me.selection.getRange(), + imgT = target || range.getClosedNode(); + if (img && imgT && imgT.tagName == 'IMG') { + //trace:964 + + imgT.style.cssText += ';float:' + (img.style.cssFloat || img.style.styleFloat || 'none') + ';display:' + (img.style.display || 'inline'); + + img = null; + } else { + if (!img) { + var collapsed = range.collapsed; + if (collapsed) { + var text = me.document.createTextNode('match'); + range.insertNode(text).select(); + + + } + me.__hasEnterExecCommand = true; + //不能把block上的属性干掉 + //trace:1553 + var removeFormatAttributes = me.options.removeFormatAttributes; + me.options.removeFormatAttributes = ''; + me.execCommand('removeformat'); + me.options.removeFormatAttributes = removeFormatAttributes; + me.__hasEnterExecCommand = false; + //trace:969 + range = me.selection.getRange(); + if (list.length) { + addFormat(range); + } + if (text) { + range.setStartBefore(text).collapse(true); + + } + range.select(); + text && domUtils.remove(text); + } + + } + + + me.undoManger && me.undoManger.save(); + me.removeListener('mouseup', addList); + flag = 0; + } + + me.commands['formatmatch'] = { + execCommand: function (cmdName) { + + if (flag) { + flag = 0; + list = []; + me.removeListener('mouseup', addList); + return; + } + + + var range = me.selection.getRange(); + img = range.getClosedNode(); + if (!img || img.tagName != 'IMG') { + range.collapse(true).shrinkBoundary(); + var start = range.startContainer; + list = domUtils.findParents(start, true, function (node) { + return !domUtils.isBlockElm(node) && node.nodeType == 1; + }); + //a不能加入格式刷, 并且克隆节点 + for (var i = 0, ci; ci = list[i]; i++) { + if (ci.tagName == 'A') { + list.splice(i, 1); + break; + } + } + + } + + me.addListener('mouseup', addList); + flag = 1; + + + }, + queryCommandState: function () { + return flag; + }, + notNeedUndo: 1 + }; + }; + + +// plugins/searchreplace.js +///import core +///commands 查找替换 +///commandsName SearchReplace +///commandsTitle 查询替换 +///commandsDialog dialogs\searchreplace + /** + * @description 查找替换 + * @author zhanyi + */ + + UE.plugin.register('searchreplace', function () { + var me = this; + + var _blockElm = {'table': 1, 'tbody': 1, 'tr': 1, 'ol': 1, 'ul': 1}; + + function findTextInString(textContent, opt, currentIndex) { + var str = opt.searchStr; + if (opt.dir == -1) { + textContent = textContent.split('').reverse().join(''); + str = str.split('').reverse().join(''); + currentIndex = textContent.length - currentIndex; + + } + var reg = new RegExp(str, 'g' + (opt.casesensitive ? '' : 'i')), match; + + while (match = reg.exec(textContent)) { + if (match.index >= currentIndex) { + return opt.dir == -1 ? textContent.length - match.index - opt.searchStr.length : match.index; + } + } + return -1 + } + + function findTextBlockElm(node, currentIndex, opt) { + var textContent, index, methodName = opt.all || opt.dir == 1 ? 'getNextDomNode' : 'getPreDomNode'; + if (domUtils.isBody(node)) { + node = node.firstChild; + } + var first = 1; + while (node) { + textContent = node.nodeType == 3 ? node.nodeValue : node[browser.ie ? 'innerText' : 'textContent']; + index = findTextInString(textContent, opt, currentIndex); + first = 0; + if (index != -1) { + return { + 'node': node, + 'index': index + } + } + node = domUtils[methodName](node); + while (node && _blockElm[node.nodeName.toLowerCase()]) { + node = domUtils[methodName](node, true); + } + if (node) { + currentIndex = opt.dir == -1 ? (node.nodeType == 3 ? node.nodeValue : node[browser.ie ? 'innerText' : 'textContent']).length : 0; + } + + } + } + + function findNTextInBlockElm(node, index, str) { + var currentIndex = 0, + currentNode = node.firstChild, + currentNodeLength = 0, + result; + while (currentNode) { + if (currentNode.nodeType == 3) { + currentNodeLength = currentNode.nodeValue.replace(/(^[\t\r\n]+)|([\t\r\n]+$)/, '').length; + currentIndex += currentNodeLength; + if (currentIndex >= index) { + return { + 'node': currentNode, + 'index': currentNodeLength - (currentIndex - index) + } + } + } else if (!dtd.$empty[currentNode.tagName]) { + currentNodeLength = currentNode[browser.ie ? 'innerText' : 'textContent'].replace(/(^[\t\r\n]+)|([\t\r\n]+$)/, '').length + currentIndex += currentNodeLength; + if (currentIndex >= index) { + result = findNTextInBlockElm(currentNode, currentNodeLength - (currentIndex - index), str); + if (result) { + return result; + } + } + } + currentNode = domUtils.getNextDomNode(currentNode); + + } + } + + function searchReplace(me, opt) { + + var rng = me.selection.getRange(), + startBlockNode, + searchStr = opt.searchStr, + span = me.document.createElement('span'); + span.innerHTML = '$$ueditor_searchreplace_key$$'; + + rng.shrinkBoundary(true); + + //判断是不是第一次选中 + if (!rng.collapsed) { + rng.select(); + var rngText = me.selection.getText(); + if (new RegExp('^' + opt.searchStr + '$', (opt.casesensitive ? '' : 'i')).test(rngText)) { + if (opt.replaceStr != undefined) { + replaceText(rng, opt.replaceStr); + rng.select(); + return true; + } else { + rng.collapse(opt.dir == -1) + } + + } + } + + + rng.insertNode(span); + rng.enlargeToBlockElm(true); + startBlockNode = rng.startContainer; + var currentIndex = startBlockNode[browser.ie ? 'innerText' : 'textContent'].indexOf('$$ueditor_searchreplace_key$$'); + rng.setStartBefore(span); + domUtils.remove(span); + var result = findTextBlockElm(startBlockNode, currentIndex, opt); + if (result) { + var rngStart = findNTextInBlockElm(result.node, result.index, searchStr); + var rngEnd = findNTextInBlockElm(result.node, result.index + searchStr.length, searchStr); + rng.setStart(rngStart.node, rngStart.index).setEnd(rngEnd.node, rngEnd.index); + + if (opt.replaceStr !== undefined) { + replaceText(rng, opt.replaceStr) + } + rng.select(); + return true; + } else { + rng.setCursor() + } + + } + + function replaceText(rng, str) { + + str = me.document.createTextNode(str); + rng.deleteContents().insertNode(str); + + } + + return { + commands: { + 'searchreplace': { + execCommand: function (cmdName, opt) { + utils.extend(opt, { + all: false, + casesensitive: false, + dir: 1 + }, true); + var num = 0; + if (opt.all) { + + var rng = me.selection.getRange(), + first = me.body.firstChild; + if (first && first.nodeType == 1) { + rng.setStart(first, 0); + rng.shrinkBoundary(true); + } else if (first.nodeType == 3) { + rng.setStartBefore(first) + } + rng.collapse(true).select(true); + if (opt.replaceStr !== undefined) { + me.fireEvent('saveScene'); + } + while (searchReplace(this, opt)) { + num++; + } + if (num) { + me.fireEvent('saveScene'); + } + } else { + if (opt.replaceStr !== undefined) { + me.fireEvent('saveScene'); + } + if (searchReplace(this, opt)) { + num++ + } + if (num) { + me.fireEvent('saveScene'); + } + + } + + return num; + }, + notNeedUndo: 1 + } + } + } + }); + +// plugins/customstyle.js + /** + * 自定义样式 + * @file + * @since 1.2.6.1 + */ + + /** + * 根据config配置文件里“customstyle”选项的值对匹配的标签执行样式替换。 + * @command customstyle + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'customstyle' ); + * ``` + */ + UE.plugins['customstyle'] = function () { + var me = this; + me.setOpt({ + 'customstyle': [ + { + tag: 'h1', + name: 'tc', + style: 'font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;' + }, + { + tag: 'h1', + name: 'tl', + style: 'font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:left;margin:0 0 10px 0;' + }, + {tag: 'span', name: 'im', style: 'font-size:16px;font-style:italic;font-weight:bold;line-height:18px;'}, + { + tag: 'span', + name: 'hi', + style: 'font-size:16px;font-style:italic;font-weight:bold;color:rgb(51, 153, 204);line-height:18px;' + } + ] + }); + me.commands['customstyle'] = { + execCommand: function (cmdName, obj) { + var me = this, + tagName = obj.tag, + node = domUtils.findParent(me.selection.getStart(), function (node) { + return node.getAttribute('label'); + }, true), + range, bk, tmpObj = {}; + for (var p in obj) { + if (obj[p] !== undefined) + tmpObj[p] = obj[p]; + } + delete tmpObj.tag; + if (node && node.getAttribute('label') == obj.label) { + range = this.selection.getRange(); + bk = range.createBookmark(); + if (range.collapsed) { + //trace:1732 删掉自定义标签,要有p来回填站位 + if (dtd.$block[node.tagName]) { + var fillNode = me.document.createElement('p'); + domUtils.moveChild(node, fillNode); + node.parentNode.insertBefore(fillNode, node); + domUtils.remove(node); + } else { + domUtils.remove(node, true); + } + + } else { + + var common = domUtils.getCommonAncestor(bk.start, bk.end), + nodes = domUtils.getElementsByTagName(common, tagName); + if (new RegExp(tagName, 'i').test(common.tagName)) { + nodes.push(common); + } + for (var i = 0, ni; ni = nodes[i++];) { + if (ni.getAttribute('label') == obj.label) { + var ps = domUtils.getPosition(ni, bk.start), pe = domUtils.getPosition(ni, bk.end); + if ((ps & domUtils.POSITION_FOLLOWING || ps & domUtils.POSITION_CONTAINS) + && + (pe & domUtils.POSITION_PRECEDING || pe & domUtils.POSITION_CONTAINS) + ) + if (dtd.$block[tagName]) { + var fillNode = me.document.createElement('p'); + domUtils.moveChild(ni, fillNode); + ni.parentNode.insertBefore(fillNode, ni); + } + domUtils.remove(ni, true); + } + } + node = domUtils.findParent(common, function (node) { + return node.getAttribute('label') == obj.label; + }, true); + if (node) { + + domUtils.remove(node, true); + + } + + } + range.moveToBookmark(bk).select(); + } else { + if (dtd.$block[tagName]) { + this.execCommand('paragraph', tagName, tmpObj, 'customstyle'); + range = me.selection.getRange(); + if (!range.collapsed) { + range.collapse(); + node = domUtils.findParent(me.selection.getStart(), function (node) { + return node.getAttribute('label') == obj.label; + }, true); + var pNode = me.document.createElement('p'); + domUtils.insertAfter(node, pNode); + domUtils.fillNode(me.document, pNode); + range.setStart(pNode, 0).setCursor(); + } + } else { + + range = me.selection.getRange(); + if (range.collapsed) { + node = me.document.createElement(tagName); + domUtils.setAttributes(node, tmpObj); + range.insertNode(node).setStart(node, 0).setCursor(); + + return; + } + + bk = range.createBookmark(); + range.applyInlineStyle(tagName, tmpObj).moveToBookmark(bk).select(); + } + } + + }, + queryCommandValue: function () { + var parent = domUtils.filterNodeList( + this.selection.getStartElementPath(), + function (node) { + return node.getAttribute('label') + } + ); + return parent ? parent.getAttribute('label') : ''; + } + }; + //当去掉customstyle是,如果是块元素,用p代替 + me.addListener('keyup', function (type, evt) { + var keyCode = evt.keyCode || evt.which; + + if (keyCode == 32 || keyCode == 13) { + var range = me.selection.getRange(); + if (range.collapsed) { + var node = domUtils.findParent(me.selection.getStart(), function (node) { + return node.getAttribute('label'); + }, true); + if (node && dtd.$block[node.tagName] && domUtils.isEmptyNode(node)) { + var p = me.document.createElement('p'); + domUtils.insertAfter(node, p); + domUtils.fillNode(me.document, p); + domUtils.remove(node); + range.setStart(p, 0).setCursor(); + + + } + } + } + }); + }; + +// plugins/catchremoteimage.js +///import core +///commands 远程图片抓取 +///commandsName catchRemoteImage,catchremoteimageenable +///commandsTitle 远程图片抓取 + /** + * 远程图片抓取,当开启本插件时所有不符合本地域名的图片都将被抓取成为本地服务器上的图片 + */ + UE.plugins['catchremoteimage'] = function () { + var me = this, + ajax = UE.ajax; + + /* 设置默认值 */ + if (me.options.catchRemoteImageEnable === false) return; + me.setOpt({ + catchRemoteImageEnable: false + }); + + me.addListener("afterpaste", function () { + me.fireEvent("catchRemoteImage"); + }); + + me.addListener("catchRemoteImage", function () { + + var catcherLocalDomain = me.getOpt('catcherLocalDomain'), + catcherActionUrl = me.getActionUrl(me.getOpt('catcherActionName')), + catcherUrlPrefix = me.getOpt('catcherUrlPrefix'), + catcherFieldName = me.getOpt('catcherFieldName'); + + var remoteImages = [], + imgs = domUtils.getElementsByTagName(me.document, "img"), + test = function (src, urls) { + if (src.indexOf(location.host) != -1 || /(^\.)|(^\/)/.test(src)) { + return true; + } + if (urls) { + for (var j = 0, url; url = urls[j++];) { + if (src.indexOf(url) !== -1) { + return true; + } + } + } + return false; + }; + + for (var i = 0, ci; ci = imgs[i++];) { + if (ci.getAttribute("word_img")) { + continue; + } + var src = ci.getAttribute("_src") || ci.src || ""; + if (/^(https?|ftp):/i.test(src) && !test(src, catcherLocalDomain)) { + remoteImages.push(src); + } + } + + if (remoteImages.length) { + catchremoteimage(remoteImages, { + //成功抓取 + success: function (r) { + try { + var info = r.state !== undefined ? r : eval("(" + r.responseText + ")"); + } catch (e) { + return; + } + + /* 获取源路径和新路径 */ + var i, j, ci, cj, oldSrc, newSrc, list = info.list; + + for (i = 0; ci = imgs[i++];) { + oldSrc = ci.getAttribute("_src") || ci.src || ""; + for (j = 0; cj = list[j++];) { + if (oldSrc == cj.source && cj.state == "SUCCESS") { //抓取失败时不做替换处理 + newSrc = catcherUrlPrefix + cj.url; + domUtils.setAttributes(ci, { + "src": newSrc, + "_src": newSrc + }); + break; + } + } + } + me.fireEvent('catchremotesuccess') + }, + //回调失败,本次请求超时 + error: function () { + me.fireEvent("catchremoteerror"); + } + }); + } + + function catchremoteimage(imgs, callbacks) { + var params = utils.serializeParam(me.queryCommandValue('serverparam')) || '', + url = utils.formatUrl(catcherActionUrl + (catcherActionUrl.indexOf('?') == -1 ? '?' : '&') + params), + isJsonp = utils.isCrossDomainUrl(url), + opt = { + 'method': 'POST', + 'dataType': isJsonp ? 'jsonp' : '', + 'timeout': 60000, //单位:毫秒,回调请求超时设置。目标用户如果网速不是很快的话此处建议设置一个较大的数值 + 'onsuccess': callbacks["success"], + 'onerror': callbacks["error"] + }; + opt[catcherFieldName] = imgs; + ajax.request(url, opt); + } + + }); + }; + +// plugins/snapscreen.js + /** + * 截屏插件,为UEditor提供插入支持 + * @file + * @since 1.4.2 + */ + UE.plugin.register('snapscreen', function () { + + var me = this; + var snapplugin; + + function getLocation(url) { + var search, + a = document.createElement('a'), + params = utils.serializeParam(me.queryCommandValue('serverparam')) || ''; + + a.href = url; + if (browser.ie) { + a.href = a.href; + } + + + search = a.search; + if (params) { + search = search + (search.indexOf('?') == -1 ? '?' : '&') + params; + search = search.replace(/[&]+/ig, '&'); + } + return { + 'port': a.port, + 'hostname': a.hostname, + 'path': a.pathname + search || +a.hash + } + } + + return { + commands: { + /** + * 字体背景颜色 + * @command snapscreen + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand('snapscreen'); + * ``` + */ + 'snapscreen': { + execCommand: function (cmd) { + var url, local, res; + var lang = me.getLang("snapScreen_plugin"); + + if (!snapplugin) { + var container = me.container; + var doc = me.container.ownerDocument || me.container.document; + snapplugin = doc.createElement("object"); + try { + snapplugin.type = "application/x-pluginbaidusnap"; + } catch (e) { + return; + } + snapplugin.style.cssText = "position:absolute;left:-9999px;width:0;height:0;"; + snapplugin.setAttribute("width", "0"); + snapplugin.setAttribute("height", "0"); + container.appendChild(snapplugin); + } + + function onSuccess(rs) { + try { + rs = eval("(" + rs + ")"); + if (rs.state == 'SUCCESS') { + var opt = me.options; + me.execCommand('insertimage', { + src: opt.snapscreenUrlPrefix + rs.url, + _src: opt.snapscreenUrlPrefix + rs.url, + alt: rs.title || '', + floatStyle: opt.snapscreenImgAlign + }); + } else { + alert(rs.state); + } + } catch (e) { + alert(lang.callBackErrorMsg); + } + } + + url = me.getActionUrl(me.getOpt('snapscreenActionName')); + local = getLocation(url); + setTimeout(function () { + try { + res = snapplugin.saveSnapshot(local.hostname, local.path, local.port); + } catch (e) { + me.ui._dialogs['snapscreenDialog'].open(); + return; + } + + onSuccess(res); + }, 50); + }, + queryCommandState: function () { + return (navigator.userAgent.indexOf("Windows", 0) != -1) ? 0 : -1; + } + } + } + } + }); + + +// plugins/insertparagraph.js + /** + * 插入段落 + * @file + * @since 1.2.6.1 + */ + + + /** + * 插入段落 + * @command insertparagraph + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * //editor是编辑器实例 + * editor.execCommand( 'insertparagraph' ); + * ``` + */ + + UE.commands['insertparagraph'] = { + execCommand: function (cmdName, front) { + var me = this, + range = me.selection.getRange(), + start = range.startContainer, tmpNode; + while (start) { + if (domUtils.isBody(start)) { + break; + } + tmpNode = start; + start = start.parentNode; + } + if (tmpNode) { + var p = me.document.createElement('p'); + if (front) { + tmpNode.parentNode.insertBefore(p, tmpNode) + } else { + tmpNode.parentNode.insertBefore(p, tmpNode.nextSibling) + } + domUtils.fillNode(me.document, p); + range.setStart(p, 0).setCursor(false, true); + } + } + }; + + +// plugins/webapp.js + /** + * 百度应用 + * @file + * @since 1.2.6.1 + */ + + + /** + * 插入百度应用 + * @command webapp + * @method execCommand + * @remind 需要百度APPKey + * @remind 百度应用主页: http://app.baidu.com/ + * @param { Object } appOptions 应用所需的参数项, 支持的key有: title=>应用标题, width=>应用容器宽度, + * height=>应用容器高度,logo=>应用logo,url=>应用地址 + * @example + * ```javascript + * //editor是编辑器实例 + * //在编辑器里插入一个“植物大战僵尸”的APP + * editor.execCommand( 'webapp' , { + * title: '植物大战僵尸', + * width: 560, + * height: 465, + * logo: '应用展示的图片', + * url: '百度应用的地址' + * } ); + * ``` + */ + +//UE.plugins['webapp'] = function () { +// var me = this; +// function createInsertStr( obj, toIframe, addParagraph ) { +// return !toIframe ? +// (addParagraph ? '

      ' : '') + '' + +// (addParagraph ? '

      ' : '') +// : +// ''; +// } +// +// function switchImgAndIframe( img2frame ) { +// var tmpdiv, +// nodes = domUtils.getElementsByTagName( me.document, !img2frame ? "iframe" : "img" ); +// for ( var i = 0, node; node = nodes[i++]; ) { +// if ( node.className != "edui-faked-webapp" ){ +// continue; +// } +// tmpdiv = me.document.createElement( "div" ); +// tmpdiv.innerHTML = createInsertStr( img2frame ? {url:node.getAttribute( "_url" ), width:node.width, height:node.height,title:node.title,logo:node.style.backgroundImage.replace("url(","").replace(")","")} : {url:node.getAttribute( "src", 2 ),title:node.title, width:node.width, height:node.height,logo:node.getAttribute("logo_url")}, img2frame ? true : false,false ); +// node.parentNode.replaceChild( tmpdiv.firstChild, node ); +// } +// } +// +// me.addListener( "beforegetcontent", function () { +// switchImgAndIframe( true ); +// } ); +// me.addListener( 'aftersetcontent', function () { +// switchImgAndIframe( false ); +// } ); +// me.addListener( 'aftergetcontent', function ( cmdName ) { +// if ( cmdName == 'aftergetcontent' && me.queryCommandState( 'source' ) ){ +// return; +// } +// switchImgAndIframe( false ); +// } ); +// +// me.commands['webapp'] = { +// execCommand:function ( cmd, obj ) { +// me.execCommand( "inserthtml", createInsertStr( obj, false,true ) ); +// } +// }; +//}; + + UE.plugin.register('webapp', function () { + var me = this; + + function createInsertStr(obj, toEmbed) { + return !toEmbed ? + '' + : + '' + + } + + return { + outputRule: function (root) { + utils.each(root.getNodesByTagName('img'), function (node) { + var html; + if (node.getAttr('class') == 'edui-faked-webapp') { + html = createInsertStr({ + title: node.getAttr('title'), + 'width': node.getAttr('width'), + 'height': node.getAttr('height'), + 'align': node.getAttr('align'), + 'cssfloat': node.getStyle('float'), + 'url': node.getAttr("_url"), + 'logo': node.getAttr('_logo_url') + }, true); + var embed = UE.uNode.createElement(html); + node.parentNode.replaceChild(embed, node); + } + }) + }, + inputRule: function (root) { + utils.each(root.getNodesByTagName('iframe'), function (node) { + if (node.getAttr('class') == 'edui-faked-webapp') { + var img = UE.uNode.createElement(createInsertStr({ + title: node.getAttr('title'), + 'width': node.getAttr('width'), + 'height': node.getAttr('height'), + 'align': node.getAttr('align'), + 'cssfloat': node.getStyle('float'), + 'url': node.getAttr("src"), + 'logo': node.getAttr('logo_url') + })); + node.parentNode.replaceChild(img, node); + } + }) + + }, + commands: { + /** + * 插入百度应用 + * @command webapp + * @method execCommand + * @remind 需要百度APPKey + * @remind 百度应用主页: http://app.baidu.com/ + * @param { Object } appOptions 应用所需的参数项, 支持的key有: title=>应用标题, width=>应用容器宽度, + * height=>应用容器高度,logo=>应用logo,url=>应用地址 + * @example + * ```javascript + * //editor是编辑器实例 + * //在编辑器里插入一个“植物大战僵尸”的APP + * editor.execCommand( 'webapp' , { + * title: '植物大战僵尸', + * width: 560, + * height: 465, + * logo: '应用展示的图片', + * url: '百度应用的地址' + * } ); + * ``` + */ + 'webapp': { + execCommand: function (cmd, obj) { + + var me = this, + str = createInsertStr(utils.extend(obj, { + align: 'none' + }), false); + me.execCommand("inserthtml", str); + }, + queryCommandState: function () { + var me = this, + img = me.selection.getRange().getClosedNode(), + flag = img && (img.className == "edui-faked-webapp"); + return flag ? 1 : 0; + } + } + } + } + }); + +// plugins/template.js +///import core +///import plugins\inserthtml.js +///import plugins\cleardoc.js +///commands 模板 +///commandsName template +///commandsTitle 模板 +///commandsDialog dialogs\template + UE.plugins['template'] = function () { + UE.commands['template'] = { + execCommand: function (cmd, obj) { + obj.html && this.execCommand("inserthtml", obj.html); + } + }; + this.addListener("click", function (type, evt) { + var el = evt.target || evt.srcElement, + range = this.selection.getRange(); + var tnode = domUtils.findParent(el, function (node) { + if (node.className && domUtils.hasClass(node, "ue_t")) { + return node; + } + }, true); + tnode && range.selectNode(tnode).shrinkBoundary().select(); + }); + this.addListener("keydown", function (type, evt) { + var range = this.selection.getRange(); + if (!range.collapsed) { + if (!evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey) { + var tnode = domUtils.findParent(range.startContainer, function (node) { + if (node.className && domUtils.hasClass(node, "ue_t")) { + return node; + } + }, true); + if (tnode) { + domUtils.removeClasses(tnode, ["ue_t"]); + } + } + } + }); + }; + + +// plugins/music.js + /** + * 插入音乐命令 + * @file + */ + UE.plugin.register('music', function () { + var me = this; + + function creatInsertStr(url, width, height, align, cssfloat, toEmbed) { + return !toEmbed ? + '' + : + ''; + } + + return { + outputRule: function (root) { + utils.each(root.getNodesByTagName('img'), function (node) { + var html; + if (node.getAttr('class') == 'edui-faked-music') { + var cssfloat = node.getStyle('float'); + var align = node.getAttr('align'); + html = creatInsertStr(node.getAttr("_url"), node.getAttr('width'), node.getAttr('height'), align, cssfloat, true); + var embed = UE.uNode.createElement(html); + node.parentNode.replaceChild(embed, node); + } + }) + }, + inputRule: function (root) { + utils.each(root.getNodesByTagName('embed'), function (node) { + if (node.getAttr('class') == 'edui-faked-music') { + var cssfloat = node.getStyle('float'); + var align = node.getAttr('align'); + html = creatInsertStr(node.getAttr("src"), node.getAttr('width'), node.getAttr('height'), align, cssfloat, false); + var img = UE.uNode.createElement(html); + node.parentNode.replaceChild(img, node); + } + }) + + }, + commands: { + /** + * 插入音乐 + * @command music + * @method execCommand + * @param { Object } musicOptions 插入音乐的参数项, 支持的key有: url=>音乐地址; + * width=>音乐容器宽度;height=>音乐容器高度;align=>音乐文件的对齐方式, 可选值有: left, center, right, none + * @example + * ```javascript + * //editor是编辑器实例 + * //在编辑器里插入一个“植物大战僵尸”的APP + * editor.execCommand( 'music' , { + * width: 400, + * height: 95, + * align: "center", + * url: "音乐地址" + * } ); + * ``` + */ + 'music': { + execCommand: function (cmd, musicObj) { + var me = this, + str = creatInsertStr(musicObj.url, musicObj.width || 400, musicObj.height || 95, "none", false); + me.execCommand("inserthtml", str); + }, + queryCommandState: function () { + var me = this, + img = me.selection.getRange().getClosedNode(), + flag = img && (img.className == "edui-faked-music"); + return flag ? 1 : 0; + } + } + } + } + }); + +// plugins/autoupload.js + /** + * @description + * 1.拖放文件到编辑区域,自动上传并插入到选区 + * 2.插入粘贴板的图片,自动上传并插入到选区 + * @author Jinqn + * @date 2013-10-14 + */ + UE.plugin.register('autoupload', function () { + + function sendAndInsertFile(file, editor) { + var me = editor; + //模拟数据 + var fieldName, urlPrefix, maxSize, allowFiles, actionUrl, + loadingHtml, errorHandler, successHandler, + filetype = /image\/\w+/i.test(file.type) ? 'image' : 'file', + loadingId = 'loading_' + (+new Date()).toString(36); + + fieldName = me.getOpt(filetype + 'FieldName'); + urlPrefix = me.getOpt(filetype + 'UrlPrefix'); + maxSize = me.getOpt(filetype + 'MaxSize'); + allowFiles = me.getOpt(filetype + 'AllowFiles'); + actionUrl = me.getActionUrl(me.getOpt(filetype + 'ActionName')); + errorHandler = function (title) { + var loader = me.document.getElementById(loadingId); + loader && domUtils.remove(loader); + me.fireEvent('showmessage', { + 'id': loadingId, + 'content': title, + 'type': 'error', + 'timeout': 4000 + }); + }; + + if (filetype == 'image') { + loadingHtml = ''; + successHandler = function (data) { + var link = urlPrefix + data.url, + loader = me.document.getElementById(loadingId); + if (loader) { + loader.setAttribute('src', link); + loader.setAttribute('_src', link); + loader.setAttribute('title', data.title || ''); + loader.setAttribute('alt', data.original || ''); + loader.removeAttribute('id'); + domUtils.removeClasses(loader, 'loadingclass'); + } + }; + } else { + loadingHtml = '

      ' + + '' + + '

      '; + successHandler = function (data) { + var link = urlPrefix + data.url, + loader = me.document.getElementById(loadingId); + + var rng = me.selection.getRange(), + bk = rng.createBookmark(); + rng.selectNode(loader).select(); + me.execCommand('insertfile', {'url': link}); + rng.moveToBookmark(bk).select(); + }; + } + + /* 插入loading的占位符 */ + me.execCommand('inserthtml', loadingHtml); + + /* 判断后端配置是否没有加载成功 */ + if (!me.getOpt(filetype + 'ActionName')) { + errorHandler(me.getLang('autoupload.errorLoadConfig')); + return; + } + /* 判断文件大小是否超出限制 */ + if (file.size > maxSize) { + errorHandler(me.getLang('autoupload.exceedSizeError')); + return; + } + /* 判断文件格式是否超出允许 */ + var fileext = file.name ? file.name.substr(file.name.lastIndexOf('.')) : ''; + if ((fileext && filetype != 'image') || (allowFiles && (allowFiles.join('') + '.').indexOf(fileext.toLowerCase() + '.') == -1)) { + errorHandler(me.getLang('autoupload.exceedTypeError')); + return; + } + + /* 创建Ajax并提交 */ + var xhr = new XMLHttpRequest(), + fd = new FormData(), + params = utils.serializeParam(me.queryCommandValue('serverparam')) || '', + url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?' : '&') + params); + + fd.append(fieldName, file, file.name || ('blob.' + file.type.substr('image/'.length))); + fd.append('type', 'ajax'); + xhr.open("post", url, true); + xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); + xhr.addEventListener('load', function (e) { + try { + var json = (new Function("return " + utils.trim(e.target.response)))(); + if (json.state == 'SUCCESS' && json.url) { + successHandler(json); + } else { + errorHandler(json.state); + } + } catch (er) { + errorHandler(me.getLang('autoupload.loadError')); + } + }); + xhr.send(fd); + } + + function getPasteImage(e) { + return e.clipboardData && e.clipboardData.items && e.clipboardData.items.length == 1 && /^image\//.test(e.clipboardData.items[0].type) ? e.clipboardData.items : null; + } + + function getDropImage(e) { + return e.dataTransfer && e.dataTransfer.files ? e.dataTransfer.files : null; + } + + return { + outputRule: function (root) { + utils.each(root.getNodesByTagName('img'), function (n) { + if (/\b(loaderrorclass)|(bloaderrorclass)\b/.test(n.getAttr('class'))) { + n.parentNode.removeChild(n); + } + }); + utils.each(root.getNodesByTagName('p'), function (n) { + if (/\bloadpara\b/.test(n.getAttr('class'))) { + n.parentNode.removeChild(n); + } + }); + }, + bindEvents: { + //插入粘贴板的图片,拖放插入图片 + 'ready': function (e) { + var me = this; + if (window.FormData && window.FileReader) { + domUtils.on(me.body, 'paste drop', function (e) { + var hasImg = false, + items; + //获取粘贴板文件列表或者拖放文件列表 + items = e.type == 'paste' ? getPasteImage(e) : getDropImage(e); + if (items) { + var len = items.length, + file; + while (len--) { + file = items[len]; + if (file.getAsFile) file = file.getAsFile(); + if (file && file.size > 0) { + sendAndInsertFile(file, me); + hasImg = true; + } + } + hasImg && e.preventDefault(); + } + + }); + //取消拖放图片时出现的文字光标位置提示 + domUtils.on(me.body, 'dragover', function (e) { + if (e.dataTransfer.types[0] == 'Files') { + e.preventDefault(); + } + }); + + //设置loading的样式 + utils.cssRule('loading', + '.loadingclass{display:inline-block;cursor:default;background: url(\'' + + this.options.themePath + + this.options.theme + '/images/loading.gif\') no-repeat center center transparent;border:1px solid #cccccc;margin-left:1px;height: 22px;width: 22px;}\n' + + '.loaderrorclass{display:inline-block;cursor:default;background: url(\'' + + this.options.themePath + + this.options.theme + '/images/loaderror.png\') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;' + + '}', + this.document); + } + } + } + } + }); + +// plugins/autosave.js + UE.plugin.register('autosave', function () { + + var me = this, + //无限循环保护 + lastSaveTime = new Date(), + //最小保存间隔时间 + MIN_TIME = 20, + //auto save key + saveKey = null; + + function save(editor) { + + var saveData; + + if (new Date() - lastSaveTime < MIN_TIME) { + return; + } + + if (!editor.hasContents()) { + //这里不能调用命令来删除, 会造成事件死循环 + saveKey && me.removePreferences(saveKey); + return; + } + + lastSaveTime = new Date(); + + editor._saveFlag = null; + + saveData = me.body.innerHTML; + + if (editor.fireEvent("beforeautosave", { + content: saveData + }) === false) { + return; + } + + me.setPreferences(saveKey, saveData); + + editor.fireEvent("afterautosave", { + content: saveData + }); + + } + + return { + defaultOptions: { + //默认间隔时间 + saveInterval: 500 + }, + bindEvents: { + 'ready': function () { + + var _suffix = "-drafts-data", + key = null; + + if (me.key) { + key = me.key + _suffix; + } else { + key = (me.container.parentNode.id || 'ue-common') + _suffix; + } + + //页面地址+编辑器ID 保持唯一 + saveKey = (location.protocol + location.host + location.pathname).replace(/[.:\/]/g, '_') + key; + + }, + + 'contentchange': function () { + + if (!saveKey) { + return; + } + + if (me._saveFlag) { + window.clearTimeout(me._saveFlag); + } + + if (me.options.saveInterval > 0) { + + me._saveFlag = window.setTimeout(function () { + + save(me); + + }, me.options.saveInterval); + + } else { + + save(me); + + } + + + } + }, + commands: { + 'clearlocaldata': { + execCommand: function (cmd, name) { + if (saveKey && me.getPreferences(saveKey)) { + me.removePreferences(saveKey) + } + }, + notNeedUndo: true, + ignoreContentChange: true + }, + + 'getlocaldata': { + execCommand: function (cmd, name) { + return saveKey ? me.getPreferences(saveKey) || '' : ''; + }, + notNeedUndo: true, + ignoreContentChange: true + }, + + 'drafts': { + execCommand: function (cmd, name) { + if (saveKey) { + me.body.innerHTML = me.getPreferences(saveKey) || '

      ' + domUtils.fillHtml + '

      '; + me.focus(true); + } + }, + queryCommandState: function () { + return saveKey ? (me.getPreferences(saveKey) === null ? -1 : 0) : -1; + }, + notNeedUndo: true, + ignoreContentChange: true + } + } + } + + }); + +// plugins/charts.js + UE.plugin.register('charts', function () { + + var me = this; + + return { + bindEvents: { + 'chartserror': function () { + } + }, + commands: { + 'charts': { + execCommand: function (cmd, data) { + + var tableNode = domUtils.findParentByTagName(this.selection.getRange().startContainer, 'table', true), + flagText = [], + config = {}; + + if (!tableNode) { + return false; + } + + if (!validData(tableNode)) { + me.fireEvent("chartserror"); + return false; + } + + config.title = data.title || ''; + config.subTitle = data.subTitle || ''; + config.xTitle = data.xTitle || ''; + config.yTitle = data.yTitle || ''; + config.suffix = data.suffix || ''; + config.tip = data.tip || ''; + //数据对齐方式 + config.dataFormat = data.tableDataFormat || ''; + //图表类型 + config.chartType = data.chartType || 0; + + for (var key in config) { + + if (!config.hasOwnProperty(key)) { + continue; + } + + flagText.push(key + ":" + config[key]); + + } + + tableNode.setAttribute("data-chart", flagText.join(";")); + domUtils.addClass(tableNode, "edui-charts-table"); + + + }, + queryCommandState: function (cmd, name) { + + var tableNode = domUtils.findParentByTagName(this.selection.getRange().startContainer, 'table', true); + return tableNode && validData(tableNode) ? 0 : -1; + + } + } + }, + inputRule: function (root) { + utils.each(root.getNodesByTagName('table'), function (tableNode) { + + if (tableNode.getAttr("data-chart") !== undefined) { + tableNode.setAttr("style"); + } + + }) + + }, + outputRule: function (root) { + utils.each(root.getNodesByTagName('table'), function (tableNode) { + + if (tableNode.getAttr("data-chart") !== undefined) { + tableNode.setAttr("style", "display: none;"); + } + + }) + + } + } + + function validData(table) { + + var firstRows = null, + cellCount = 0; + + //行数不够 + if (table.rows.length < 2) { + return false; + } + + //列数不够 + if (table.rows[0].cells.length < 2) { + return false; + } + + //第一行所有cell必须是th + firstRows = table.rows[0].cells; + cellCount = firstRows.length; + + for (var i = 0, cell; cell = firstRows[i]; i++) { + + if (cell.tagName.toLowerCase() !== 'th') { + return false; + } + + } + + for (var i = 1, row; row = table.rows[i]; i++) { + + //每行单元格数不匹配, 返回false + if (row.cells.length != cellCount) { + return false; + } + + //第一列不是th也返回false + if (row.cells[0].tagName.toLowerCase() !== 'th') { + return false; + } + + for (var j = 1, cell; cell = row.cells[j]; j++) { + + var value = utils.trim((cell.innerText || cell.textContent || '')); + + value = value.replace(new RegExp(UE.dom.domUtils.fillChar, 'g'), '').replace(/^\s+|\s+$/g, ''); + + //必须是数字 + if (!/^\d*\.?\d+$/.test(value)) { + return false; + } + + } + + } + + return true; + + } + + }); + +// plugins/section.js + /** + * 目录大纲支持插件 + * @file + * @since 1.3.0 + */ + UE.plugin.register('section', function () { + /* 目录节点对象 */ + function Section(option) { + this.tag = ''; + this.level = -1, + this.dom = null; + this.nextSection = null; + this.previousSection = null; + this.parentSection = null; + this.startAddress = []; + this.endAddress = []; + this.children = []; + } + + function getSection(option) { + var section = new Section(); + return utils.extend(section, option); + } + + function getNodeFromAddress(startAddress, root) { + var current = root; + for (var i = 0; i < startAddress.length; i++) { + if (!current.childNodes) return null; + current = current.childNodes[startAddress[i]]; + } + return current; + } + + var me = this; + + return { + bindMultiEvents: { + type: 'aftersetcontent afterscencerestore', + handler: function () { + me.fireEvent('updateSections'); + } + }, + bindEvents: { + /* 初始化、拖拽、粘贴、执行setcontent之后 */ + 'ready': function () { + me.fireEvent('updateSections'); + domUtils.on(me.body, 'drop paste', function () { + me.fireEvent('updateSections'); + }); + }, + /* 执行paragraph命令之后 */ + 'afterexeccommand': function (type, cmd) { + if (cmd == 'paragraph') { + me.fireEvent('updateSections'); + } + }, + /* 部分键盘操作,触发updateSections事件 */ + 'keyup': function (type, e) { + var me = this, + range = me.selection.getRange(); + if (range.collapsed != true) { + me.fireEvent('updateSections'); + } else { + var keyCode = e.keyCode || e.which; + if (keyCode == 13 || keyCode == 8 || keyCode == 46) { + me.fireEvent('updateSections'); + } + } + } + }, + commands: { + 'getsections': { + execCommand: function (cmd, levels) { + var levelFn = levels || ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']; + + for (var i = 0; i < levelFn.length; i++) { + if (typeof levelFn[i] == 'string') { + levelFn[i] = function (fn) { + return function (node) { + return node.tagName == fn.toUpperCase() + }; + }(levelFn[i]); + } else if (typeof levelFn[i] != 'function') { + levelFn[i] = function (node) { + return null; + } + } + } + + function getSectionLevel(node) { + for (var i = 0; i < levelFn.length; i++) { + if (levelFn[i](node)) return i; + } + return -1; + } + + var me = this, + Directory = getSection({'level': -1, 'title': 'root'}), + previous = Directory; + + function traversal(node, Directory) { + var level, + tmpSection = null, + parent, + child, + children = node.childNodes; + for (var i = 0, len = children.length; i < len; i++) { + child = children[i]; + level = getSectionLevel(child); + if (level >= 0) { + var address = me.selection.getRange().selectNode(child).createAddress(true).startAddress, + current = getSection({ + 'tag': child.tagName, + 'title': child.innerText || child.textContent || '', + 'level': level, + 'dom': child, + 'startAddress': utils.clone(address, []), + 'endAddress': utils.clone(address, []), + 'children': [] + }); + previous.nextSection = current; + current.previousSection = previous; + parent = previous; + while (level <= parent.level) { + parent = parent.parentSection; + } + current.parentSection = parent; + parent.children.push(current); + tmpSection = previous = current; + } else { + child.nodeType === 1 && traversal(child, Directory); + tmpSection && tmpSection.endAddress[tmpSection.endAddress.length - 1]++; + } + } + } + + traversal(me.body, Directory); + return Directory; + }, + notNeedUndo: true + }, + 'movesection': { + execCommand: function (cmd, sourceSection, targetSection, isAfter) { + + var me = this, + targetAddress, + target; + + if (!sourceSection || !targetSection || targetSection.level == -1) return; + + targetAddress = isAfter ? targetSection.endAddress : targetSection.startAddress; + target = getNodeFromAddress(targetAddress, me.body); + + /* 判断目标地址是否被源章节包含 */ + if (!targetAddress || !target || isContainsAddress(sourceSection.startAddress, sourceSection.endAddress, targetAddress)) return; + + var startNode = getNodeFromAddress(sourceSection.startAddress, me.body), + endNode = getNodeFromAddress(sourceSection.endAddress, me.body), + current, + nextNode; + + if (isAfter) { + current = endNode; + while (current && !(domUtils.getPosition(startNode, current) & domUtils.POSITION_FOLLOWING)) { + nextNode = current.previousSibling; + domUtils.insertAfter(target, current); + if (current == startNode) break; + current = nextNode; + } + } else { + current = startNode; + while (current && !(domUtils.getPosition(current, endNode) & domUtils.POSITION_FOLLOWING)) { + nextNode = current.nextSibling; + target.parentNode.insertBefore(current, target); + if (current == endNode) break; + current = nextNode; + } + } + + me.fireEvent('updateSections'); + + /* 获取地址的包含关系 */ + function isContainsAddress(startAddress, endAddress, addressTarget) { + var isAfterStartAddress = false, + isBeforeEndAddress = false; + for (var i = 0; i < startAddress.length; i++) { + if (i >= addressTarget.length) break; + if (addressTarget[i] > startAddress[i]) { + isAfterStartAddress = true; + break; + } else if (addressTarget[i] < startAddress[i]) { + break; + } + } + for (var i = 0; i < endAddress.length; i++) { + if (i >= addressTarget.length) break; + if (addressTarget[i] < startAddress[i]) { + isBeforeEndAddress = true; + break; + } else if (addressTarget[i] > startAddress[i]) { + break; + } + } + return isAfterStartAddress && isBeforeEndAddress; + } + } + }, + 'deletesection': { + execCommand: function (cmd, section, keepChildren) { + var me = this; + + if (!section) return; + + function getNodeFromAddress(startAddress) { + var current = me.body; + for (var i = 0; i < startAddress.length; i++) { + if (!current.childNodes) return null; + current = current.childNodes[startAddress[i]]; + } + return current; + } + + var startNode = getNodeFromAddress(section.startAddress), + endNode = getNodeFromAddress(section.endAddress), + current = startNode, + nextNode; + + if (!keepChildren) { + while (current && domUtils.inDoc(endNode, me.document) && !(domUtils.getPosition(current, endNode) & domUtils.POSITION_FOLLOWING)) { + nextNode = current.nextSibling; + domUtils.remove(current); + current = nextNode; + } + } else { + domUtils.remove(current); + } + + me.fireEvent('updateSections'); + } + }, + 'selectsection': { + execCommand: function (cmd, section) { + if (!section && !section.dom) return false; + var me = this, + range = me.selection.getRange(), + address = { + 'startAddress': utils.clone(section.startAddress, []), + 'endAddress': utils.clone(section.endAddress, []) + }; + address.endAddress[address.endAddress.length - 1]++; + range.moveToAddress(address).select().scrollToView(); + return true; + }, + notNeedUndo: true + }, + 'scrolltosection': { + execCommand: function (cmd, section) { + if (!section && !section.dom) return false; + var me = this, + range = me.selection.getRange(), + address = { + 'startAddress': section.startAddress, + 'endAddress': section.endAddress + }; + address.endAddress[address.endAddress.length - 1]++; + range.moveToAddress(address).scrollToView(); + return true; + }, + notNeedUndo: true + } + } + } + }); + +// plugins/simpleupload.js + /** + * @description + * 简单上传:点击按钮,直接选择文件上传 + * @author Jinqn + * @date 2014-03-31 + */ + UE.plugin.register('simpleupload', function () { + var me = this, + isLoaded = false, + containerBtn; + + function initUploadBtn() { + var w = containerBtn.offsetWidth || 20, + h = containerBtn.offsetHeight || 20, + btnIframe = document.createElement('iframe'), + btnStyle = 'display:block;width:' + w + 'px;height:' + h + 'px;overflow:hidden;border:0;margin:0;padding:0;position:absolute;top:0;left:0;filter:alpha(opacity=0);-moz-opacity:0;-khtml-opacity: 0;opacity: 0;cursor:pointer;'; + + domUtils.on(btnIframe, 'load', function () { + + var timestrap = (+new Date()).toString(36), + wrapper, + btnIframeDoc, + btnIframeBody; + + btnIframeDoc = (btnIframe.contentDocument || btnIframe.contentWindow.document); + btnIframeBody = btnIframeDoc.body; + wrapper = btnIframeDoc.createElement('div'); + + wrapper.innerHTML = '
      ' + + '' + + '
      ' + + ''; + + wrapper.className = 'edui-' + me.options.theme; + wrapper.id = me.ui.id + '_iframeupload'; + btnIframeBody.style.cssText = btnStyle; + btnIframeBody.style.width = w + 'px'; + btnIframeBody.style.height = h + 'px'; + btnIframeBody.appendChild(wrapper); + + if (btnIframeBody.parentNode) { + btnIframeBody.parentNode.style.width = w + 'px'; + btnIframeBody.parentNode.style.height = w + 'px'; + } + + var form = btnIframeDoc.getElementById('edui_form_' + timestrap); + var input = btnIframeDoc.getElementById('edui_input_' + timestrap); + var iframe = btnIframeDoc.getElementById('edui_iframe_' + timestrap); + + domUtils.on(input, 'change', function () { + if (!input.value) return; + var loadingId = 'loading_' + (+new Date()).toString(36); + var params = utils.serializeParam(me.queryCommandValue('serverparam')) || ''; + + var imageActionUrl = me.getActionUrl(me.getOpt('imageActionName')); + var allowFiles = me.getOpt('imageAllowFiles'); + + me.focus(); + me.execCommand('inserthtml', ''); + + function callback() { + try { + var link, json, loader, + body = (iframe.contentDocument || iframe.contentWindow.document).body, + result = body.innerText || body.textContent || ''; + json = (new Function("return " + result))(); + link = me.options.imageUrlPrefix + json.url; + if (json.state == 'SUCCESS' && json.url) { + loader = me.document.getElementById(loadingId); + loader.setAttribute('src', link); + loader.setAttribute('_src', link); + loader.setAttribute('title', json.title || ''); + loader.setAttribute('alt', json.original || ''); + loader.removeAttribute('id'); + domUtils.removeClasses(loader, 'loadingclass'); + } else { + showErrorLoader && showErrorLoader(json.state); + } + } catch (er) { + showErrorLoader && showErrorLoader(me.getLang('simpleupload.loadError')); + } + form.reset(); + domUtils.un(iframe, 'load', callback); + } + + function showErrorLoader(title) { + if (loadingId) { + var loader = me.document.getElementById(loadingId); + loader && domUtils.remove(loader); + me.fireEvent('showmessage', { + 'id': loadingId, + 'content': title, + 'type': 'error', + 'timeout': 4000 + }); + } + } + + /* 判断后端配置是否没有加载成功 */ + if (!me.getOpt('imageActionName')) { + errorHandler(me.getLang('autoupload.errorLoadConfig')); + return; + } + // 判断文件格式是否错误 + var filename = input.value, + fileext = filename ? filename.substr(filename.lastIndexOf('.')) : ''; + if (!fileext || (allowFiles && (allowFiles.join('') + '.').indexOf(fileext.toLowerCase() + '.') == -1)) { + showErrorLoader(me.getLang('simpleupload.exceedTypeError')); + return; + } + + domUtils.on(iframe, 'load', callback); + form.action = utils.formatUrl(imageActionUrl + (imageActionUrl.indexOf('?') == -1 ? '?' : '&') + params); + form.submit(); + }); + + var stateTimer; + me.addListener('selectionchange', function () { + clearTimeout(stateTimer); + stateTimer = setTimeout(function () { + var state = me.queryCommandState('simpleupload'); + if (state == -1) { + input.disabled = 'disabled'; + } else { + input.disabled = false; + } + }, 400); + }); + isLoaded = true; + }); + + btnIframe.style.cssText = btnStyle; + containerBtn.appendChild(btnIframe); + } + + return { + bindEvents: { + 'ready': function () { + //设置loading的样式 + utils.cssRule('loading', + '.loadingclass{display:inline-block;cursor:default;background: url(\'' + + this.options.themePath + + this.options.theme + '/images/loading.gif\') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}\n' + + '.loaderrorclass{display:inline-block;cursor:default;background: url(\'' + + this.options.themePath + + this.options.theme + '/images/loaderror.png\') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;' + + '}', + this.document); + }, + /* 初始化简单上传按钮 */ + 'simpleuploadbtnready': function (type, container) { + containerBtn = container; + me.afterConfigReady(initUploadBtn); + } + }, + outputRule: function (root) { + utils.each(root.getNodesByTagName('img'), function (n) { + if (/\b(loaderrorclass)|(bloaderrorclass)\b/.test(n.getAttr('class'))) { + n.parentNode.removeChild(n); + } + }); + }, + commands: { + 'simpleupload': { + queryCommandState: function () { + return isLoaded ? 0 : -1; + } + } + } + } + }); + +// plugins/serverparam.js + /** + * 服务器提交的额外参数列表设置插件 + * @file + * @since 1.2.6.1 + */ + UE.plugin.register('serverparam', function () { + + var me = this, + serverParam = {}; + + return { + commands: { + /** + * 修改服务器提交的额外参数列表,清除所有项 + * @command serverparam + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand('serverparam'); + * editor.queryCommandValue('serverparam'); //返回空 + * ``` + */ + /** + * 修改服务器提交的额外参数列表,删除指定项 + * @command serverparam + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } key 要清除的属性 + * @example + * ```javascript + * editor.execCommand('serverparam', 'name'); //删除属性name + * ``` + */ + /** + * 修改服务器提交的额外参数列表,使用键值添加项 + * @command serverparam + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } key 要添加的属性 + * @param { String } value 要添加属性的值 + * @example + * ```javascript + * editor.execCommand('serverparam', 'name', 'hello'); + * editor.queryCommandValue('serverparam'); //返回对象 {'name': 'hello'} + * ``` + */ + /** + * 修改服务器提交的额外参数列表,传入键值对对象添加多项 + * @command serverparam + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Object } key 传入的键值对对象 + * @example + * ```javascript + * editor.execCommand('serverparam', {'name': 'hello'}); + * editor.queryCommandValue('serverparam'); //返回对象 {'name': 'hello'} + * ``` + */ + /** + * 修改服务器提交的额外参数列表,使用自定义函数添加多项 + * @command serverparam + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Function } key 自定义获取参数的函数 + * @example + * ```javascript + * editor.execCommand('serverparam', function(editor){ + * return {'key': 'value'}; + * }); + * editor.queryCommandValue('serverparam'); //返回对象 {'key': 'value'} + * ``` + */ + + /** + * 获取服务器提交的额外参数列表 + * @command serverparam + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.queryCommandValue( 'serverparam' ); //返回对象 {'key': 'value'} + * ``` + */ + 'serverparam': { + execCommand: function (cmd, key, value) { + if (key === undefined || key === null) { //不传参数,清空列表 + serverParam = {}; + } else if (utils.isString(key)) { //传入键值 + if (value === undefined || value === null) { + delete serverParam[key]; + } else { + serverParam[key] = value; + } + } else if (utils.isObject(key)) { //传入对象,覆盖列表项 + utils.extend(serverParam, key, true); + } else if (utils.isFunction(key)) { //传入函数,添加列表项 + utils.extend(serverParam, key(), true); + } + }, + queryCommandValue: function () { + return serverParam || {}; + } + } + } + } + }); + + +// plugins/insertfile.js + /** + * 插入附件 + */ + UE.plugin.register('insertfile', function () { + + var me = this; + + function getFileIcon(url) { + var ext = url.substr(url.lastIndexOf('.') + 1).toLowerCase(), + maps = { + "rar": "icon_rar.gif", + "zip": "icon_rar.gif", + "tar": "icon_rar.gif", + "gz": "icon_rar.gif", + "bz2": "icon_rar.gif", + "doc": "icon_doc.gif", + "docx": "icon_doc.gif", + "pdf": "icon_pdf.gif", + "mp3": "icon_mp3.gif", + "xls": "icon_xls.gif", + "chm": "icon_chm.gif", + "ppt": "icon_ppt.gif", + "pptx": "icon_ppt.gif", + "avi": "icon_mv.gif", + "rmvb": "icon_mv.gif", + "wmv": "icon_mv.gif", + "flv": "icon_mv.gif", + "swf": "icon_mv.gif", + "rm": "icon_mv.gif", + "exe": "icon_exe.gif", + "psd": "icon_psd.gif", + "txt": "icon_txt.gif", + "jpg": "icon_jpg.gif", + "png": "icon_jpg.gif", + "jpeg": "icon_jpg.gif", + "gif": "icon_jpg.gif", + "ico": "icon_jpg.gif", + "bmp": "icon_jpg.gif" + }; + return maps[ext] ? maps[ext] : maps['txt']; + } + + return { + commands: { + 'insertfile': { + execCommand: function (command, filelist) { + filelist = utils.isArray(filelist) ? filelist : [filelist]; + + var i, item, icon, title, + html = '', + URL = me.getOpt('UEDITOR_HOME_URL'), + iconDir = URL + (URL.substr(URL.length - 1) == '/' ? '' : '/') + 'dialogs/attachment/fileTypeImages/'; + for (i = 0; i < filelist.length; i++) { + item = filelist[i]; + icon = iconDir + getFileIcon(item.url); + title = item.title || item.url.substr(item.url.lastIndexOf('/') + 1); + html += '

      ' + + '' + + '' + title + '' + + '

      '; + } + me.execCommand('insertHtml', html); + } + } + } + } + }); + + +// plugins/xssFilter.js + /** + * @file xssFilter.js + * @desc xss过滤器 + * @author robbenmu + */ + + UE.plugins.xssFilter = function () { + + var config = UEDITOR_CONFIG; + var whitList = config.whitList; + + function filter(node) { + + var tagName = node.tagName; + var attrs = node.attrs; + + if (!whitList.hasOwnProperty(tagName)) { + node.parentNode.removeChild(node); + return false; + } + + UE.utils.each(attrs, function (val, key) { + + if (whitList[tagName].indexOf(key) === -1) { + node.setAttr(key); + } + }); + } + + // 添加inserthtml\paste等操作用的过滤规则 + if (whitList && config.xssFilterRules) { + this.options.filterRules = function () { + + var result = {}; + + UE.utils.each(whitList, function (val, key) { + result[key] = function (node) { + return filter(node); + }; + }); + + return result; + }(); + } + + var tagList = []; + + UE.utils.each(whitList, function (val, key) { + tagList.push(key); + }); + + // 添加input过滤规则 + // + if (whitList && config.inputXssFilter) { + this.addInputRule(function (root) { + + root.traversal(function (node) { + if (node.type !== 'element') { + return false; + } + filter(node); + }); + }); + } + // 添加output过滤规则 + // + if (whitList && config.outputXssFilter) { + this.addOutputRule(function (root) { + + root.traversal(function (node) { + if (node.type !== 'element') { + return false; + } + filter(node); + }); + }); + } + + }; + + +// ui/ui.js + var baidu = baidu || {}; + baidu.editor = baidu.editor || {}; + UE.ui = baidu.editor.ui = {}; + +// ui/uiutils.js + (function () { + var browser = baidu.editor.browser, + domUtils = baidu.editor.dom.domUtils; + + var magic = '$EDITORUI'; + var root = window[magic] = {}; + var uidMagic = 'ID' + magic; + var uidCount = 0; + + var uiUtils = baidu.editor.ui.uiUtils = { + uid: function (obj) { + return (obj ? obj[uidMagic] || (obj[uidMagic] = ++uidCount) : ++uidCount); + }, + hook: function (fn, callback) { + var dg; + if (fn && fn._callbacks) { + dg = fn; + } else { + dg = function () { + var q; + if (fn) { + q = fn.apply(this, arguments); + } + var callbacks = dg._callbacks; + var k = callbacks.length; + while (k--) { + var r = callbacks[k].apply(this, arguments); + if (q === undefined) { + q = r; + } + } + return q; + }; + dg._callbacks = []; + } + dg._callbacks.push(callback); + return dg; + }, + createElementByHtml: function (html) { + var el = document.createElement('div'); + el.innerHTML = html; + el = el.firstChild; + el.parentNode.removeChild(el); + return el; + }, + getViewportElement: function () { + return (browser.ie && browser.quirks) ? + document.body : document.documentElement; + }, + getClientRect: function (element) { + var bcr; + //trace IE6下在控制编辑器显隐时可能会报错,catch一下 + try { + bcr = element.getBoundingClientRect(); + } catch (e) { + bcr = {left: 0, top: 0, height: 0, width: 0} + } + var rect = { + left: Math.round(bcr.left), + top: Math.round(bcr.top), + height: Math.round(bcr.bottom - bcr.top), + width: Math.round(bcr.right - bcr.left) + }; + var doc; + while ((doc = element.ownerDocument) !== document && + (element = domUtils.getWindow(doc).frameElement)) { + bcr = element.getBoundingClientRect(); + rect.left += bcr.left; + rect.top += bcr.top; + } + rect.bottom = rect.top + rect.height; + rect.right = rect.left + rect.width; + return rect; + }, + getViewportRect: function () { + var viewportEl = uiUtils.getViewportElement(); + var width = (window.innerWidth || viewportEl.clientWidth) | 0; + var height = (window.innerHeight || viewportEl.clientHeight) | 0; + return { + left: 0, + top: 0, + height: height, + width: width, + bottom: height, + right: width + }; + }, + setViewportOffset: function (element, offset) { + var rect; + var fixedLayer = uiUtils.getFixedLayer(); + if (element.parentNode === fixedLayer) { + element.style.left = offset.left + 'px'; + element.style.top = offset.top + 'px'; + } else { + domUtils.setViewportOffset(element, offset); + } + }, + getEventOffset: function (evt) { + var el = evt.target || evt.srcElement; + var rect = uiUtils.getClientRect(el); + var offset = uiUtils.getViewportOffsetByEvent(evt); + return { + left: offset.left - rect.left, + top: offset.top - rect.top + }; + }, + getViewportOffsetByEvent: function (evt) { + var el = evt.target || evt.srcElement; + var frameEl = domUtils.getWindow(el).frameElement; + var offset = { + left: evt.clientX, + top: evt.clientY + }; + if (frameEl && el.ownerDocument !== document) { + var rect = uiUtils.getClientRect(frameEl); + offset.left += rect.left; + offset.top += rect.top; + } + return offset; + }, + setGlobal: function (id, obj) { + root[id] = obj; + return magic + '["' + id + '"]'; + }, + unsetGlobal: function (id) { + delete root[id]; + }, + copyAttributes: function (tgt, src) { + var attributes = src.attributes; + var k = attributes.length; + while (k--) { + var attrNode = attributes[k]; + if (attrNode.nodeName != 'style' && attrNode.nodeName != 'class' && (!browser.ie || attrNode.specified)) { + tgt.setAttribute(attrNode.nodeName, attrNode.nodeValue); + } + } + if (src.className) { + domUtils.addClass(tgt, src.className); + } + if (src.style.cssText) { + tgt.style.cssText += ';' + src.style.cssText; + } + }, + removeStyle: function (el, styleName) { + if (el.style.removeProperty) { + el.style.removeProperty(styleName); + } else if (el.style.removeAttribute) { + el.style.removeAttribute(styleName); + } else throw ''; + }, + contains: function (elA, elB) { + return elA && elB && (elA === elB ? false : ( + elA.contains ? elA.contains(elB) : + elA.compareDocumentPosition(elB) & 16 + )); + }, + startDrag: function (evt, callbacks, doc) { + var doc = doc || document; + var startX = evt.clientX; + var startY = evt.clientY; + + function handleMouseMove(evt) { + var x = evt.clientX - startX; + var y = evt.clientY - startY; + callbacks.ondragmove(x, y, evt); + if (evt.stopPropagation) { + evt.stopPropagation(); + } else { + evt.cancelBubble = true; + } + } + + if (doc.addEventListener) { + function handleMouseUp(evt) { + doc.removeEventListener('mousemove', handleMouseMove, true); + doc.removeEventListener('mouseup', handleMouseUp, true); + window.removeEventListener('mouseup', handleMouseUp, true); + callbacks.ondragstop(); + } + + doc.addEventListener('mousemove', handleMouseMove, true); + doc.addEventListener('mouseup', handleMouseUp, true); + window.addEventListener('mouseup', handleMouseUp, true); + + evt.preventDefault(); + } else { + var elm = evt.srcElement; + elm.setCapture(); + + function releaseCaptrue() { + elm.releaseCapture(); + elm.detachEvent('onmousemove', handleMouseMove); + elm.detachEvent('onmouseup', releaseCaptrue); + elm.detachEvent('onlosecaptrue', releaseCaptrue); + callbacks.ondragstop(); + } + + elm.attachEvent('onmousemove', handleMouseMove); + elm.attachEvent('onmouseup', releaseCaptrue); + elm.attachEvent('onlosecaptrue', releaseCaptrue); + evt.returnValue = false; + } + callbacks.ondragstart(); + }, + getFixedLayer: function () { + var layer = document.getElementById('edui_fixedlayer'); + if (layer == null) { + layer = document.createElement('div'); + layer.id = 'edui_fixedlayer'; + document.body.appendChild(layer); + if (browser.ie && browser.version <= 8) { + layer.style.position = 'absolute'; + bindFixedLayer(); + setTimeout(updateFixedOffset); + } else { + layer.style.position = 'fixed'; + } + layer.style.left = '0'; + layer.style.top = '0'; + layer.style.width = '0'; + layer.style.height = '0'; + } + return layer; + }, + makeUnselectable: function (element) { + if (browser.opera || (browser.ie && browser.version < 9)) { + element.unselectable = 'on'; + if (element.hasChildNodes()) { + for (var i = 0; i < element.childNodes.length; i++) { + if (element.childNodes[i].nodeType == 1) { + uiUtils.makeUnselectable(element.childNodes[i]); + } + } + } + } else { + if (element.style.MozUserSelect !== undefined) { + element.style.MozUserSelect = 'none'; + } else if (element.style.WebkitUserSelect !== undefined) { + element.style.WebkitUserSelect = 'none'; + } else if (element.style.KhtmlUserSelect !== undefined) { + element.style.KhtmlUserSelect = 'none'; + } + } + } + }; + + function updateFixedOffset() { + var layer = document.getElementById('edui_fixedlayer'); + uiUtils.setViewportOffset(layer, { + left: 0, + top: 0 + }); +// layer.style.display = 'none'; +// layer.style.display = 'block'; + + //#trace: 1354 +// setTimeout(updateFixedOffset); + } + + function bindFixedLayer(adjOffset) { + domUtils.on(window, 'scroll', updateFixedOffset); + domUtils.on(window, 'resize', baidu.editor.utils.defer(updateFixedOffset, 0, true)); + } + })(); + + +// ui/uibase.js + (function () { + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + EventBase = baidu.editor.EventBase, + UIBase = baidu.editor.ui.UIBase = function () { + }; + + UIBase.prototype = { + className: '', + uiName: '', + initOptions: function (options) { + var me = this; + for (var k in options) { + me[k] = options[k]; + } + this.id = this.id || 'edui' + uiUtils.uid(); + }, + initUIBase: function () { + this._globalKey = utils.unhtml(uiUtils.setGlobal(this.id, this)); + }, + render: function (holder) { + var html = this.renderHtml(); + var el = uiUtils.createElementByHtml(html); + + //by xuheng 给每个node添加class + var list = domUtils.getElementsByTagName(el, "*"); + var theme = "edui-" + (this.theme || this.editor.options.theme); + var layer = document.getElementById('edui_fixedlayer'); + for (var i = 0, node; node = list[i++];) { + domUtils.addClass(node, theme); + } + domUtils.addClass(el, theme); + if (layer) { + layer.className = ""; + domUtils.addClass(layer, theme); + } + + var seatEl = this.getDom(); + if (seatEl != null) { + seatEl.parentNode.replaceChild(el, seatEl); + uiUtils.copyAttributes(el, seatEl); + } else { + if (typeof holder == 'string') { + holder = document.getElementById(holder); + } + holder = holder || uiUtils.getFixedLayer(); + domUtils.addClass(holder, theme); + holder.appendChild(el); + } + this.postRender(); + }, + getDom: function (name) { + if (!name) { + return document.getElementById(this.id); + } else { + return document.getElementById(this.id + '_' + name); + } + }, + postRender: function () { + this.fireEvent('postrender'); + }, + getHtmlTpl: function () { + return ''; + }, + formatHtml: function (tpl) { + var prefix = 'edui-' + this.uiName; + return (tpl + .replace(/##/g, this.id) + .replace(/%%-/g, this.uiName ? prefix + '-' : '') + .replace(/%%/g, (this.uiName ? prefix : '') + ' ' + this.className) + .replace(/\$\$/g, this._globalKey)); + }, + renderHtml: function () { + return this.formatHtml(this.getHtmlTpl()); + }, + dispose: function () { + var box = this.getDom(); + if (box) baidu.editor.dom.domUtils.remove(box); + uiUtils.unsetGlobal(this.id); + } + }; + utils.inherits(UIBase, EventBase); + })(); + + +// ui/separator.js + (function () { + var utils = baidu.editor.utils, + UIBase = baidu.editor.ui.UIBase, + Separator = baidu.editor.ui.Separator = function (options) { + this.initOptions(options); + this.initSeparator(); + }; + Separator.prototype = { + uiName: 'separator', + initSeparator: function () { + this.initUIBase(); + }, + getHtmlTpl: function () { + return '
      '; + } + }; + utils.inherits(Separator, UIBase); + + })(); + + +// ui/mask.js +///import core +///import uicore + (function () { + var utils = baidu.editor.utils, + domUtils = baidu.editor.dom.domUtils, + UIBase = baidu.editor.ui.UIBase, + uiUtils = baidu.editor.ui.uiUtils; + + var Mask = baidu.editor.ui.Mask = function (options) { + this.initOptions(options); + this.initUIBase(); + }; + Mask.prototype = { + getHtmlTpl: function () { + return '
      '; + }, + postRender: function () { + var me = this; + domUtils.on(window, 'resize', function () { + setTimeout(function () { + if (!me.isHidden()) { + me._fill(); + } + }); + }); + }, + show: function (zIndex) { + this._fill(); + this.getDom().style.display = ''; + this.getDom().style.zIndex = zIndex; + }, + hide: function () { + this.getDom().style.display = 'none'; + this.getDom().style.zIndex = ''; + }, + isHidden: function () { + return this.getDom().style.display == 'none'; + }, + _onMouseDown: function () { + return false; + }, + _onClick: function (e, target) { + this.fireEvent('click', e, target); + }, + _fill: function () { + var el = this.getDom(); + var vpRect = uiUtils.getViewportRect(); + el.style.width = vpRect.width + 'px'; + el.style.height = vpRect.height + 'px'; + } + }; + utils.inherits(Mask, UIBase); + })(); + + +// ui/popup.js +///import core +///import uicore + (function () { + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + domUtils = baidu.editor.dom.domUtils, + UIBase = baidu.editor.ui.UIBase, + Popup = baidu.editor.ui.Popup = function (options) { + this.initOptions(options); + this.initPopup(); + }; + + var allPopups = []; + + function closeAllPopup(evt, el) { + for (var i = 0; i < allPopups.length; i++) { + var pop = allPopups[i]; + if (!pop.isHidden()) { + if (pop.queryAutoHide(el) !== false) { + if (evt && /scroll/ig.test(evt.type) && pop.className == "edui-wordpastepop") return; + pop.hide(); + } + } + } + + if (allPopups.length) + pop.editor.fireEvent("afterhidepop"); + } + + Popup.postHide = closeAllPopup; + + var ANCHOR_CLASSES = ['edui-anchor-topleft', 'edui-anchor-topright', + 'edui-anchor-bottomleft', 'edui-anchor-bottomright']; + Popup.prototype = { + SHADOW_RADIUS: 5, + content: null, + _hidden: false, + autoRender: true, + canSideLeft: true, + canSideUp: true, + initPopup: function () { + this.initUIBase(); + allPopups.push(this); + }, + getHtmlTpl: function () { + return '
      ' + + '
      ' + + ' ' + + '
      ' + + '
      ' + + this.getContentHtmlTpl() + + '
      ' + + '
      ' + + '
      '; + }, + getContentHtmlTpl: function () { + if (this.content) { + if (typeof this.content == 'string') { + return this.content; + } + return this.content.renderHtml(); + } else { + return '' + } + + }, + _UIBase_postRender: UIBase.prototype.postRender, + postRender: function () { + + + if (this.content instanceof UIBase) { + this.content.postRender(); + } + + //捕获鼠标滚轮 + if (this.captureWheel && !this.captured) { + + this.captured = true; + + var winHeight = (document.documentElement.clientHeight || document.body.clientHeight) - 80, + _height = this.getDom().offsetHeight, + _top = uiUtils.getClientRect(this.combox.getDom()).top, + content = this.getDom('content'), + ifr = this.getDom('body').getElementsByTagName('iframe'), + me = this; + + ifr.length && (ifr = ifr[0]); + + while (_top + _height > winHeight) { + _height -= 30; + } + content.style.height = _height + 'px'; + //同步更改iframe高度 + ifr && (ifr.style.height = _height + 'px'); + + //阻止在combox上的鼠标滚轮事件, 防止用户的正常操作被误解 + if (window.XMLHttpRequest) { + + domUtils.on(content, ('onmousewheel' in document.body) ? 'mousewheel' : 'DOMMouseScroll', function (e) { + + if (e.preventDefault) { + e.preventDefault(); + } else { + e.returnValue = false; + } + + if (e.wheelDelta) { + + content.scrollTop -= (e.wheelDelta / 120) * 60; + + } else { + + content.scrollTop -= (e.detail / -3) * 60; + + } + + }); + + } else { + + //ie6 + domUtils.on(this.getDom(), 'mousewheel', function (e) { + + e.returnValue = false; + + me.getDom('content').scrollTop -= (e.wheelDelta / 120) * 60; + + }); + + } + + } + this.fireEvent('postRenderAfter'); + this.hide(true); + this._UIBase_postRender(); + }, + _doAutoRender: function () { + if (!this.getDom() && this.autoRender) { + this.render(); + } + }, + mesureSize: function () { + var box = this.getDom('content'); + return uiUtils.getClientRect(box); + }, + fitSize: function () { + if (this.captureWheel && this.sized) { + return this.__size; + } + this.sized = true; + var popBodyEl = this.getDom('body'); + popBodyEl.style.width = ''; + popBodyEl.style.height = ''; + var size = this.mesureSize(); + if (this.captureWheel) { + popBodyEl.style.width = -(-20 - size.width) + 'px'; + var height = parseInt(this.getDom('content').style.height, 10); + !window.isNaN(height) && (size.height = height); + } else { + popBodyEl.style.width = size.width + 'px'; + } + popBodyEl.style.height = size.height + 'px'; + this.__size = size; + this.captureWheel && (this.getDom('content').style.overflow = 'auto'); + return size; + }, + showAnchor: function (element, hoz) { + this.showAnchorRect(uiUtils.getClientRect(element), hoz); + }, + showAnchorRect: function (rect, hoz, adj) { + this._doAutoRender(); + var vpRect = uiUtils.getViewportRect(); + this.getDom().style.visibility = 'hidden'; + this._show(); + var popSize = this.fitSize(); + + var sideLeft, sideUp, left, top; + if (hoz) { + sideLeft = this.canSideLeft && (rect.right + popSize.width > vpRect.right && rect.left > popSize.width); + sideUp = this.canSideUp && (rect.top + popSize.height > vpRect.bottom && rect.bottom > popSize.height); + left = (sideLeft ? rect.left - popSize.width : rect.right); + top = (sideUp ? rect.bottom - popSize.height : rect.top); + } else { + sideLeft = this.canSideLeft && (rect.right + popSize.width > vpRect.right && rect.left > popSize.width); + sideUp = this.canSideUp && (rect.top + popSize.height > vpRect.bottom && rect.bottom > popSize.height); + left = (sideLeft ? rect.right - popSize.width : rect.left); + top = (sideUp ? rect.top - popSize.height : rect.bottom); + } + + var popEl = this.getDom(); + uiUtils.setViewportOffset(popEl, { + left: left, + top: top + }); + domUtils.removeClasses(popEl, ANCHOR_CLASSES); + popEl.className += ' ' + ANCHOR_CLASSES[(sideUp ? 1 : 0) * 2 + (sideLeft ? 1 : 0)]; + if (this.editor) { + popEl.style.zIndex = this.editor.container.style.zIndex * 1 + 10; + baidu.editor.ui.uiUtils.getFixedLayer().style.zIndex = popEl.style.zIndex - 1; + } + this.getDom().style.visibility = 'visible'; + + }, + showAt: function (offset) { + var left = offset.left; + var top = offset.top; + var rect = { + left: left, + top: top, + right: left, + bottom: top, + height: 0, + width: 0 + }; + this.showAnchorRect(rect, false, true); + }, + _show: function () { + if (this._hidden) { + var box = this.getDom(); + box.style.display = ''; + this._hidden = false; +// if (box.setActive) { +// box.setActive(); +// } + this.fireEvent('show'); + } + }, + isHidden: function () { + return this._hidden; + }, + show: function () { + this._doAutoRender(); + this._show(); + }, + hide: function (notNofity) { + if (!this._hidden && this.getDom()) { + this.getDom().style.display = 'none'; + this._hidden = true; + if (!notNofity) { + this.fireEvent('hide'); + } + } + }, + queryAutoHide: function (el) { + return !el || !uiUtils.contains(this.getDom(), el); + } + }; + utils.inherits(Popup, UIBase); + + domUtils.on(document, 'mousedown', function (evt) { + var el = evt.target || evt.srcElement; + closeAllPopup(evt, el); + }); + domUtils.on(window, 'scroll', function (evt, el) { + closeAllPopup(evt, el); + }); + + })(); + + +// ui/colorpicker.js +///import core +///import uicore + (function () { + var utils = baidu.editor.utils, + UIBase = baidu.editor.ui.UIBase, + ColorPicker = baidu.editor.ui.ColorPicker = function (options) { + this.initOptions(options); + this.noColorText = this.noColorText || this.editor.getLang("clearColor"); + this.initUIBase(); + }; + + ColorPicker.prototype = { + getHtmlTpl: function () { + return genColorPicker(this.noColorText, this.editor); + }, + _onTableClick: function (evt) { + var tgt = evt.target || evt.srcElement; + var color = tgt.getAttribute('data-color'); + if (color) { + this.fireEvent('pickcolor', color); + } + }, + _onTableOver: function (evt) { + var tgt = evt.target || evt.srcElement; + var color = tgt.getAttribute('data-color'); + if (color) { + this.getDom('preview').style.backgroundColor = color; + } + }, + _onTableOut: function () { + this.getDom('preview').style.backgroundColor = ''; + }, + _onPickNoColor: function () { + this.fireEvent('picknocolor'); + } + }; + utils.inherits(ColorPicker, UIBase); + + var COLORS = ( + 'ffffff,000000,eeece1,1f497d,4f81bd,c0504d,9bbb59,8064a2,4bacc6,f79646,' + + 'f2f2f2,7f7f7f,ddd9c3,c6d9f0,dbe5f1,f2dcdb,ebf1dd,e5e0ec,dbeef3,fdeada,' + + 'd8d8d8,595959,c4bd97,8db3e2,b8cce4,e5b9b7,d7e3bc,ccc1d9,b7dde8,fbd5b5,' + + 'bfbfbf,3f3f3f,938953,548dd4,95b3d7,d99694,c3d69b,b2a2c7,92cddc,fac08f,' + + 'a5a5a5,262626,494429,17365d,366092,953734,76923c,5f497a,31859b,e36c09,' + + '7f7f7f,0c0c0c,1d1b10,0f243e,244061,632423,4f6128,3f3151,205867,974806,' + + 'c00000,ff0000,ffc000,ffff00,92d050,00b050,00b0f0,0070c0,002060,7030a0,').split(','); + + function genColorPicker(noColorText, editor) { + var html = '
      ' + + '
      ' + + '
      ' + + '
      ' + noColorText + '
      ' + + '
      ' + + '' + + '' + + ''; + for (var i = 0; i < COLORS.length; i++) { + if (i && i % 10 === 0) { + html += '' + (i == 60 ? '' : '') + ''; + } + html += i < 70 ? '' : ''; + } + html += '
      ' + editor.getLang("themeColor") + '
      ' + editor.getLang("standardColor") + '
      '; + return html; + } + })(); + + +// ui/tablepicker.js +///import core +///import uicore + (function () { + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + UIBase = baidu.editor.ui.UIBase; + + var TablePicker = baidu.editor.ui.TablePicker = function (options) { + this.initOptions(options); + this.initTablePicker(); + }; + TablePicker.prototype = { + defaultNumRows: 10, + defaultNumCols: 10, + maxNumRows: 20, + maxNumCols: 20, + numRows: 10, + numCols: 10, + lengthOfCellSide: 22, + initTablePicker: function () { + this.initUIBase(); + }, + getHtmlTpl: function () { + var me = this; + return '
      ' + + '
      ' + + '
      ' + + '' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      '; + }, + _UIBase_render: UIBase.prototype.render, + render: function (holder) { + this._UIBase_render(holder); + this.getDom('label').innerHTML = '0' + this.editor.getLang("t_row") + ' x 0' + this.editor.getLang("t_col"); + }, + _track: function (numCols, numRows) { + var style = this.getDom('overlay').style; + var sideLen = this.lengthOfCellSide; + style.width = numCols * sideLen + 'px'; + style.height = numRows * sideLen + 'px'; + var label = this.getDom('label'); + label.innerHTML = numCols + this.editor.getLang("t_col") + ' x ' + numRows + this.editor.getLang("t_row"); + this.numCols = numCols; + this.numRows = numRows; + }, + _onMouseOver: function (evt, el) { + var rel = evt.relatedTarget || evt.fromElement; + if (!uiUtils.contains(el, rel) && el !== rel) { + this.getDom('label').innerHTML = '0' + this.editor.getLang("t_col") + ' x 0' + this.editor.getLang("t_row"); + this.getDom('overlay').style.visibility = ''; + } + }, + _onMouseOut: function (evt, el) { + var rel = evt.relatedTarget || evt.toElement; + if (!uiUtils.contains(el, rel) && el !== rel) { + this.getDom('label').innerHTML = '0' + this.editor.getLang("t_col") + ' x 0' + this.editor.getLang("t_row"); + this.getDom('overlay').style.visibility = 'hidden'; + } + }, + _onMouseMove: function (evt, el) { + var style = this.getDom('overlay').style; + var offset = uiUtils.getEventOffset(evt); + var sideLen = this.lengthOfCellSide; + var numCols = Math.ceil(offset.left / sideLen); + var numRows = Math.ceil(offset.top / sideLen); + this._track(numCols, numRows); + }, + _onClick: function () { + this.fireEvent('picktable', this.numCols, this.numRows); + } + }; + utils.inherits(TablePicker, UIBase); + })(); + + +// ui/stateful.js + (function () { + var browser = baidu.editor.browser, + domUtils = baidu.editor.dom.domUtils, + uiUtils = baidu.editor.ui.uiUtils; + + var TPL_STATEFUL = 'onmousedown="$$.Stateful_onMouseDown(event, this);"' + + ' onmouseup="$$.Stateful_onMouseUp(event, this);"' + + (browser.ie ? ( + ' onmouseenter="$$.Stateful_onMouseEnter(event, this);"' + + ' onmouseleave="$$.Stateful_onMouseLeave(event, this);"') + : ( + ' onmouseover="$$.Stateful_onMouseOver(event, this);"' + + ' onmouseout="$$.Stateful_onMouseOut(event, this);"')); + + baidu.editor.ui.Stateful = { + alwalysHoverable: false, + target: null,//目标元素和this指向dom不一样 + Stateful_init: function () { + this._Stateful_dGetHtmlTpl = this.getHtmlTpl; + this.getHtmlTpl = this.Stateful_getHtmlTpl; + }, + Stateful_getHtmlTpl: function () { + var tpl = this._Stateful_dGetHtmlTpl(); + // 使用function避免$转义 + return tpl.replace(/stateful/g, function () { + return TPL_STATEFUL; + }); + }, + Stateful_onMouseEnter: function (evt, el) { + this.target = el; + if (!this.isDisabled() || this.alwalysHoverable) { + this.addState('hover'); + this.fireEvent('over'); + } + }, + Stateful_onMouseLeave: function (evt, el) { + if (!this.isDisabled() || this.alwalysHoverable) { + this.removeState('hover'); + this.removeState('active'); + this.fireEvent('out'); + } + }, + Stateful_onMouseOver: function (evt, el) { + var rel = evt.relatedTarget; + if (!uiUtils.contains(el, rel) && el !== rel) { + this.Stateful_onMouseEnter(evt, el); + } + }, + Stateful_onMouseOut: function (evt, el) { + var rel = evt.relatedTarget; + if (!uiUtils.contains(el, rel) && el !== rel) { + this.Stateful_onMouseLeave(evt, el); + } + }, + Stateful_onMouseDown: function (evt, el) { + if (!this.isDisabled()) { + this.addState('active'); + } + }, + Stateful_onMouseUp: function (evt, el) { + if (!this.isDisabled()) { + this.removeState('active'); + } + }, + Stateful_postRender: function () { + if (this.disabled && !this.hasState('disabled')) { + this.addState('disabled'); + } + }, + hasState: function (state) { + return domUtils.hasClass(this.getStateDom(), 'edui-state-' + state); + }, + addState: function (state) { + if (!this.hasState(state)) { + this.getStateDom().className += ' edui-state-' + state; + } + }, + removeState: function (state) { + if (this.hasState(state)) { + domUtils.removeClasses(this.getStateDom(), ['edui-state-' + state]); + } + }, + getStateDom: function () { + return this.getDom('state'); + }, + isChecked: function () { + return this.hasState('checked'); + }, + setChecked: function (checked) { + if (!this.isDisabled() && checked) { + this.addState('checked'); + } else { + this.removeState('checked'); + } + }, + isDisabled: function () { + return this.hasState('disabled'); + }, + setDisabled: function (disabled) { + if (disabled) { + this.removeState('hover'); + this.removeState('checked'); + this.removeState('active'); + this.addState('disabled'); + } else { + this.removeState('disabled'); + } + } + }; + })(); + + +// ui/button.js +///import core +///import uicore +///import ui/stateful.js + (function () { + var utils = baidu.editor.utils, + UIBase = baidu.editor.ui.UIBase, + Stateful = baidu.editor.ui.Stateful, + Button = baidu.editor.ui.Button = function (options) { + if (options.name) { + var btnName = options.name; + var cssRules = options.cssRules; + if (!options.className) { + options.className = 'edui-for-' + btnName; + } + options.cssRules = '.edui-default .edui-for-' + btnName + ' .edui-icon {' + cssRules + '}' + } + this.initOptions(options); + this.initButton(); + }; + Button.prototype = { + uiName: 'button', + label: '', + title: '', + showIcon: true, + showText: true, + cssRules: '', + initButton: function () { + this.initUIBase(); + this.Stateful_init(); + if (this.cssRules) { + utils.cssRule('edui-customize-' + this.name + '-style', this.cssRules); + } + }, + getHtmlTpl: function () { + return '
      ' + + '
      ' + + '
      ' + + (this.showIcon ? '
      ' : '') + + (this.showText ? '
      ' + this.label + '
      ' : '') + + '
      ' + + '
      ' + + '
      '; + }, + postRender: function () { + this.Stateful_postRender(); + this.setDisabled(this.disabled) + }, + _onMouseDown: function (e) { + var target = e.target || e.srcElement, + tagName = target && target.tagName && target.tagName.toLowerCase(); + if (tagName == 'input' || tagName == 'object' || tagName == 'object') { + return false; + } + }, + _onClick: function () { + if (!this.isDisabled()) { + this.fireEvent('click'); + } + }, + setTitle: function (text) { + var label = this.getDom('label'); + label.innerHTML = text; + } + }; + utils.inherits(Button, UIBase); + utils.extend(Button.prototype, Stateful); + + })(); + + +// ui/splitbutton.js +///import core +///import uicore +///import ui/stateful.js + (function () { + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + domUtils = baidu.editor.dom.domUtils, + UIBase = baidu.editor.ui.UIBase, + Stateful = baidu.editor.ui.Stateful, + SplitButton = baidu.editor.ui.SplitButton = function (options) { + this.initOptions(options); + this.initSplitButton(); + }; + SplitButton.prototype = { + popup: null, + uiName: 'splitbutton', + title: '', + initSplitButton: function () { + this.initUIBase(); + this.Stateful_init(); + var me = this; + if (this.popup != null) { + var popup = this.popup; + this.popup = null; + this.setPopup(popup); + } + }, + _UIBase_postRender: UIBase.prototype.postRender, + postRender: function () { + this.Stateful_postRender(); + this._UIBase_postRender(); + }, + setPopup: function (popup) { + if (this.popup === popup) return; + if (this.popup != null) { + this.popup.dispose(); + } + popup.addListener('show', utils.bind(this._onPopupShow, this)); + popup.addListener('hide', utils.bind(this._onPopupHide, this)); + popup.addListener('postrender', utils.bind(function () { + popup.getDom('body').appendChild( + uiUtils.createElementByHtml('
      ') + ); + popup.getDom().className += ' ' + this.className; + }, this)); + this.popup = popup; + }, + _onPopupShow: function () { + this.addState('opened'); + }, + _onPopupHide: function () { + this.removeState('opened'); + }, + getHtmlTpl: function () { + return '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      '; + }, + showPopup: function () { + // 当popup往上弹出的时候,做特殊处理 + var rect = uiUtils.getClientRect(this.getDom()); + rect.top -= this.popup.SHADOW_RADIUS; + rect.height += this.popup.SHADOW_RADIUS; + this.popup.showAnchorRect(rect); + }, + _onArrowClick: function (event, el) { + if (!this.isDisabled()) { + this.showPopup(); + } + }, + _onButtonClick: function () { + if (!this.isDisabled()) { + this.fireEvent('buttonclick'); + } + } + }; + utils.inherits(SplitButton, UIBase); + utils.extend(SplitButton.prototype, Stateful, true); + + })(); + + +// ui/colorbutton.js +///import core +///import uicore +///import ui/colorpicker.js +///import ui/popup.js +///import ui/splitbutton.js + (function () { + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + ColorPicker = baidu.editor.ui.ColorPicker, + Popup = baidu.editor.ui.Popup, + SplitButton = baidu.editor.ui.SplitButton, + ColorButton = baidu.editor.ui.ColorButton = function (options) { + this.initOptions(options); + this.initColorButton(); + }; + ColorButton.prototype = { + initColorButton: function () { + var me = this; + this.popup = new Popup({ + content: new ColorPicker({ + noColorText: me.editor.getLang("clearColor"), + editor: me.editor, + onpickcolor: function (t, color) { + me._onPickColor(color); + }, + onpicknocolor: function (t, color) { + me._onPickNoColor(color); + } + }), + editor: me.editor + }); + this.initSplitButton(); + }, + _SplitButton_postRender: SplitButton.prototype.postRender, + postRender: function () { + this._SplitButton_postRender(); + this.getDom('button_body').appendChild( + uiUtils.createElementByHtml('
      ') + ); + this.getDom().className += ' edui-colorbutton'; + }, + setColor: function (color) { + this.getDom('colorlump').style.backgroundColor = color; + this.color = color; + }, + _onPickColor: function (color) { + if (this.fireEvent('pickcolor', color) !== false) { + this.setColor(color); + this.popup.hide(); + } + }, + _onPickNoColor: function (color) { + if (this.fireEvent('picknocolor') !== false) { + this.popup.hide(); + } + } + }; + utils.inherits(ColorButton, SplitButton); + + })(); + + +// ui/tablebutton.js +///import core +///import uicore +///import ui/popup.js +///import ui/tablepicker.js +///import ui/splitbutton.js + (function () { + var utils = baidu.editor.utils, + Popup = baidu.editor.ui.Popup, + TablePicker = baidu.editor.ui.TablePicker, + SplitButton = baidu.editor.ui.SplitButton, + TableButton = baidu.editor.ui.TableButton = function (options) { + this.initOptions(options); + this.initTableButton(); + }; + TableButton.prototype = { + initTableButton: function () { + var me = this; + this.popup = new Popup({ + content: new TablePicker({ + editor: me.editor, + onpicktable: function (t, numCols, numRows) { + me._onPickTable(numCols, numRows); + } + }), + 'editor': me.editor + }); + this.initSplitButton(); + }, + _onPickTable: function (numCols, numRows) { + if (this.fireEvent('picktable', numCols, numRows) !== false) { + this.popup.hide(); + } + } + }; + utils.inherits(TableButton, SplitButton); + + })(); + + +// ui/autotypesetpicker.js +///import core +///import uicore + (function () { + var utils = baidu.editor.utils, + UIBase = baidu.editor.ui.UIBase; + + var AutoTypeSetPicker = baidu.editor.ui.AutoTypeSetPicker = function (options) { + this.initOptions(options); + this.initAutoTypeSetPicker(); + }; + AutoTypeSetPicker.prototype = { + initAutoTypeSetPicker: function () { + this.initUIBase(); + }, + getHtmlTpl: function () { + var me = this.editor, + opt = me.options.autotypeset, + lang = me.getLang("autoTypeSet"); + + var textAlignInputName = 'textAlignValue' + me.uid, + imageBlockInputName = 'imageBlockLineValue' + me.uid, + symbolConverInputName = 'symbolConverValue' + me.uid; + + return '
      ' + + '
      ' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
      ' + lang.mergeLine + '' + lang.delLine + '
      ' + lang.removeFormat + '' + lang.indent + '
      ' + lang.alignment + '' + + '' + me.getLang("justifyleft") + + '' + me.getLang("justifycenter") + + '' + me.getLang("justifyright") + + '
      ' + lang.imageFloat + '' + + '' + me.getLang("default") + + '' + me.getLang("justifyleft") + + '' + me.getLang("justifycenter") + + '' + me.getLang("justifyright") + + '
      ' + lang.removeFontsize + '' + lang.removeFontFamily + '
      ' + lang.removeHtml + '
      ' + lang.pasteFilter + '
      ' + lang.symbol + '' + + '' + lang.bdc2sb + + '' + lang.tobdc + '' + + '
      ' + + '
      ' + + '
      '; + + + }, + _UIBase_render: UIBase.prototype.render + }; + utils.inherits(AutoTypeSetPicker, UIBase); + })(); + + +// ui/autotypesetbutton.js +///import core +///import uicore +///import ui/popup.js +///import ui/autotypesetpicker.js +///import ui/splitbutton.js + (function () { + var utils = baidu.editor.utils, + Popup = baidu.editor.ui.Popup, + AutoTypeSetPicker = baidu.editor.ui.AutoTypeSetPicker, + SplitButton = baidu.editor.ui.SplitButton, + AutoTypeSetButton = baidu.editor.ui.AutoTypeSetButton = function (options) { + this.initOptions(options); + this.initAutoTypeSetButton(); + }; + + function getPara(me) { + + var opt = {}, + cont = me.getDom(), + editorId = me.editor.uid, + inputType = null, + attrName = null, + ipts = domUtils.getElementsByTagName(cont, "input"); + for (var i = ipts.length - 1, ipt; ipt = ipts[i--];) { + inputType = ipt.getAttribute("type"); + if (inputType == "checkbox") { + attrName = ipt.getAttribute("name"); + opt[attrName] && delete opt[attrName]; + if (ipt.checked) { + var attrValue = document.getElementById(attrName + "Value" + editorId); + if (attrValue) { + if (/input/ig.test(attrValue.tagName)) { + opt[attrName] = attrValue.value; + } else { + var iptChilds = attrValue.getElementsByTagName("input"); + for (var j = iptChilds.length - 1, iptchild; iptchild = iptChilds[j--];) { + if (iptchild.checked) { + opt[attrName] = iptchild.value; + break; + } + } + } + } else { + opt[attrName] = true; + } + } else { + opt[attrName] = false; + } + } else { + opt[ipt.getAttribute("value")] = ipt.checked; + } + + } + + var selects = domUtils.getElementsByTagName(cont, "select"); + for (var i = 0, si; si = selects[i++];) { + var attr = si.getAttribute('name'); + opt[attr] = opt[attr] ? si.value : ''; + } + + utils.extend(me.editor.options.autotypeset, opt); + + me.editor.setPreferences('autotypeset', opt); + } + + AutoTypeSetButton.prototype = { + initAutoTypeSetButton: function () { + + var me = this; + this.popup = new Popup({ + //传入配置参数 + content: new AutoTypeSetPicker({editor: me.editor}), + 'editor': me.editor, + hide: function () { + if (!this._hidden && this.getDom()) { + getPara(this); + this.getDom().style.display = 'none'; + this._hidden = true; + this.fireEvent('hide'); + } + } + }); + var flag = 0; + this.popup.addListener('postRenderAfter', function () { + var popupUI = this; + if (flag) return; + var cont = this.getDom(), + btn = cont.getElementsByTagName('button')[0]; + + btn.onclick = function () { + getPara(popupUI); + me.editor.execCommand('autotypeset'); + popupUI.hide() + }; + + domUtils.on(cont, 'click', function (e) { + var target = e.target || e.srcElement, + editorId = me.editor.uid; + if (target && target.tagName == 'INPUT') { + + // 点击图片浮动的checkbox,去除对应的radio + if (target.name == 'imageBlockLine' || target.name == 'textAlign' || target.name == 'symbolConver') { + var checked = target.checked, + radioTd = document.getElementById(target.name + 'Value' + editorId), + radios = radioTd.getElementsByTagName('input'), + defalutSelect = { + 'imageBlockLine': 'none', + 'textAlign': 'left', + 'symbolConver': 'tobdc' + }; + + for (var i = 0; i < radios.length; i++) { + if (checked) { + if (radios[i].value == defalutSelect[target.name]) { + radios[i].checked = 'checked'; + } + } else { + radios[i].checked = false; + } + } + } + // 点击radio,选中对应的checkbox + if (target.name == ('imageBlockLineValue' + editorId) || target.name == ('textAlignValue' + editorId) || target.name == 'bdc') { + var checkboxs = target.parentNode.previousSibling.getElementsByTagName('input'); + checkboxs && (checkboxs[0].checked = true); + } + + getPara(popupUI); + } + }); + + flag = 1; + }); + this.initSplitButton(); + } + }; + utils.inherits(AutoTypeSetButton, SplitButton); + + })(); + + +// ui/cellalignpicker.js +///import core +///import uicore + (function () { + var utils = baidu.editor.utils, + Popup = baidu.editor.ui.Popup, + Stateful = baidu.editor.ui.Stateful, + UIBase = baidu.editor.ui.UIBase; + + /** + * 该参数将新增一个参数: selected, 参数类型为一个Object, 形如{ 'align': 'center', 'valign': 'top' }, 表示单元格的初始 + * 对齐状态为: 竖直居上,水平居中; 其中 align的取值为:'center', 'left', 'right'; valign的取值为: 'top', 'middle', 'bottom' + * @update 2013/4/2 hancong03@baidu.com + */ + var CellAlignPicker = baidu.editor.ui.CellAlignPicker = function (options) { + this.initOptions(options); + this.initSelected(); + this.initCellAlignPicker(); + }; + CellAlignPicker.prototype = { + //初始化选中状态, 该方法将根据传递进来的参数获取到应该选中的对齐方式图标的索引 + initSelected: function () { + + var status = { + + valign: { + top: 0, + middle: 1, + bottom: 2 + }, + align: { + left: 0, + center: 1, + right: 2 + }, + count: 3 + + }, + result = -1; + + if (this.selected) { + this.selectedIndex = status.valign[this.selected.valign] * status.count + status.align[this.selected.align]; + } + + }, + initCellAlignPicker: function () { + this.initUIBase(); + this.Stateful_init(); + }, + getHtmlTpl: function () { + + var alignType = ['left', 'center', 'right'], + COUNT = 9, + tempClassName = null, + tempIndex = -1, + tmpl = []; + + + for (var i = 0; i < COUNT; i++) { + + tempClassName = this.selectedIndex === i ? ' class="edui-cellalign-selected" ' : ''; + tempIndex = i % 3; + + tempIndex === 0 && tmpl.push(''); + + tmpl.push('
      '); + + tempIndex === 2 && tmpl.push(''); + + } + + return '
      ' + + '
      ' + + '' + + tmpl.join('') + + '
      ' + + '
      ' + + '
      '; + }, + getStateDom: function () { + return this.target; + }, + _onClick: function (evt) { + var target = evt.target || evt.srcElement; + if (/icon/.test(target.className)) { + this.items[target.parentNode.getAttribute("index")].onclick(); + Popup.postHide(evt); + } + }, + _UIBase_render: UIBase.prototype.render + }; + utils.inherits(CellAlignPicker, UIBase); + utils.extend(CellAlignPicker.prototype, Stateful, true); + })(); + + +// ui/pastepicker.js +///import core +///import uicore + (function () { + var utils = baidu.editor.utils, + Stateful = baidu.editor.ui.Stateful, + uiUtils = baidu.editor.ui.uiUtils, + UIBase = baidu.editor.ui.UIBase; + + var PastePicker = baidu.editor.ui.PastePicker = function (options) { + this.initOptions(options); + this.initPastePicker(); + }; + PastePicker.prototype = { + initPastePicker: function () { + this.initUIBase(); + this.Stateful_init(); + }, + getHtmlTpl: function () { + return '
      ' + + '
      ' + + '
      ' + this.editor.getLang("pasteOpt") + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + }, + getStateDom: function () { + return this.target; + }, + format: function (param) { + this.editor.ui._isTransfer = true; + this.editor.fireEvent('pasteTransfer', param); + }, + _onClick: function (cur) { + var node = domUtils.getNextDomNode(cur), + screenHt = uiUtils.getViewportRect().height, + subPop = uiUtils.getClientRect(node); + + if ((subPop.top + subPop.height) > screenHt) + node.style.top = (-subPop.height - cur.offsetHeight) + "px"; + else + node.style.top = ""; + + if (/hidden/ig.test(domUtils.getComputedStyle(node, "visibility"))) { + node.style.visibility = "visible"; + domUtils.addClass(cur, "edui-state-opened"); + } else { + node.style.visibility = "hidden"; + domUtils.removeClasses(cur, "edui-state-opened") + } + }, + _UIBase_render: UIBase.prototype.render + }; + utils.inherits(PastePicker, UIBase); + utils.extend(PastePicker.prototype, Stateful, true); + })(); + + +// ui/toolbar.js + (function () { + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + UIBase = baidu.editor.ui.UIBase, + Toolbar = baidu.editor.ui.Toolbar = function (options) { + this.initOptions(options); + this.initToolbar(); + }; + Toolbar.prototype = { + items: null, + initToolbar: function () { + this.items = this.items || []; + this.initUIBase(); + }, + add: function (item, index) { + if (index === undefined) { + this.items.push(item); + } else { + this.items.splice(index, 0, item) + } + + }, + getHtmlTpl: function () { + var buff = []; + for (var i = 0; i < this.items.length; i++) { + buff[i] = this.items[i].renderHtml(); + } + return '
      ' + + buff.join('') + + '
      ' + }, + postRender: function () { + var box = this.getDom(); + for (var i = 0; i < this.items.length; i++) { + this.items[i].postRender(); + } + uiUtils.makeUnselectable(box); + }, + _onMouseDown: function (e) { + var target = e.target || e.srcElement, + tagName = target && target.tagName && target.tagName.toLowerCase(); + if (tagName == 'input' || tagName == 'object' || tagName == 'object') { + return false; + } + } + }; + utils.inherits(Toolbar, UIBase); + + })(); + + +// ui/menu.js +///import core +///import uicore +///import ui\popup.js +///import ui\stateful.js + (function () { + var utils = baidu.editor.utils, + domUtils = baidu.editor.dom.domUtils, + uiUtils = baidu.editor.ui.uiUtils, + UIBase = baidu.editor.ui.UIBase, + Popup = baidu.editor.ui.Popup, + Stateful = baidu.editor.ui.Stateful, + CellAlignPicker = baidu.editor.ui.CellAlignPicker, + + Menu = baidu.editor.ui.Menu = function (options) { + this.initOptions(options); + this.initMenu(); + }; + + var menuSeparator = { + renderHtml: function () { + return '
      '; + }, + postRender: function () { + }, + queryAutoHide: function () { + return true; + } + }; + Menu.prototype = { + items: null, + uiName: 'menu', + initMenu: function () { + this.items = this.items || []; + this.initPopup(); + this.initItems(); + }, + initItems: function () { + for (var i = 0; i < this.items.length; i++) { + var item = this.items[i]; + if (item == '-') { + this.items[i] = this.getSeparator(); + } else if (!(item instanceof MenuItem)) { + item.editor = this.editor; + item.theme = this.editor.options.theme; + this.items[i] = this.createItem(item); + } + } + }, + getSeparator: function () { + return menuSeparator; + }, + createItem: function (item) { + //新增一个参数menu, 该参数存储了menuItem所对应的menu引用 + item.menu = this; + return new MenuItem(item); + }, + _Popup_getContentHtmlTpl: Popup.prototype.getContentHtmlTpl, + getContentHtmlTpl: function () { + if (this.items.length == 0) { + return this._Popup_getContentHtmlTpl(); + } + var buff = []; + for (var i = 0; i < this.items.length; i++) { + var item = this.items[i]; + buff[i] = item.renderHtml(); + } + return ('
      ' + buff.join('') + '
      '); + }, + _Popup_postRender: Popup.prototype.postRender, + postRender: function () { + var me = this; + for (var i = 0; i < this.items.length; i++) { + var item = this.items[i]; + item.ownerMenu = this; + item.postRender(); + } + domUtils.on(this.getDom(), 'mouseover', function (evt) { + evt = evt || event; + var rel = evt.relatedTarget || evt.fromElement; + var el = me.getDom(); + if (!uiUtils.contains(el, rel) && el !== rel) { + me.fireEvent('over'); + } + }); + this._Popup_postRender(); + }, + queryAutoHide: function (el) { + if (el) { + if (uiUtils.contains(this.getDom(), el)) { + return false; + } + for (var i = 0; i < this.items.length; i++) { + var item = this.items[i]; + if (item.queryAutoHide(el) === false) { + return false; + } + } + } + }, + clearItems: function () { + for (var i = 0; i < this.items.length; i++) { + var item = this.items[i]; + clearTimeout(item._showingTimer); + clearTimeout(item._closingTimer); + if (item.subMenu) { + item.subMenu.destroy(); + } + } + this.items = []; + }, + destroy: function () { + if (this.getDom()) { + domUtils.remove(this.getDom()); + } + this.clearItems(); + }, + dispose: function () { + this.destroy(); + } + }; + utils.inherits(Menu, Popup); + + /** + * @update 2013/04/03 hancong03 新增一个参数menu, 该参数存储了menuItem所对应的menu引用 + * @type {Function} + */ + var MenuItem = baidu.editor.ui.MenuItem = function (options) { + this.initOptions(options); + this.initUIBase(); + this.Stateful_init(); + if (this.subMenu && !(this.subMenu instanceof Menu)) { + if (options.className && options.className.indexOf("aligntd") != -1) { + var me = this; + + //获取单元格对齐初始状态 + this.subMenu.selected = this.editor.queryCommandValue('cellalignment'); + + this.subMenu = new Popup({ + content: new CellAlignPicker(this.subMenu), + parentMenu: me, + editor: me.editor, + destroy: function () { + if (this.getDom()) { + domUtils.remove(this.getDom()); + } + } + }); + this.subMenu.addListener("postRenderAfter", function () { + domUtils.on(this.getDom(), "mouseover", function () { + me.addState('opened'); + }); + }); + } else { + this.subMenu = new Menu(this.subMenu); + } + } + }; + MenuItem.prototype = { + label: '', + subMenu: null, + ownerMenu: null, + uiName: 'menuitem', + alwalysHoverable: true, + getHtmlTpl: function () { + return '
      ' + + '
      ' + + this.renderLabelHtml() + + '
      ' + + '
      '; + }, + postRender: function () { + var me = this; + this.addListener('over', function () { + me.ownerMenu.fireEvent('submenuover', me); + if (me.subMenu) { + me.delayShowSubMenu(); + } + }); + if (this.subMenu) { + this.getDom().className += ' edui-hassubmenu'; + this.subMenu.render(); + this.addListener('out', function () { + me.delayHideSubMenu(); + }); + this.subMenu.addListener('over', function () { + clearTimeout(me._closingTimer); + me._closingTimer = null; + me.addState('opened'); + }); + this.ownerMenu.addListener('hide', function () { + me.hideSubMenu(); + }); + this.ownerMenu.addListener('submenuover', function (t, subMenu) { + if (subMenu !== me) { + me.delayHideSubMenu(); + } + }); + this.subMenu._bakQueryAutoHide = this.subMenu.queryAutoHide; + this.subMenu.queryAutoHide = function (el) { + if (el && uiUtils.contains(me.getDom(), el)) { + return false; + } + return this._bakQueryAutoHide(el); + }; + } + this.getDom().style.tabIndex = '-1'; + uiUtils.makeUnselectable(this.getDom()); + this.Stateful_postRender(); + }, + delayShowSubMenu: function () { + var me = this; + if (!me.isDisabled()) { + me.addState('opened'); + clearTimeout(me._showingTimer); + clearTimeout(me._closingTimer); + me._closingTimer = null; + me._showingTimer = setTimeout(function () { + me.showSubMenu(); + }, 250); + } + }, + delayHideSubMenu: function () { + var me = this; + if (!me.isDisabled()) { + me.removeState('opened'); + clearTimeout(me._showingTimer); + if (!me._closingTimer) { + me._closingTimer = setTimeout(function () { + if (!me.hasState('opened')) { + me.hideSubMenu(); + } + me._closingTimer = null; + }, 400); + } + } + }, + renderLabelHtml: function () { + return '
      ' + + '
      ' + + '
      ' + (this.label || '') + '
      '; + }, + getStateDom: function () { + return this.getDom(); + }, + queryAutoHide: function (el) { + if (this.subMenu && this.hasState('opened')) { + return this.subMenu.queryAutoHide(el); + } + }, + _onClick: function (event, this_) { + if (this.hasState('disabled')) return; + if (this.fireEvent('click', event, this_) !== false) { + if (this.subMenu) { + this.showSubMenu(); + } else { + Popup.postHide(event); + } + } + }, + showSubMenu: function () { + var rect = uiUtils.getClientRect(this.getDom()); + rect.right -= 5; + rect.left += 2; + rect.width -= 7; + rect.top -= 4; + rect.bottom += 4; + rect.height += 8; + this.subMenu.showAnchorRect(rect, true, true); + }, + hideSubMenu: function () { + this.subMenu.hide(); + } + }; + utils.inherits(MenuItem, UIBase); + utils.extend(MenuItem.prototype, Stateful, true); + })(); + + +// ui/combox.js +///import core +///import uicore +///import ui/menu.js +///import ui/splitbutton.js + (function () { + // todo: menu和item提成通用list + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + Menu = baidu.editor.ui.Menu, + SplitButton = baidu.editor.ui.SplitButton, + Combox = baidu.editor.ui.Combox = function (options) { + this.initOptions(options); + this.initCombox(); + }; + Combox.prototype = { + uiName: 'combox', + onbuttonclick: function () { + this.showPopup(); + }, + initCombox: function () { + var me = this; + this.items = this.items || []; + for (var i = 0; i < this.items.length; i++) { + var item = this.items[i]; + item.uiName = 'listitem'; + item.index = i; + item.onclick = function () { + me.selectByIndex(this.index); + }; + } + this.popup = new Menu({ + items: this.items, + uiName: 'list', + editor: this.editor, + captureWheel: true, + combox: this + }); + + this.initSplitButton(); + }, + _SplitButton_postRender: SplitButton.prototype.postRender, + postRender: function () { + this._SplitButton_postRender(); + this.setLabel(this.label || ''); + this.setValue(this.initValue || ''); + }, + showPopup: function () { + var rect = uiUtils.getClientRect(this.getDom()); + rect.top += 1; + rect.bottom -= 1; + rect.height -= 2; + this.popup.showAnchorRect(rect); + }, + getValue: function () { + return this.value; + }, + setValue: function (value) { + var index = this.indexByValue(value); + if (index != -1) { + this.selectedIndex = index; + this.setLabel(this.items[index].label); + this.value = this.items[index].value; + } else { + this.selectedIndex = -1; + this.setLabel(this.getLabelForUnknowValue(value)); + this.value = value; + } + }, + setLabel: function (label) { + this.getDom('button_body').innerHTML = label; + this.label = label; + }, + getLabelForUnknowValue: function (value) { + return value; + }, + indexByValue: function (value) { + for (var i = 0; i < this.items.length; i++) { + if (value == this.items[i].value) { + return i; + } + } + return -1; + }, + getItem: function (index) { + return this.items[index]; + }, + selectByIndex: function (index) { + if (index < this.items.length && this.fireEvent('select', index) !== false) { + this.selectedIndex = index; + this.value = this.items[index].value; + this.setLabel(this.items[index].label); + } + } + }; + utils.inherits(Combox, SplitButton); + })(); + + +// ui/dialog.js +///import core +///import uicore +///import ui/mask.js +///import ui/button.js + (function () { + var utils = baidu.editor.utils, + domUtils = baidu.editor.dom.domUtils, + uiUtils = baidu.editor.ui.uiUtils, + Mask = baidu.editor.ui.Mask, + UIBase = baidu.editor.ui.UIBase, + Button = baidu.editor.ui.Button, + Dialog = baidu.editor.ui.Dialog = function (options) { + if (options.name) { + var name = options.name; + var cssRules = options.cssRules; + if (!options.className) { + options.className = 'edui-for-' + name; + } + if (cssRules) { + options.cssRules = '.edui-default .edui-for-' + name + ' .edui-dialog-content {' + cssRules + '}' + } + } + this.initOptions(utils.extend({ + autoReset: true, + draggable: true, + onok: function () { + }, + oncancel: function () { + }, + onclose: function (t, ok) { + return ok ? this.onok() : this.oncancel(); + }, + //是否控制dialog中的scroll事件, 默认为不阻止 + holdScroll: false + }, options)); + this.initDialog(); + }; + var modalMask; + var dragMask; + var activeDialog; + Dialog.prototype = { + draggable: false, + uiName: 'dialog', + initDialog: function () { + var me = this, + theme = this.editor.options.theme; + if (this.cssRules) { + utils.cssRule('edui-customize-' + this.name + '-style', this.cssRules); + } + this.initUIBase(); + this.modalMask = (modalMask || (modalMask = new Mask({ + className: 'edui-dialog-modalmask', + theme: theme, + onclick: function () { + activeDialog && activeDialog.close(false); + } + }))); + this.dragMask = (dragMask || (dragMask = new Mask({ + className: 'edui-dialog-dragmask', + theme: theme + }))); + this.closeButton = new Button({ + className: 'edui-dialog-closebutton', + title: me.closeDialog, + theme: theme, + onclick: function () { + me.close(false); + } + }); + + this.fullscreen && this.initResizeEvent(); + + if (this.buttons) { + for (var i = 0; i < this.buttons.length; i++) { + if (!(this.buttons[i] instanceof Button)) { + this.buttons[i] = new Button(utils.extend(this.buttons[i], { + editor: this.editor + }, true)); + } + } + } + }, + initResizeEvent: function () { + + var me = this; + + domUtils.on(window, "resize", function () { + + if (me._hidden || me._hidden === undefined) { + return; + } + + if (me.__resizeTimer) { + window.clearTimeout(me.__resizeTimer); + } + + me.__resizeTimer = window.setTimeout(function () { + + me.__resizeTimer = null; + + var dialogWrapNode = me.getDom(), + contentNode = me.getDom('content'), + wrapRect = UE.ui.uiUtils.getClientRect(dialogWrapNode), + contentRect = UE.ui.uiUtils.getClientRect(contentNode), + vpRect = uiUtils.getViewportRect(); + + contentNode.style.width = (vpRect.width - wrapRect.width + contentRect.width) + "px"; + contentNode.style.height = (vpRect.height - wrapRect.height + contentRect.height) + "px"; + + dialogWrapNode.style.width = vpRect.width + "px"; + dialogWrapNode.style.height = vpRect.height + "px"; + + me.fireEvent("resize"); + + }, 100); + + }); + + }, + fitSize: function () { + var popBodyEl = this.getDom('body'); +// if (!(baidu.editor.browser.ie && baidu.editor.browser.version == 7)) { +// uiUtils.removeStyle(popBodyEl, 'width'); +// uiUtils.removeStyle(popBodyEl, 'height'); +// } + var size = this.mesureSize(); + popBodyEl.style.width = size.width + 'px'; + popBodyEl.style.height = size.height + 'px'; + return size; + }, + safeSetOffset: function (offset) { + var me = this; + var el = me.getDom(); + var vpRect = uiUtils.getViewportRect(); + var rect = uiUtils.getClientRect(el); + var left = offset.left; + if (left + rect.width > vpRect.right) { + left = vpRect.right - rect.width; + } + var top = offset.top; + if (top + rect.height > vpRect.bottom) { + top = vpRect.bottom - rect.height; + } + el.style.left = Math.max(left, 0) + 'px'; + el.style.top = Math.max(top, 0) + 'px'; + }, + showAtCenter: function () { + + var vpRect = uiUtils.getViewportRect(); + + if (!this.fullscreen) { + this.getDom().style.display = ''; + var popSize = this.fitSize(); + var titleHeight = this.getDom('titlebar').offsetHeight | 0; + var left = vpRect.width / 2 - popSize.width / 2; + var top = vpRect.height / 2 - (popSize.height - titleHeight) / 2 - titleHeight; + var popEl = this.getDom(); + this.safeSetOffset({ + left: Math.max(left | 0, 0), + top: Math.max(top | 0, 0) + }); + if (!domUtils.hasClass(popEl, 'edui-state-centered')) { + popEl.className += ' edui-state-centered'; + } + } else { + var dialogWrapNode = this.getDom(), + contentNode = this.getDom('content'); + + dialogWrapNode.style.display = "block"; + + var wrapRect = UE.ui.uiUtils.getClientRect(dialogWrapNode), + contentRect = UE.ui.uiUtils.getClientRect(contentNode); + dialogWrapNode.style.left = "-100000px"; + + contentNode.style.width = (vpRect.width - wrapRect.width + contentRect.width) + "px"; + contentNode.style.height = (vpRect.height - wrapRect.height + contentRect.height) + "px"; + + dialogWrapNode.style.width = vpRect.width + "px"; + dialogWrapNode.style.height = vpRect.height + "px"; + dialogWrapNode.style.left = 0; + + //保存环境的overflow值 + this._originalContext = { + html: { + overflowX: document.documentElement.style.overflowX, + overflowY: document.documentElement.style.overflowY + }, + body: { + overflowX: document.body.style.overflowX, + overflowY: document.body.style.overflowY + } + }; + + document.documentElement.style.overflowX = 'hidden'; + document.documentElement.style.overflowY = 'hidden'; + document.body.style.overflowX = 'hidden'; + document.body.style.overflowY = 'hidden'; + + } + + this._show(); + }, + getContentHtml: function () { + var contentHtml = ''; + if (typeof this.content == 'string') { + contentHtml = this.content; + } else if (this.iframeUrl) { + contentHtml = ''; + } + return contentHtml; + }, + getHtmlTpl: function () { + var footHtml = ''; + + if (this.buttons) { + var buff = []; + for (var i = 0; i < this.buttons.length; i++) { + buff[i] = this.buttons[i].renderHtml(); + } + footHtml = '
      ' + + '
      ' + buff.join('') + '
      ' + + '
      '; + } + + return '
      ' + + '
      ' + + '
      ' + + '
      ' + + '' + (this.title || '') + '' + + '
      ' + + this.closeButton.renderHtml() + + '
      ' + + '
      ' + (this.autoReset ? '' : this.getContentHtml()) + '
      ' + + footHtml + + '
      '; + }, + postRender: function () { + // todo: 保持居中/记住上次关闭位置选项 + if (!this.modalMask.getDom()) { + this.modalMask.render(); + this.modalMask.hide(); + } + if (!this.dragMask.getDom()) { + this.dragMask.render(); + this.dragMask.hide(); + } + var me = this; + this.addListener('show', function () { + me.modalMask.show(this.getDom().style.zIndex - 2); + }); + this.addListener('hide', function () { + me.modalMask.hide(); + }); + if (this.buttons) { + for (var i = 0; i < this.buttons.length; i++) { + this.buttons[i].postRender(); + } + } + domUtils.on(window, 'resize', function () { + setTimeout(function () { + if (!me.isHidden()) { + me.safeSetOffset(uiUtils.getClientRect(me.getDom())); + } + }); + }); + + //hold住scroll事件,防止dialog的滚动影响页面 +// if( this.holdScroll ) { +// +// if( !me.iframeUrl ) { +// domUtils.on( document.getElementById( me.id + "_iframe"), !browser.gecko ? "mousewheel" : "DOMMouseScroll", function(e){ +// domUtils.preventDefault(e); +// } ); +// } else { +// me.addListener('dialogafterreset', function(){ +// window.setTimeout(function(){ +// var iframeWindow = document.getElementById( me.id + "_iframe").contentWindow; +// +// if( browser.ie ) { +// +// var timer = window.setInterval(function(){ +// +// if( iframeWindow.document && iframeWindow.document.body ) { +// window.clearInterval( timer ); +// timer = null; +// domUtils.on( iframeWindow.document.body, !browser.gecko ? "mousewheel" : "DOMMouseScroll", function(e){ +// domUtils.preventDefault(e); +// } ); +// } +// +// }, 100); +// +// } else { +// domUtils.on( iframeWindow, !browser.gecko ? "mousewheel" : "DOMMouseScroll", function(e){ +// domUtils.preventDefault(e); +// } ); +// } +// +// }, 1); +// }); +// } +// +// } + this._hide(); + }, + mesureSize: function () { + var body = this.getDom('body'); + var width = uiUtils.getClientRect(this.getDom('content')).width; + var dialogBodyStyle = body.style; + dialogBodyStyle.width = width; + return uiUtils.getClientRect(body); + }, + _onTitlebarMouseDown: function (evt, el) { + if (this.draggable) { + var rect; + var vpRect = uiUtils.getViewportRect(); + var me = this; + uiUtils.startDrag(evt, { + ondragstart: function () { + rect = uiUtils.getClientRect(me.getDom()); + me.getDom('contmask').style.visibility = 'visible'; + me.dragMask.show(me.getDom().style.zIndex - 1); + }, + ondragmove: function (x, y) { + var left = rect.left + x; + var top = rect.top + y; + me.safeSetOffset({ + left: left, + top: top + }); + }, + ondragstop: function () { + me.getDom('contmask').style.visibility = 'hidden'; + domUtils.removeClasses(me.getDom(), ['edui-state-centered']); + me.dragMask.hide(); + } + }); + } + }, + reset: function () { + this.getDom('content').innerHTML = this.getContentHtml(); + this.fireEvent('dialogafterreset'); + }, + _show: function () { + if (this._hidden) { + this.getDom().style.display = ''; + + //要高过编辑器的zindxe + this.editor.container.style.zIndex && (this.getDom().style.zIndex = this.editor.container.style.zIndex * 1 + 10); + this._hidden = false; + this.fireEvent('show'); + baidu.editor.ui.uiUtils.getFixedLayer().style.zIndex = this.getDom().style.zIndex - 4; + } + }, + isHidden: function () { + return this._hidden; + }, + _hide: function () { + if (!this._hidden) { + var wrapNode = this.getDom(); + wrapNode.style.display = 'none'; + wrapNode.style.zIndex = ''; + wrapNode.style.width = ''; + wrapNode.style.height = ''; + this._hidden = true; + this.fireEvent('hide'); + } + }, + open: function () { + if (this.autoReset) { + //有可能还没有渲染 + try { + this.reset(); + } catch (e) { + this.render(); + this.open() + } + } + this.showAtCenter(); + if (this.iframeUrl) { + try { + this.getDom('iframe').focus(); + } catch (ex) { + } + } + activeDialog = this; + }, + _onCloseButtonClick: function (evt, el) { + this.close(false); + }, + close: function (ok) { + if (this.fireEvent('close', ok) !== false) { + //还原环境 + if (this.fullscreen) { + + document.documentElement.style.overflowX = this._originalContext.html.overflowX; + document.documentElement.style.overflowY = this._originalContext.html.overflowY; + document.body.style.overflowX = this._originalContext.body.overflowX; + document.body.style.overflowY = this._originalContext.body.overflowY; + delete this._originalContext; + + } + this._hide(); + + //销毁content + var content = this.getDom('content'); + var iframe = this.getDom('iframe'); + if (content && iframe) { + var doc = iframe.contentDocument || iframe.contentWindow.document; + doc && (doc.body.innerHTML = ''); + domUtils.remove(content); + } + } + } + }; + utils.inherits(Dialog, UIBase); + })(); + + +// ui/menubutton.js +///import core +///import uicore +///import ui/menu.js +///import ui/splitbutton.js + (function () { + var utils = baidu.editor.utils, + Menu = baidu.editor.ui.Menu, + SplitButton = baidu.editor.ui.SplitButton, + MenuButton = baidu.editor.ui.MenuButton = function (options) { + this.initOptions(options); + this.initMenuButton(); + }; + MenuButton.prototype = { + initMenuButton: function () { + var me = this; + this.uiName = "menubutton"; + this.popup = new Menu({ + items: me.items, + className: me.className, + editor: me.editor + }); + this.popup.addListener('show', function () { + var list = this; + for (var i = 0; i < list.items.length; i++) { + list.items[i].removeState('checked'); + if (list.items[i].value == me._value) { + list.items[i].addState('checked'); + this.value = me._value; + } + } + }); + this.initSplitButton(); + }, + setValue: function (value) { + this._value = value; + } + + }; + utils.inherits(MenuButton, SplitButton); + })(); + +// ui/multiMenu.js +///import core +///import uicore + ///commands 表情 + (function () { + var utils = baidu.editor.utils, + Popup = baidu.editor.ui.Popup, + SplitButton = baidu.editor.ui.SplitButton, + MultiMenuPop = baidu.editor.ui.MultiMenuPop = function (options) { + this.initOptions(options); + this.initMultiMenu(); + }; + + MultiMenuPop.prototype = { + initMultiMenu: function () { + var me = this; + this.popup = new Popup({ + content: '', + editor: me.editor, + iframe_rendered: false, + onshow: function () { + if (!this.iframe_rendered) { + this.iframe_rendered = true; + this.getDom('content').innerHTML = ''; + me.editor.container.style.zIndex && (this.getDom().style.zIndex = me.editor.container.style.zIndex * 1 + 1); + } + } + // canSideUp:false, + // canSideLeft:false + }); + this.onbuttonclick = function () { + this.showPopup(); + }; + this.initSplitButton(); + } + + }; + + utils.inherits(MultiMenuPop, SplitButton); + })(); + + +// ui/shortcutmenu.js + (function () { + var UI = baidu.editor.ui, + UIBase = UI.UIBase, + uiUtils = UI.uiUtils, + utils = baidu.editor.utils, + domUtils = baidu.editor.dom.domUtils; + + var allMenus = [],//存储所有快捷菜单 + timeID, + isSubMenuShow = false;//是否有子pop显示 + + var ShortCutMenu = UI.ShortCutMenu = function (options) { + this.initOptions(options); + this.initShortCutMenu(); + }; + + ShortCutMenu.postHide = hideAllMenu; + + ShortCutMenu.prototype = { + isHidden: true, + SPACE: 5, + initShortCutMenu: function () { + this.items = this.items || []; + this.initUIBase(); + this.initItems(); + this.initEvent(); + allMenus.push(this); + }, + initEvent: function () { + var me = this, + doc = me.editor.document; + + domUtils.on(doc, "mousemove", function (e) { + if (me.isHidden === false) { + //有pop显示就不隐藏快捷菜单 + if (me.getSubMenuMark() || me.eventType == "contextmenu") return; + + + var flag = true, + el = me.getDom(), + wt = el.offsetWidth, + ht = el.offsetHeight, + distanceX = wt / 2 + me.SPACE,//距离中心X标准 + distanceY = ht / 2,//距离中心Y标准 + x = Math.abs(e.screenX - me.left),//离中心距离横坐标 + y = Math.abs(e.screenY - me.top);//离中心距离纵坐标 + + clearTimeout(timeID); + timeID = setTimeout(function () { + if (y > 0 && y < distanceY) { + me.setOpacity(el, "1"); + } else if (y > distanceY && y < distanceY + 70) { + me.setOpacity(el, "0.5"); + flag = false; + } else if (y > distanceY + 70 && y < distanceY + 140) { + me.hide(); + } + + if (flag && x > 0 && x < distanceX) { + me.setOpacity(el, "1") + } else if (x > distanceX && x < distanceX + 70) { + me.setOpacity(el, "0.5") + } else if (x > distanceX + 70 && x < distanceX + 140) { + me.hide(); + } + }); + } + }); + + //ie\ff下 mouseout不准 + if (browser.chrome) { + domUtils.on(doc, "mouseout", function (e) { + var relatedTgt = e.relatedTarget || e.toElement; + + if (relatedTgt == null || relatedTgt.tagName == "HTML") { + me.hide(); + } + }); + } + + me.editor.addListener("afterhidepop", function () { + if (!me.isHidden) { + isSubMenuShow = true; + } + }); + + }, + initItems: function () { + if (utils.isArray(this.items)) { + for (var i = 0, len = this.items.length; i < len; i++) { + var item = this.items[i].toLowerCase(); + + if (UI[item]) { + this.items[i] = new UI[item](this.editor); + this.items[i].className += " edui-shortcutsubmenu "; + } + } + } + }, + setOpacity: function (el, value) { + if (browser.ie && browser.version < 9) { + el.style.filter = "alpha(opacity = " + parseFloat(value) * 100 + ");" + } else { + el.style.opacity = value; + } + }, + getSubMenuMark: function () { + isSubMenuShow = false; + var layerEle = uiUtils.getFixedLayer(); + var list = domUtils.getElementsByTagName(layerEle, "div", function (node) { + return domUtils.hasClass(node, "edui-shortcutsubmenu edui-popup") + }); + + for (var i = 0, node; node = list[i++];) { + if (node.style.display != "none") { + isSubMenuShow = true; + } + } + return isSubMenuShow; + }, + show: function (e, hasContextmenu) { + var me = this, + offset = {}, + el = this.getDom(), + fixedlayer = uiUtils.getFixedLayer(); + + function setPos(offset) { + if (offset.left < 0) { + offset.left = 0; + } + if (offset.top < 0) { + offset.top = 0; + } + el.style.cssText = "position:absolute;left:" + offset.left + "px;top:" + offset.top + "px;"; + } + + function setPosByCxtMenu(menu) { + if (!menu.tagName) { + menu = menu.getDom(); + } + offset.left = parseInt(menu.style.left); + offset.top = parseInt(menu.style.top); + offset.top -= el.offsetHeight + 15; + setPos(offset); + } + + + me.eventType = e.type; + el.style.cssText = "display:block;left:-9999px"; + + if (e.type == "contextmenu" && hasContextmenu) { + var menu = domUtils.getElementsByTagName(fixedlayer, "div", "edui-contextmenu")[0]; + if (menu) { + setPosByCxtMenu(menu) + } else { + me.editor.addListener("aftershowcontextmenu", function (type, menu) { + setPosByCxtMenu(menu); + }); + } + } else { + offset = uiUtils.getViewportOffsetByEvent(e); + offset.top -= el.offsetHeight + me.SPACE; + offset.left += me.SPACE + 20; + setPos(offset); + me.setOpacity(el, 0.2); + } + + + me.isHidden = false; + me.left = e.screenX + el.offsetWidth / 2 - me.SPACE; + me.top = e.screenY - (el.offsetHeight / 2) - me.SPACE; + + if (me.editor) { + el.style.zIndex = me.editor.container.style.zIndex * 1 + 10; + fixedlayer.style.zIndex = el.style.zIndex - 1; + } + }, + hide: function () { + if (this.getDom()) { + this.getDom().style.display = "none"; + } + this.isHidden = true; + }, + postRender: function () { + if (utils.isArray(this.items)) { + for (var i = 0, item; item = this.items[i++];) { + item.postRender(); + } + } + }, + getHtmlTpl: function () { + var buff; + if (utils.isArray(this.items)) { + buff = []; + for (var i = 0; i < this.items.length; i++) { + buff[i] = this.items[i].renderHtml(); + } + buff = buff.join(""); + } else { + buff = this.items; + } + + return '
      ' + + buff + + '
      '; + } + }; + + utils.inherits(ShortCutMenu, UIBase); + + function hideAllMenu(e) { + var tgt = e.target || e.srcElement, + cur = domUtils.findParent(tgt, function (node) { + return domUtils.hasClass(node, "edui-shortcutmenu") || domUtils.hasClass(node, "edui-popup"); + }, true); + + if (!cur) { + for (var i = 0, menu; menu = allMenus[i++];) { + menu.hide() + } + } + } + + domUtils.on(document, 'mousedown', function (e) { + hideAllMenu(e); + }); + + domUtils.on(window, 'scroll', function (e) { + hideAllMenu(e); + }); + + })(); + + +// ui/breakline.js + (function () { + var utils = baidu.editor.utils, + UIBase = baidu.editor.ui.UIBase, + Breakline = baidu.editor.ui.Breakline = function (options) { + this.initOptions(options); + this.initSeparator(); + }; + Breakline.prototype = { + uiName: 'Breakline', + initSeparator: function () { + this.initUIBase(); + }, + getHtmlTpl: function () { + return '
      '; + } + }; + utils.inherits(Breakline, UIBase); + + })(); + + +// ui/message.js +///import core +///import uicore + (function () { + var utils = baidu.editor.utils, + domUtils = baidu.editor.dom.domUtils, + UIBase = baidu.editor.ui.UIBase, + Message = baidu.editor.ui.Message = function (options) { + this.initOptions(options); + this.initMessage(); + }; + + Message.prototype = { + initMessage: function () { + this.initUIBase(); + }, + getHtmlTpl: function () { + return '
      ' + + '
      ×
      ' + + '
      ' + + ' ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      '; + }, + reset: function (opt) { + var me = this; + if (!opt.keepshow) { + clearTimeout(this.timer); + me.timer = setTimeout(function () { + me.hide(); + }, opt.timeout || 4000); + } + + opt.content !== undefined && me.setContent(opt.content); + opt.type !== undefined && me.setType(opt.type); + + me.show(); + }, + postRender: function () { + var me = this, + closer = this.getDom('closer'); + closer && domUtils.on(closer, 'click', function () { + me.hide(); + }); + }, + setContent: function (content) { + this.getDom('content').innerHTML = content; + }, + setType: function (type) { + type = type || 'info'; + var body = this.getDom('body'); + body.className = body.className.replace(/edui-message-type-[\w-]+/, 'edui-message-type-' + type); + }, + getContent: function () { + return this.getDom('content').innerHTML; + }, + getType: function () { + var arr = this.getDom('body').match(/edui-message-type-([\w-]+)/); + return arr ? arr[1] : ''; + }, + show: function () { + this.getDom().style.display = 'block'; + }, + hide: function () { + var dom = this.getDom(); + if (dom) { + dom.style.display = 'none'; + dom.parentNode && dom.parentNode.removeChild(dom); + } + } + }; + + utils.inherits(Message, UIBase); + + })(); + + +// adapter/editorui.js +//ui跟编辑器的适配層 +//那个按钮弹出是dialog,是下拉筐等都是在这个js中配置 +//自己写的ui也要在这里配置,放到baidu.editor.ui下边,当编辑器实例化的时候会根据ueditor.config中的toolbars找到相应的进行实例化 + (function () { + var utils = baidu.editor.utils; + var editorui = baidu.editor.ui; + var _Dialog = editorui.Dialog; + editorui.buttons = {}; + + editorui.Dialog = function (options) { + var dialog = new _Dialog(options); + dialog.addListener('hide', function () { + + if (dialog.editor) { + var editor = dialog.editor; + try { + if (browser.gecko) { + var y = editor.window.scrollY, + x = editor.window.scrollX; + editor.body.focus(); + editor.window.scrollTo(x, y); + } else { + editor.focus(); + } + + + } catch (ex) { + } + } + }); + return dialog; + }; + + var iframeUrlMap = { + 'anchor': '~/dialogs/anchor/anchor.html', + 'insertimage': '~/dialogs/image/image.html', + 'link': '~/dialogs/link/link.html', + 'spechars': '~/dialogs/spechars/spechars.html', + 'searchreplace': '~/dialogs/searchreplace/searchreplace.html', + 'map': '~/dialogs/map/map.html', + 'gmap': '~/dialogs/gmap/gmap.html', + 'insertvideo': '~/dialogs/video/video.html', + 'help': '~/dialogs/help/help.html', + 'preview': '~/dialogs/preview/preview.html', + 'emotion': '~/dialogs/emotion/emotion.html', + 'wordimage': '~/dialogs/wordimage/wordimage.html', + 'attachment': '~/dialogs/attachment/attachment.html', + 'insertframe': '~/dialogs/insertframe/insertframe.html', + 'edittip': '~/dialogs/table/edittip.html', + 'edittable': '~/dialogs/table/edittable.html', + 'edittd': '~/dialogs/table/edittd.html', + 'webapp': '~/dialogs/webapp/webapp.html', + 'snapscreen': '~/dialogs/snapscreen/snapscreen.html', + 'scrawl': '~/dialogs/scrawl/scrawl.html', + 'music': '~/dialogs/music/music.html', + 'template': '~/dialogs/template/template.html', + 'background': '~/dialogs/background/background.html', + 'charts': '~/dialogs/charts/charts.html' + }; + //为工具栏添加按钮,以下都是统一的按钮触发命令,所以写在一起 + var btnCmds = ['undo', 'redo', 'formatmatch', + 'bold', 'italic', 'underline', 'fontborder', 'touppercase', 'tolowercase', + 'strikethrough', 'subscript', 'superscript', 'source', 'indent', 'outdent', + 'blockquote', 'pasteplain', 'pagebreak', + 'selectall', 'print', 'horizontal', 'removeformat', 'time', 'date', 'unlink', + 'insertparagraphbeforetable', 'insertrow', 'insertcol', 'mergeright', 'mergedown', 'deleterow', + 'deletecol', 'splittorows', 'splittocols', 'splittocells', 'mergecells', 'deletetable', 'drafts']; + + for (var i = 0, ci; ci = btnCmds[i++];) { + ci = ci.toLowerCase(); + editorui[ci] = function (cmd) { + return function (editor) { + var ui = new editorui.Button({ + className: 'edui-for-' + cmd, + title: editor.options.labelMap[cmd] || editor.getLang("labelMap." + cmd) || '', + onclick: function () { + editor.execCommand(cmd); + }, + theme: editor.options.theme, + showText: false + }); + editorui.buttons[cmd] = ui; + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + var state = editor.queryCommandState(cmd); + if (state == -1) { + ui.setDisabled(true); + ui.setChecked(false); + } else { + if (!uiReady) { + ui.setDisabled(false); + ui.setChecked(state); + } + } + }); + return ui; + }; + }(ci); + } + + //清除文档 + editorui.cleardoc = function (editor) { + var ui = new editorui.Button({ + className: 'edui-for-cleardoc', + title: editor.options.labelMap.cleardoc || editor.getLang("labelMap.cleardoc") || '', + theme: editor.options.theme, + onclick: function () { + if (confirm(editor.getLang("confirmClear"))) { + editor.execCommand('cleardoc'); + } + } + }); + editorui.buttons["cleardoc"] = ui; + editor.addListener('selectionchange', function () { + ui.setDisabled(editor.queryCommandState('cleardoc') == -1); + }); + return ui; + }; + + //排版,图片排版,文字方向 + var typeset = { + 'justify': ['left', 'right', 'center', 'justify'], + 'imagefloat': ['none', 'left', 'center', 'right'], + 'directionality': ['ltr', 'rtl'] + }; + + for (var p in typeset) { + + (function (cmd, val) { + for (var i = 0, ci; ci = val[i++];) { + (function (cmd2) { + editorui[cmd.replace('float', '') + cmd2] = function (editor) { + var ui = new editorui.Button({ + className: 'edui-for-' + cmd.replace('float', '') + cmd2, + title: editor.options.labelMap[cmd.replace('float', '') + cmd2] || editor.getLang("labelMap." + cmd.replace('float', '') + cmd2) || '', + theme: editor.options.theme, + onclick: function () { + editor.execCommand(cmd, cmd2); + } + }); + editorui.buttons[cmd] = ui; + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + ui.setDisabled(editor.queryCommandState(cmd) == -1); + ui.setChecked(editor.queryCommandValue(cmd) == cmd2 && !uiReady); + }); + return ui; + }; + })(ci) + } + })(p, typeset[p]) + } + + //字体颜色和背景颜色 + for (var i = 0, ci; ci = ['backcolor', 'forecolor'][i++];) { + editorui[ci] = function (cmd) { + return function (editor) { + var ui = new editorui.ColorButton({ + className: 'edui-for-' + cmd, + color: 'default', + title: editor.options.labelMap[cmd] || editor.getLang("labelMap." + cmd) || '', + editor: editor, + onpickcolor: function (t, color) { + editor.execCommand(cmd, color); + }, + onpicknocolor: function () { + editor.execCommand(cmd, 'default'); + this.setColor('transparent'); + this.color = 'default'; + }, + onbuttonclick: function () { + editor.execCommand(cmd, this.color); + } + }); + editorui.buttons[cmd] = ui; + editor.addListener('selectionchange', function () { + ui.setDisabled(editor.queryCommandState(cmd) == -1); + }); + return ui; + }; + }(ci); + } + + + var dialogBtns = { + noOk: ['searchreplace', 'help', 'spechars', 'webapp', 'preview'], + ok: ['attachment', 'anchor', 'link', 'insertimage', 'map', 'gmap', 'insertframe', 'wordimage', + 'insertvideo', 'insertframe', 'edittip', 'edittable', 'edittd', 'scrawl', 'template', 'music', 'background', 'charts'] + }; + + for (var p in dialogBtns) { + (function (type, vals) { + for (var i = 0, ci; ci = vals[i++];) { + //todo opera下存在问题 + if (browser.opera && ci === "searchreplace") { + continue; + } + (function (cmd) { + editorui[cmd] = function (editor, iframeUrl, title) { + iframeUrl = iframeUrl || (editor.options.iframeUrlMap || {})[cmd] || iframeUrlMap[cmd]; + title = editor.options.labelMap[cmd] || editor.getLang("labelMap." + cmd) || ''; + + var dialog; + //没有iframeUrl不创建dialog + if (iframeUrl) { + dialog = new editorui.Dialog(utils.extend({ + iframeUrl: editor.ui.mapUrl(iframeUrl), + editor: editor, + className: 'edui-for-' + cmd, + title: title, + holdScroll: cmd === 'insertimage', + fullscreen: /charts|preview/.test(cmd), + closeDialog: editor.getLang("closeDialog") + }, type == 'ok' ? { + buttons: [ + { + className: 'edui-okbutton', + label: editor.getLang("ok"), + editor: editor, + onclick: function () { + dialog.close(true); + } + }, + { + className: 'edui-cancelbutton', + label: editor.getLang("cancel"), + editor: editor, + onclick: function () { + dialog.close(false); + } + } + ] + } : {})); + + editor.ui._dialogs[cmd + "Dialog"] = dialog; + } + + var ui = new editorui.Button({ + className: 'edui-for-' + cmd, + title: title, + onclick: function () { + if (dialog) { + switch (cmd) { + case "wordimage": + var images = editor.execCommand("wordimage"); + if (images && images.length) { + dialog.render(); + dialog.open(); + } + break; + case "scrawl": + if (editor.queryCommandState("scrawl") != -1) { + dialog.render(); + dialog.open(); + } + + break; + default: + dialog.render(); + dialog.open(); + } + } + }, + theme: editor.options.theme, + disabled: (cmd == 'scrawl' && editor.queryCommandState("scrawl") == -1) || (cmd == 'charts') + }); + editorui.buttons[cmd] = ui; + editor.addListener('selectionchange', function () { + //只存在于右键菜单而无工具栏按钮的ui不需要检测状态 + var unNeedCheckState = {'edittable': 1}; + if (cmd in unNeedCheckState) return; + + var state = editor.queryCommandState(cmd); + if (ui.getDom()) { + ui.setDisabled(state == -1); + ui.setChecked(state); + } + + }); + + return ui; + }; + })(ci.toLowerCase()) + } + })(p, dialogBtns[p]); + } + + editorui.snapscreen = function (editor, iframeUrl, title) { + title = editor.options.labelMap['snapscreen'] || editor.getLang("labelMap.snapscreen") || ''; + var ui = new editorui.Button({ + className: 'edui-for-snapscreen', + title: title, + onclick: function () { + editor.execCommand("snapscreen"); + }, + theme: editor.options.theme + + }); + editorui.buttons['snapscreen'] = ui; + iframeUrl = iframeUrl || (editor.options.iframeUrlMap || {})["snapscreen"] || iframeUrlMap["snapscreen"]; + if (iframeUrl) { + var dialog = new editorui.Dialog({ + iframeUrl: editor.ui.mapUrl(iframeUrl), + editor: editor, + className: 'edui-for-snapscreen', + title: title, + buttons: [ + { + className: 'edui-okbutton', + label: editor.getLang("ok"), + editor: editor, + onclick: function () { + dialog.close(true); + } + }, + { + className: 'edui-cancelbutton', + label: editor.getLang("cancel"), + editor: editor, + onclick: function () { + dialog.close(false); + } + } + ] + + }); + dialog.render(); + editor.ui._dialogs["snapscreenDialog"] = dialog; + } + editor.addListener('selectionchange', function () { + ui.setDisabled(editor.queryCommandState('snapscreen') == -1); + }); + return ui; + }; + + editorui.insertcode = function (editor, list, title) { + list = editor.options['insertcode'] || []; + title = editor.options.labelMap['insertcode'] || editor.getLang("labelMap.insertcode") || ''; + // if (!list.length) return; + var items = []; + utils.each(list, function (key, val) { + items.push({ + label: key, + value: val, + theme: editor.options.theme, + renderLabelHtml: function () { + return '
      ' + (this.label || '') + '
      '; + } + }); + }); + + var ui = new editorui.Combox({ + editor: editor, + items: items, + onselect: function (t, index) { + editor.execCommand('insertcode', this.items[index].value); + }, + onbuttonclick: function () { + this.showPopup(); + }, + title: title, + initValue: title, + className: 'edui-for-insertcode', + indexByValue: function (value) { + if (value) { + for (var i = 0, ci; ci = this.items[i]; i++) { + if (ci.value.indexOf(value) != -1) + return i; + } + } + + return -1; + } + }); + editorui.buttons['insertcode'] = ui; + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + if (!uiReady) { + var state = editor.queryCommandState('insertcode'); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue('insertcode'); + if (!value) { + ui.setValue(title); + return; + } + //trace:1871 ie下从源码模式切换回来时,字体会带单引号,而且会有逗号 + value && (value = value.replace(/['"]/g, '').split(',')[0]); + ui.setValue(value); + + } + } + + }); + return ui; + }; + editorui.fontfamily = function (editor, list, title) { + + list = editor.options['fontfamily'] || []; + title = editor.options.labelMap['fontfamily'] || editor.getLang("labelMap.fontfamily") || ''; + if (!list.length) return; + for (var i = 0, ci, items = []; ci = list[i]; i++) { + var langLabel = editor.getLang('fontfamily')[ci.name] || ""; + (function (key, val) { + items.push({ + label: key, + value: val, + theme: editor.options.theme, + renderLabelHtml: function () { + return '
      ' + (this.label || '') + '
      '; + } + }); + })(ci.label || langLabel, ci.val) + } + var ui = new editorui.Combox({ + editor: editor, + items: items, + onselect: function (t, index) { + editor.execCommand('FontFamily', this.items[index].value); + }, + onbuttonclick: function () { + this.showPopup(); + }, + title: title, + initValue: title, + className: 'edui-for-fontfamily', + indexByValue: function (value) { + if (value) { + for (var i = 0, ci; ci = this.items[i]; i++) { + if (ci.value.indexOf(value) != -1) + return i; + } + } + + return -1; + } + }); + editorui.buttons['fontfamily'] = ui; + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + if (!uiReady) { + var state = editor.queryCommandState('FontFamily'); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue('FontFamily'); + //trace:1871 ie下从源码模式切换回来时,字体会带单引号,而且会有逗号 + value && (value = value.replace(/['"]/g, '').split(',')[0]); + ui.setValue(value); + + } + } + + }); + return ui; + }; + + editorui.fontsize = function (editor, list, title) { + title = editor.options.labelMap['fontsize'] || editor.getLang("labelMap.fontsize") || ''; + list = list || editor.options['fontsize'] || []; + if (!list.length) return; + var items = []; + for (var i = 0; i < list.length; i++) { + var size = list[i] + 'px'; + items.push({ + label: size, + value: size, + theme: editor.options.theme, + renderLabelHtml: function () { + return '
      ' + (this.label || '') + '
      '; + } + }); + } + var ui = new editorui.Combox({ + editor: editor, + items: items, + title: title, + initValue: title, + onselect: function (t, index) { + editor.execCommand('FontSize', this.items[index].value); + }, + onbuttonclick: function () { + this.showPopup(); + }, + className: 'edui-for-fontsize' + }); + editorui.buttons['fontsize'] = ui; + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + if (!uiReady) { + var state = editor.queryCommandState('FontSize'); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + ui.setValue(editor.queryCommandValue('FontSize')); + } + } + + }); + return ui; + }; + + editorui.paragraph = function (editor, list, title) { + title = editor.options.labelMap['paragraph'] || editor.getLang("labelMap.paragraph") || ''; + list = editor.options['paragraph'] || []; + if (utils.isEmptyObject(list)) return; + var items = []; + for (var i in list) { + items.push({ + value: i, + label: list[i] || editor.getLang("paragraph")[i], + theme: editor.options.theme, + renderLabelHtml: function () { + return '
      ' + (this.label || '') + '
      '; + } + }) + } + var ui = new editorui.Combox({ + editor: editor, + items: items, + title: title, + initValue: title, + className: 'edui-for-paragraph', + onselect: function (t, index) { + editor.execCommand('Paragraph', this.items[index].value); + }, + onbuttonclick: function () { + this.showPopup(); + } + }); + editorui.buttons['paragraph'] = ui; + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + if (!uiReady) { + var state = editor.queryCommandState('Paragraph'); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue('Paragraph'); + var index = ui.indexByValue(value); + if (index != -1) { + ui.setValue(value); + } else { + ui.setValue(ui.initValue); + } + } + } + + }); + return ui; + }; + + + //自定义标题 + editorui.customstyle = function (editor) { + var list = editor.options['customstyle'] || [], + title = editor.options.labelMap['customstyle'] || editor.getLang("labelMap.customstyle") || ''; + if (!list.length) return; + var langCs = editor.getLang('customstyle'); + for (var i = 0, items = [], t; t = list[i++];) { + (function (t) { + var ck = {}; + ck.label = t.label ? t.label : langCs[t.name]; + ck.style = t.style; + ck.className = t.className; + ck.tag = t.tag; + items.push({ + label: ck.label, + value: ck, + theme: editor.options.theme, + renderLabelHtml: function () { + return '
      ' + '<' + ck.tag + ' ' + (ck.className ? ' class="' + ck.className + '"' : "") + + (ck.style ? ' style="' + ck.style + '"' : "") + '>' + ck.label + "<\/" + ck.tag + ">" + + '
      '; + } + }); + })(t); + } + + var ui = new editorui.Combox({ + editor: editor, + items: items, + title: title, + initValue: title, + className: 'edui-for-customstyle', + onselect: function (t, index) { + editor.execCommand('customstyle', this.items[index].value); + }, + onbuttonclick: function () { + this.showPopup(); + }, + indexByValue: function (value) { + for (var i = 0, ti; ti = this.items[i++];) { + if (ti.label == value) { + return i - 1 + } + } + return -1; + } + }); + editorui.buttons['customstyle'] = ui; + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + if (!uiReady) { + var state = editor.queryCommandState('customstyle'); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue('customstyle'); + var index = ui.indexByValue(value); + if (index != -1) { + ui.setValue(value); + } else { + ui.setValue(ui.initValue); + } + } + } + + }); + return ui; + }; + editorui.inserttable = function (editor, iframeUrl, title) { + title = editor.options.labelMap['inserttable'] || editor.getLang("labelMap.inserttable") || ''; + var ui = new editorui.TableButton({ + editor: editor, + title: title, + className: 'edui-for-inserttable', + onpicktable: function (t, numCols, numRows) { + editor.execCommand('InsertTable', {numRows: numRows, numCols: numCols, border: 1}); + }, + onbuttonclick: function () { + this.showPopup(); + } + }); + editorui.buttons['inserttable'] = ui; + editor.addListener('selectionchange', function () { + ui.setDisabled(editor.queryCommandState('inserttable') == -1); + }); + return ui; + }; + + editorui.lineheight = function (editor) { + var val = editor.options.lineheight || []; + if (!val.length) return; + for (var i = 0, ci, items = []; ci = val[i++];) { + items.push({ + //todo:写死了 + label: ci, + value: ci, + theme: editor.options.theme, + onclick: function () { + editor.execCommand("lineheight", this.value); + } + }) + } + var ui = new editorui.MenuButton({ + editor: editor, + className: 'edui-for-lineheight', + title: editor.options.labelMap['lineheight'] || editor.getLang("labelMap.lineheight") || '', + items: items, + onbuttonclick: function () { + var value = editor.queryCommandValue('LineHeight') || this.value; + editor.execCommand("LineHeight", value); + } + }); + editorui.buttons['lineheight'] = ui; + editor.addListener('selectionchange', function () { + var state = editor.queryCommandState('LineHeight'); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue('LineHeight'); + value && ui.setValue((value + '').replace(/cm/, '')); + ui.setChecked(state) + } + }); + return ui; + }; + + var rowspacings = ['top', 'bottom']; + for (var r = 0, ri; ri = rowspacings[r++];) { + (function (cmd) { + editorui['rowspacing' + cmd] = function (editor) { + var val = editor.options['rowspacing' + cmd] || []; + if (!val.length) return null; + for (var i = 0, ci, items = []; ci = val[i++];) { + items.push({ + label: ci, + value: ci, + theme: editor.options.theme, + onclick: function () { + editor.execCommand("rowspacing", this.value, cmd); + } + }) + } + var ui = new editorui.MenuButton({ + editor: editor, + className: 'edui-for-rowspacing' + cmd, + title: editor.options.labelMap['rowspacing' + cmd] || editor.getLang("labelMap.rowspacing" + cmd) || '', + items: items, + onbuttonclick: function () { + var value = editor.queryCommandValue('rowspacing', cmd) || this.value; + editor.execCommand("rowspacing", value, cmd); + } + }); + editorui.buttons[cmd] = ui; + editor.addListener('selectionchange', function () { + var state = editor.queryCommandState('rowspacing', cmd); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue('rowspacing', cmd); + value && ui.setValue((value + '').replace(/%/, '')); + ui.setChecked(state) + } + }); + return ui; + } + })(ri) + } + //有序,无序列表 + var lists = ['insertorderedlist', 'insertunorderedlist']; + for (var l = 0, cl; cl = lists[l++];) { + (function (cmd) { + editorui[cmd] = function (editor) { + var vals = editor.options[cmd], + _onMenuClick = function () { + editor.execCommand(cmd, this.value); + }, items = []; + for (var i in vals) { + items.push({ + label: vals[i] || editor.getLang()[cmd][i] || "", + value: i, + theme: editor.options.theme, + onclick: _onMenuClick + }) + } + var ui = new editorui.MenuButton({ + editor: editor, + className: 'edui-for-' + cmd, + title: editor.getLang("labelMap." + cmd) || '', + 'items': items, + onbuttonclick: function () { + var value = editor.queryCommandValue(cmd) || this.value; + editor.execCommand(cmd, value); + } + }); + editorui.buttons[cmd] = ui; + editor.addListener('selectionchange', function () { + var state = editor.queryCommandState(cmd); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue(cmd); + ui.setValue(value); + ui.setChecked(state) + } + }); + return ui; + }; + })(cl) + } + + editorui.fullscreen = function (editor, title) { + title = editor.options.labelMap['fullscreen'] || editor.getLang("labelMap.fullscreen") || ''; + var ui = new editorui.Button({ + className: 'edui-for-fullscreen', + title: title, + theme: editor.options.theme, + onclick: function () { + if (editor.ui) { + editor.ui.setFullScreen(!editor.ui.isFullScreen()); + } + this.setChecked(editor.ui.isFullScreen()); + } + }); + editorui.buttons['fullscreen'] = ui; + editor.addListener('selectionchange', function () { + var state = editor.queryCommandState('fullscreen'); + ui.setDisabled(state == -1); + ui.setChecked(editor.ui.isFullScreen()); + }); + return ui; + }; + + // 表情 + editorui["emotion"] = function (editor, iframeUrl) { + var cmd = "emotion"; + var ui = new editorui.MultiMenuPop({ + title: editor.options.labelMap[cmd] || editor.getLang("labelMap." + cmd + "") || '', + editor: editor, + className: 'edui-for-' + cmd, + iframeUrl: editor.ui.mapUrl(iframeUrl || (editor.options.iframeUrlMap || {})[cmd] || iframeUrlMap[cmd]) + }); + editorui.buttons[cmd] = ui; + + editor.addListener('selectionchange', function () { + ui.setDisabled(editor.queryCommandState(cmd) == -1) + }); + return ui; + }; + + editorui.autotypeset = function (editor) { + var ui = new editorui.AutoTypeSetButton({ + editor: editor, + title: editor.options.labelMap['autotypeset'] || editor.getLang("labelMap.autotypeset") || '', + className: 'edui-for-autotypeset', + onbuttonclick: function () { + editor.execCommand('autotypeset') + } + }); + editorui.buttons['autotypeset'] = ui; + editor.addListener('selectionchange', function () { + ui.setDisabled(editor.queryCommandState('autotypeset') == -1); + }); + return ui; + }; + + /* 简单上传插件 */ + editorui["simpleupload"] = function (editor) { + var name = 'simpleupload', + ui = new editorui.Button({ + className: 'edui-for-' + name, + title: editor.options.labelMap[name] || editor.getLang("labelMap." + name) || '', + onclick: function () { + }, + theme: editor.options.theme, + showText: false + }); + editorui.buttons[name] = ui; + editor.addListener('ready', function () { + var b = ui.getDom('body'), + iconSpan = b.children[0]; + editor.fireEvent('simpleuploadbtnready', iconSpan); + }); + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + var state = editor.queryCommandState(name); + if (state == -1) { + ui.setDisabled(true); + ui.setChecked(false); + } else { + if (!uiReady) { + ui.setDisabled(false); + ui.setChecked(state); + } + } + }); + return ui; + }; + + })(); + + +// adapter/editor.js +///import core +///commands 全屏 +///commandsName FullScreen +///commandsTitle 全屏 + (function () { + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + UIBase = baidu.editor.ui.UIBase, + domUtils = baidu.editor.dom.domUtils; + var nodeStack = []; + + function EditorUI(options) { + this.initOptions(options); + this.initEditorUI(); + } + + EditorUI.prototype = { + uiName: 'editor', + initEditorUI: function () { + this.editor.ui = this; + this._dialogs = {}; + this.initUIBase(); + this._initToolbars(); + var editor = this.editor, + me = this; + + editor.addListener('ready', function () { + //提供getDialog方法 + editor.getDialog = function (name) { + return editor.ui._dialogs[name + "Dialog"]; + }; + domUtils.on(editor.window, 'scroll', function (evt) { + baidu.editor.ui.Popup.postHide(evt); + }); + //提供编辑器实时宽高(全屏时宽高不变化) + editor.ui._actualFrameWidth = editor.options.initialFrameWidth; + + UE.browser.ie && UE.browser.version === 6 && editor.container.ownerDocument.execCommand("BackgroundImageCache", false, true); + + //display bottom-bar label based on config + if (editor.options.elementPathEnabled) { + editor.ui.getDom('elementpath').innerHTML = '
      ' + editor.getLang("elementPathTip") + ':
      '; + } + if (editor.options.wordCount) { + function countFn() { + setCount(editor, me); + domUtils.un(editor.document, "click", arguments.callee); + } + + domUtils.on(editor.document, "click", countFn); + editor.ui.getDom('wordcount').innerHTML = editor.getLang("wordCountTip"); + } + editor.ui._scale(); + if (editor.options.scaleEnabled) { + if (editor.autoHeightEnabled) { + editor.disableAutoHeight(); + } + me.enableScale(); + } else { + me.disableScale(); + } + if (!editor.options.elementPathEnabled && !editor.options.wordCount && !editor.options.scaleEnabled) { + editor.ui.getDom('elementpath').style.display = "none"; + editor.ui.getDom('wordcount').style.display = "none"; + editor.ui.getDom('scale').style.display = "none"; + } + + if (!editor.selection.isFocus()) return; + editor.fireEvent('selectionchange', false, true); + + + }); + + editor.addListener('mousedown', function (t, evt) { + var el = evt.target || evt.srcElement; + baidu.editor.ui.Popup.postHide(evt, el); + baidu.editor.ui.ShortCutMenu.postHide(evt); + + }); + editor.addListener("delcells", function () { + if (UE.ui['edittip']) { + new UE.ui['edittip'](editor); + } + editor.getDialog('edittip').open(); + }); + + var pastePop, isPaste = false, timer; + editor.addListener("afterpaste", function () { + if (editor.queryCommandState('pasteplain')) + return; + if (baidu.editor.ui.PastePicker) { + pastePop = new baidu.editor.ui.Popup({ + content: new baidu.editor.ui.PastePicker({editor: editor}), + editor: editor, + className: 'edui-wordpastepop' + }); + pastePop.render(); + } + isPaste = true; + }); + + editor.addListener("afterinserthtml", function () { + clearTimeout(timer); + timer = setTimeout(function () { + if (pastePop && (isPaste || editor.ui._isTransfer)) { + if (pastePop.isHidden()) { + var span = domUtils.createElement(editor.document, 'span', { + 'style': "line-height:0px;", + 'innerHTML': '\ufeff' + }), + range = editor.selection.getRange(); + range.insertNode(span); + var tmp = getDomNode(span, 'firstChild', 'previousSibling'); + tmp && pastePop.showAnchor(tmp.nodeType == 3 ? tmp.parentNode : tmp); + domUtils.remove(span); + } else { + pastePop.show(); + } + delete editor.ui._isTransfer; + isPaste = false; + } + }, 200) + }); + editor.addListener('contextmenu', function (t, evt) { + baidu.editor.ui.Popup.postHide(evt); + }); + editor.addListener('keydown', function (t, evt) { + if (pastePop) pastePop.dispose(evt); + var keyCode = evt.keyCode || evt.which; + if (evt.altKey && keyCode == 90) { + UE.ui.buttons['fullscreen'].onclick(); + } + }); + editor.addListener('wordcount', function (type) { + setCount(this, me); + }); + + function setCount(editor, ui) { + editor.setOpt({ + wordCount: true, + maximumWords: 10000, + wordCountMsg: editor.options.wordCountMsg || editor.getLang("wordCountMsg"), + wordOverFlowMsg: editor.options.wordOverFlowMsg || editor.getLang("wordOverFlowMsg") + }); + var opt = editor.options, + max = opt.maximumWords, + msg = opt.wordCountMsg, + errMsg = opt.wordOverFlowMsg, + countDom = ui.getDom('wordcount'); + if (!opt.wordCount) { + return; + } + var count = editor.getContentLength(true); + if (count > max) { + countDom.innerHTML = errMsg; + editor.fireEvent("wordcountoverflow"); + } else { + countDom.innerHTML = msg.replace("{#leave}", max - count).replace("{#count}", count); + } + } + + editor.addListener('selectionchange', function () { + if (editor.options.elementPathEnabled) { + me[(editor.queryCommandState('elementpath') == -1 ? 'dis' : 'en') + 'ableElementPath']() + } + if (editor.options.scaleEnabled) { + me[(editor.queryCommandState('scale') == -1 ? 'dis' : 'en') + 'ableScale'](); + + } + }); + var popup = new baidu.editor.ui.Popup({ + editor: editor, + content: '', + className: 'edui-bubble', + _onEditButtonClick: function () { + this.hide(); + editor.ui._dialogs.linkDialog.open(); + }, + _onImgEditButtonClick: function (name) { + this.hide(); + editor.ui._dialogs[name] && editor.ui._dialogs[name].open(); + + }, + _onImgSetFloat: function (value) { + this.hide(); + editor.execCommand("imagefloat", value); + + }, + _setIframeAlign: function (value) { + var frame = popup.anchorEl; + var newFrame = frame.cloneNode(true); + switch (value) { + case -2: + newFrame.setAttribute("align", ""); + break; + case -1: + newFrame.setAttribute("align", "left"); + break; + case 1: + newFrame.setAttribute("align", "right"); + break; + } + frame.parentNode.insertBefore(newFrame, frame); + domUtils.remove(frame); + popup.anchorEl = newFrame; + popup.showAnchor(popup.anchorEl); + }, + _updateIframe: function () { + var frame = editor._iframe = popup.anchorEl; + if (domUtils.hasClass(frame, 'ueditor_baidumap')) { + editor.selection.getRange().selectNode(frame).select(); + editor.ui._dialogs.mapDialog.open(); + popup.hide(); + } else { + editor.ui._dialogs.insertframeDialog.open(); + popup.hide(); + } + }, + _onRemoveButtonClick: function (cmdName) { + editor.execCommand(cmdName); + this.hide(); + }, + queryAutoHide: function (el) { + if (el && el.ownerDocument == editor.document) { + if (el.tagName.toLowerCase() == 'img' || domUtils.findParentByTagName(el, 'a', true)) { + return el !== popup.anchorEl; + } + } + return baidu.editor.ui.Popup.prototype.queryAutoHide.call(this, el); + } + }); + popup.render(); + if (editor.options.imagePopup) { + editor.addListener('mouseover', function (t, evt) { + evt = evt || window.event; + var el = evt.target || evt.srcElement; + if (editor.ui._dialogs.insertframeDialog && /iframe/ig.test(el.tagName)) { + var html = popup.formatHtml( + '' + editor.getLang("property") + ': ' + editor.getLang("default") + '  ' + editor.getLang("justifyleft") + '  ' + editor.getLang("justifyright") + '  ' + + ' ' + editor.getLang("modify") + ''); + if (html) { + popup.getDom('content').innerHTML = html; + popup.anchorEl = el; + popup.showAnchor(popup.anchorEl); + } else { + popup.hide(); + } + } + }); + editor.addListener('selectionchange', function (t, causeByUi) { + if (!causeByUi) return; + var html = '', str = "", + img = editor.selection.getRange().getClosedNode(), + dialogs = editor.ui._dialogs; + if (img && img.tagName == 'IMG') { + var dialogName = 'insertimageDialog'; + if (img.className.indexOf("edui-faked-video") != -1 || img.className.indexOf("edui-upload-video") != -1) { + dialogName = "insertvideoDialog" + } + if (img.className.indexOf("edui-faked-webapp") != -1) { + dialogName = "webappDialog" + } + if (img.src.indexOf("http://api.map.baidu.com") != -1) { + dialogName = "mapDialog" + } + if (img.className.indexOf("edui-faked-music") != -1) { + dialogName = "musicDialog" + } + if (img.src.indexOf("http://maps.google.com/maps/api/staticmap") != -1) { + dialogName = "gmapDialog" + } + if (img.getAttribute("anchorname")) { + dialogName = "anchorDialog"; + html = popup.formatHtml( + '' + editor.getLang("property") + ': ' + editor.getLang("modify") + '  ' + + '' + editor.getLang("delete") + ''); + } + if (img.getAttribute("word_img")) { + //todo 放到dialog去做查询 + editor.word_img = [img.getAttribute("word_img")]; + dialogName = "wordimageDialog" + } + if (domUtils.hasClass(img, 'loadingclass') || domUtils.hasClass(img, 'loaderrorclass')) { + dialogName = ""; + } + if (!dialogs[dialogName]) { + return; + } + str = '' + editor.getLang("property") + ': ' + + '' + editor.getLang("default") + '  ' + + '' + editor.getLang("justifyleft") + '  ' + + '' + editor.getLang("justifyright") + '  ' + + '' + editor.getLang("justifycenter") + '  ' + + '' + editor.getLang("modify") + ''; + + !html && (html = popup.formatHtml(str)) + + } + if (editor.ui._dialogs.linkDialog) { + var link = editor.queryCommandValue('link'); + var url; + if (link && (url = (link.getAttribute('_href') || link.getAttribute('href', 2)))) { + var txt = url; + if (url.length > 30) { + txt = url.substring(0, 20) + "..."; + } + if (html) { + html += '
      ' + } + html += popup.formatHtml( + '' + editor.getLang("anthorMsg") + ': ' + txt + '' + + ' ' + editor.getLang("modify") + '' + + ' ' + editor.getLang("clear") + ''); + popup.showAnchor(link); + } + } + + if (html) { + popup.getDom('content').innerHTML = html; + popup.anchorEl = img || link; + popup.showAnchor(popup.anchorEl); + } else { + popup.hide(); + } + }); + } + + }, + _initToolbars: function () { + var editor = this.editor; + var toolbars = this.toolbars || []; + var toolbarUis = []; + for (var i = 0; i < toolbars.length; i++) { + var toolbar = toolbars[i]; + var toolbarUi = new baidu.editor.ui.Toolbar({theme: editor.options.theme}); + for (var j = 0; j < toolbar.length; j++) { + var toolbarItem = toolbar[j]; + var toolbarItemUi = null; + if (typeof toolbarItem == 'string') { + toolbarItem = toolbarItem.toLowerCase(); + if (toolbarItem == '|') { + toolbarItem = 'Separator'; + } + if (toolbarItem == '||') { + toolbarItem = 'Breakline'; + } + if (baidu.editor.ui[toolbarItem]) { + toolbarItemUi = new baidu.editor.ui[toolbarItem](editor); + } + + //fullscreen这里单独处理一下,放到首行去 + if (toolbarItem == 'fullscreen') { + if (toolbarUis && toolbarUis[0]) { + toolbarUis[0].items.splice(0, 0, toolbarItemUi); + } else { + toolbarItemUi && toolbarUi.items.splice(0, 0, toolbarItemUi); + } + + continue; + + + } + } else { + toolbarItemUi = toolbarItem; + } + if (toolbarItemUi && toolbarItemUi.id) { + + toolbarUi.add(toolbarItemUi); + } + } + toolbarUis[i] = toolbarUi; + } + + //接受外部定制的UI + + utils.each(UE._customizeUI, function (obj, key) { + var itemUI, index; + if (obj.id && obj.id != editor.key) { + return false; + } + itemUI = obj.execFn.call(editor, editor, key); + if (itemUI) { + index = obj.index; + if (index === undefined) { + index = toolbarUi.items.length; + } + toolbarUi.add(itemUI, index) + } + }); + + this.toolbars = toolbarUis; + }, + getHtmlTpl: function () { + return '
      ' + + '
      ' + + (this.toolbars.length ? + '
      ' + + this.renderToolbarBoxHtml() + + '
      ' : '') + + '' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + //modify wdcount by matao + '
      ' + + '' + + '' + + '' + + '
      ' + + '
      ' + + '
      '; + }, + showWordImageDialog: function () { + this._dialogs['wordimageDialog'].open(); + }, + renderToolbarBoxHtml: function () { + var buff = []; + for (var i = 0; i < this.toolbars.length; i++) { + buff.push(this.toolbars[i].renderHtml()); + } + return buff.join(''); + }, + setFullScreen: function (fullscreen) { + + var editor = this.editor, + container = editor.container.parentNode.parentNode; + if (this._fullscreen != fullscreen) { + this._fullscreen = fullscreen; + this.editor.fireEvent('beforefullscreenchange', fullscreen); + if (baidu.editor.browser.gecko) { + var bk = editor.selection.getRange().createBookmark(); + } + if (fullscreen) { + while (container.tagName != "BODY") { + var position = baidu.editor.dom.domUtils.getComputedStyle(container, "position"); + nodeStack.push(position); + container.style.position = "static"; + container = container.parentNode; + } + this._bakHtmlOverflow = document.documentElement.style.overflow; + this._bakBodyOverflow = document.body.style.overflow; + this._bakAutoHeight = this.editor.autoHeightEnabled; + this._bakScrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop); + + this._bakEditorContaninerWidth = editor.iframe.parentNode.offsetWidth; + if (this._bakAutoHeight) { + //当全屏时不能执行自动长高 + editor.autoHeightEnabled = false; + this.editor.disableAutoHeight(); + } + + document.documentElement.style.overflow = 'hidden'; + //修复,滚动条不收起的问题 + + window.scrollTo(0, window.scrollY); + this._bakCssText = this.getDom().style.cssText; + this._bakCssText1 = this.getDom('iframeholder').style.cssText; + editor.iframe.parentNode.style.width = ''; + this._updateFullScreen(); + } else { + while (container.tagName != "BODY") { + container.style.position = nodeStack.shift(); + container = container.parentNode; + } + this.getDom().style.cssText = this._bakCssText; + this.getDom('iframeholder').style.cssText = this._bakCssText1; + if (this._bakAutoHeight) { + editor.autoHeightEnabled = true; + this.editor.enableAutoHeight(); + } + + document.documentElement.style.overflow = this._bakHtmlOverflow; + document.body.style.overflow = this._bakBodyOverflow; + editor.iframe.parentNode.style.width = this._bakEditorContaninerWidth + 'px'; + window.scrollTo(0, this._bakScrollTop); + } + if (browser.gecko && editor.body.contentEditable === 'true') { + var input = document.createElement('input'); + document.body.appendChild(input); + editor.body.contentEditable = false; + setTimeout(function () { + input.focus(); + setTimeout(function () { + editor.body.contentEditable = true; + editor.fireEvent('fullscreenchanged', fullscreen); + editor.selection.getRange().moveToBookmark(bk).select(true); + baidu.editor.dom.domUtils.remove(input); + fullscreen && window.scroll(0, 0); + }, 0) + }, 0) + } + + if (editor.body.contentEditable === 'true') { + this.editor.fireEvent('fullscreenchanged', fullscreen); + this.triggerLayout(); + } + + } + }, + _updateFullScreen: function () { + if (this._fullscreen) { + var vpRect = uiUtils.getViewportRect(); + this.getDom().style.cssText = 'border:0;position:absolute;left:0;top:' + (this.editor.options.topOffset || 0) + 'px;width:' + vpRect.width + 'px;height:' + vpRect.height + 'px;z-index:' + (this.getDom().style.zIndex * 1 + 100); + uiUtils.setViewportOffset(this.getDom(), {left: 0, top: this.editor.options.topOffset || 0}); + this.editor.setHeight(vpRect.height - this.getDom('toolbarbox').offsetHeight - this.getDom('bottombar').offsetHeight - (this.editor.options.topOffset || 0), true); + //不手动调一下,会导致全屏失效 + if (browser.gecko) { + try { + window.onresize(); + } catch (e) { + + } + + } + } + }, + _updateElementPath: function () { + var bottom = this.getDom('elementpath'), list; + if (this.elementPathEnabled && (list = this.editor.queryCommandValue('elementpath'))) { + + var buff = []; + for (var i = 0, ci; ci = list[i]; i++) { + buff[i] = this.formatHtml('' + ci + ''); + } + bottom.innerHTML = '
      ' + this.editor.getLang("elementPathTip") + ': ' + buff.join(' > ') + '
      '; + + } else { + bottom.style.display = 'none' + } + }, + disableElementPath: function () { + var bottom = this.getDom('elementpath'); + bottom.innerHTML = ''; + bottom.style.display = 'none'; + this.elementPathEnabled = false; + + }, + enableElementPath: function () { + var bottom = this.getDom('elementpath'); + bottom.style.display = ''; + this.elementPathEnabled = true; + this._updateElementPath(); + }, + _scale: function () { + var doc = document, + editor = this.editor, + editorHolder = editor.container, + editorDocument = editor.document, + toolbarBox = this.getDom("toolbarbox"), + bottombar = this.getDom("bottombar"), + scale = this.getDom("scale"), + scalelayer = this.getDom("scalelayer"); + + var isMouseMove = false, + position = null, + minEditorHeight = 0, + minEditorWidth = editor.options.minFrameWidth, + pageX = 0, + pageY = 0, + scaleWidth = 0, + scaleHeight = 0; + + function down() { + position = domUtils.getXY(editorHolder); + + if (!minEditorHeight) { + minEditorHeight = editor.options.minFrameHeight + toolbarBox.offsetHeight + bottombar.offsetHeight; + } + + scalelayer.style.cssText = "position:absolute;left:0;display:;top:0;background-color:#41ABFF;opacity:0.4;filter: Alpha(opacity=40);width:" + editorHolder.offsetWidth + "px;height:" + + editorHolder.offsetHeight + "px;z-index:" + (editor.options.zIndex + 1); + + domUtils.on(doc, "mousemove", move); + domUtils.on(editorDocument, "mouseup", up); + domUtils.on(doc, "mouseup", up); + } + + var me = this; + //by xuheng 全屏时关掉缩放 + this.editor.addListener('fullscreenchanged', function (e, fullScreen) { + if (fullScreen) { + me.disableScale(); + + } else { + if (me.editor.options.scaleEnabled) { + me.enableScale(); + var tmpNode = me.editor.document.createElement('span'); + me.editor.body.appendChild(tmpNode); + me.editor.body.style.height = Math.max(domUtils.getXY(tmpNode).y, me.editor.iframe.offsetHeight - 20) + 'px'; + domUtils.remove(tmpNode) + } + } + }); + + function move(event) { + clearSelection(); + var e = event || window.event; + pageX = e.pageX || (doc.documentElement.scrollLeft + e.clientX); + pageY = e.pageY || (doc.documentElement.scrollTop + e.clientY); + scaleWidth = pageX - position.x; + scaleHeight = pageY - position.y; + + if (scaleWidth >= minEditorWidth) { + isMouseMove = true; + scalelayer.style.width = scaleWidth + 'px'; + } + if (scaleHeight >= minEditorHeight) { + isMouseMove = true; + scalelayer.style.height = scaleHeight + "px"; + } + } + + function up() { + if (isMouseMove) { + isMouseMove = false; + editor.ui._actualFrameWidth = scalelayer.offsetWidth - 2; + editorHolder.style.width = editor.ui._actualFrameWidth + 'px'; + + editor.setHeight(scalelayer.offsetHeight - bottombar.offsetHeight - toolbarBox.offsetHeight - 2, true); + } + if (scalelayer) { + scalelayer.style.display = "none"; + } + clearSelection(); + domUtils.un(doc, "mousemove", move); + domUtils.un(editorDocument, "mouseup", up); + domUtils.un(doc, "mouseup", up); + } + + function clearSelection() { + if (browser.ie) + doc.selection.clear(); + else + window.getSelection().removeAllRanges(); + } + + this.enableScale = function () { + //trace:2868 + if (editor.queryCommandState("source") == 1) return; + scale.style.display = ""; + this.scaleEnabled = true; + domUtils.on(scale, "mousedown", down); + }; + this.disableScale = function () { + scale.style.display = "none"; + this.scaleEnabled = false; + domUtils.un(scale, "mousedown", down); + }; + }, + isFullScreen: function () { + return this._fullscreen; + }, + postRender: function () { + UIBase.prototype.postRender.call(this); + for (var i = 0; i < this.toolbars.length; i++) { + this.toolbars[i].postRender(); + } + var me = this; + var timerId, + domUtils = baidu.editor.dom.domUtils, + updateFullScreenTime = function () { + clearTimeout(timerId); + timerId = setTimeout(function () { + me._updateFullScreen(); + }); + }; + domUtils.on(window, 'resize', updateFullScreenTime); + + me.addListener('destroy', function () { + domUtils.un(window, 'resize', updateFullScreenTime); + clearTimeout(timerId); + }) + }, + showToolbarMsg: function (msg, flag) { + this.getDom('toolbarmsg_label').innerHTML = msg; + this.getDom('toolbarmsg').style.display = ''; + // + if (!flag) { + var w = this.getDom('upload_dialog'); + w.style.display = 'none'; + } + }, + hideToolbarMsg: function () { + this.getDom('toolbarmsg').style.display = 'none'; + }, + mapUrl: function (url) { + return url ? url.replace('~/', this.editor.options.UEDITOR_HOME_URL || '') : '' + }, + triggerLayout: function () { + var dom = this.getDom(); + if (dom.style.zoom == '1') { + dom.style.zoom = '100%'; + } else { + dom.style.zoom = '1'; + } + } + }; + utils.inherits(EditorUI, baidu.editor.ui.UIBase); + + + var instances = {}; + + + UE.ui.Editor = function (options) { + var editor = new UE.Editor(options); + editor.options.editor = editor; + utils.loadFile(document, { + href: editor.options.themePath + editor.options.theme + "/css/ueditor.css", + tag: "link", + type: "text/css", + rel: "stylesheet" + }); + + var oldRender = editor.render; + editor.render = function (holder) { + if (holder.constructor === String) { + editor.key = holder; + instances[holder] = editor; + } + utils.domReady(function () { + editor.langIsReady ? renderUI() : editor.addListener("langReady", renderUI); + + function renderUI() { + editor.setOpt({ + labelMap: editor.options.labelMap || editor.getLang('labelMap') + }); + new EditorUI(editor.options); + if (holder) { + if (holder.constructor === String) { + holder = document.getElementById(holder); + } + holder && holder.getAttribute('name') && (editor.options.textarea = holder.getAttribute('name')); + if (holder && /script|textarea/ig.test(holder.tagName)) { + var newDiv = document.createElement('div'); + holder.parentNode.insertBefore(newDiv, holder); + var cont = holder.value || holder.innerHTML; + editor.options.initialContent = /^[\t\r\n ]*$/.test(cont) ? editor.options.initialContent : + cont.replace(/>[\n\r\t]+([ ]{4})+/g, '>') + .replace(/[\n\r\t]+([ ]{4})+[\n\r\t]+<'); + holder.className && (newDiv.className = holder.className); + holder.style.cssText && (newDiv.style.cssText = holder.style.cssText); + if (/textarea/i.test(holder.tagName)) { + editor.textarea = holder; + editor.textarea.style.display = 'none'; + + + } else { + holder.parentNode.removeChild(holder); + + + } + if (holder.id) { + newDiv.id = holder.id; + domUtils.removeAttributes(holder, 'id'); + } + holder = newDiv; + holder.innerHTML = ''; + } + + } + domUtils.addClass(holder, "edui-" + editor.options.theme); + editor.ui.render(holder); + var opt = editor.options; + //给实例添加一个编辑器的容器引用 + editor.container = editor.ui.getDom(); + var parents = domUtils.findParents(holder, true); + var displays = []; + for (var i = 0, ci; ci = parents[i]; i++) { + displays[i] = ci.style.display; + ci.style.display = 'block' + } + if (opt.initialFrameWidth) { + opt.minFrameWidth = opt.initialFrameWidth; + } else { + opt.minFrameWidth = opt.initialFrameWidth = holder.offsetWidth; + var styleWidth = holder.style.width; + if (/%$/.test(styleWidth)) { + opt.initialFrameWidth = styleWidth; + } + } + if (opt.initialFrameHeight) { + opt.minFrameHeight = opt.initialFrameHeight; + } else { + opt.initialFrameHeight = opt.minFrameHeight = holder.offsetHeight; + } + for (var i = 0, ci; ci = parents[i]; i++) { + ci.style.display = displays[i] + } + //编辑器最外容器设置了高度,会导致,编辑器不占位 + //todo 先去掉,没有找到原因 + if (holder.style.height) { + holder.style.height = '' + } + editor.container.style.width = opt.initialFrameWidth + (/%$/.test(opt.initialFrameWidth) ? '' : 'px'); + editor.container.style.zIndex = opt.zIndex; + oldRender.call(editor, editor.ui.getDom('iframeholder')); + editor.fireEvent("afteruiready"); + } + }) + }; + return editor; + }; + + + /** + * @file + * @name UE + * @short UE + * @desc UEditor的顶部命名空间 + */ + /** + * @name getEditor + * @since 1.2.4+ + * @grammar UE.getEditor(id,[opt]) => Editor实例 + * @desc 提供一个全局的方法得到编辑器实例 + * + * * ''id'' 放置编辑器的容器id, 如果容器下的编辑器已经存在,就直接返回 + * * ''opt'' 编辑器的可选参数 + * @example + * UE.getEditor('containerId',{onready:function(){//创建一个编辑器实例 + * this.setContent('hello') + * }}); + * UE.getEditor('containerId'); //返回刚创建的实例 + * + */ + UE.getEditor = function (id, opt) { + var editor = instances[id]; + if (!editor) { + editor = instances[id] = new UE.ui.Editor(opt); + editor.render(id); + } + return editor; + }; + + + UE.delEditor = function (id) { + var editor; + if (editor = instances[id]) { + editor.key && editor.destroy(); + delete instances[id] + } + }; + + UE.registerUI = function (uiName, fn, index, editorId) { + utils.each(uiName.split(/\s+/), function (name) { + UE._customizeUI[name] = { + id: editorId, + execFn: fn, + index: index + }; + }) + + } + + })(); + +// adapter/message.js + UE.registerUI('message', function (editor) { + + var editorui = baidu.editor.ui; + var Message = editorui.Message; + var holder; + var _messageItems = []; + var me = editor; + + me.addListener('ready', function () { + holder = document.getElementById(me.ui.id + '_message_holder'); + updateHolderPos(); + setTimeout(function () { + updateHolderPos(); + }, 500); + }); + + me.addListener('showmessage', function (type, opt) { + opt = utils.isString(opt) ? { + 'content': opt + } : opt; + var message = new Message({ + 'timeout': opt.timeout, + 'type': opt.type, + 'content': opt.content, + 'keepshow': opt.keepshow, + 'editor': me + }), + mid = opt.id || ('msg_' + (+new Date()).toString(36)); + message.render(holder); + _messageItems[mid] = message; + message.reset(opt); + updateHolderPos(); + return mid; + }); + + me.addListener('updatemessage', function (type, id, opt) { + opt = utils.isString(opt) ? { + 'content': opt + } : opt; + var message = _messageItems[id]; + message.render(holder); + message && message.reset(opt); + }); + + me.addListener('hidemessage', function (type, id) { + var message = _messageItems[id]; + message && message.hide(); + }); + + function updateHolderPos() { + var toolbarbox = me.ui.getDom('toolbarbox'); + if (toolbarbox) { + holder.style.top = toolbarbox.offsetHeight + 3 + 'px'; + } + holder.style.zIndex = Math.max(me.options.zIndex, me.iframe.style.zIndex) + 1; + } + + }); + + +// adapter/autosave.js + UE.registerUI('autosave', function (editor) { + var timer = null, uid = null; + editor.on('afterautosave', function () { + clearTimeout(timer); + + timer = setTimeout(function () { + if (uid) { + editor.trigger('hidemessage', uid); + } + uid = editor.trigger('showmessage', { + content: editor.getLang('autosave.success'), + timeout: 2000 + }); + + }, 2000) + }) + + }); + + +})(); diff --git a/admin/ueditor.all.min.js b/admin/ueditor.all.min.js new file mode 100644 index 0000000..9a18955 --- /dev/null +++ b/admin/ueditor.all.min.js @@ -0,0 +1,18 @@ +/*! + * UEditor + * version: ueditor + * build: Wed Aug 10 2016 11:06:03 GMT+0800 (CST) + */ + +!function(){function getListener(a,b,c){var d;return b=b.toLowerCase(),(d=a.__allListeners||c&&(a.__allListeners={}))&&(d[b]||c&&(d[b]=[]))}function getDomNode(a,b,c,d,e,f){var g,h=d&&a[b];for(!h&&(h=a[c]);!h&&(g=(g||a).parentNode);){if("BODY"==g.tagName||f&&!f(g))return null;h=g[c]}return h&&e&&!e(h)?getDomNode(h,b,c,!1,e):h}UEDITOR_CONFIG=window.UEDITOR_CONFIG||{};var baidu=window.baidu||{};window.baidu=baidu,window.UE=baidu.editor=window.UE||{},UE.plugins={},UE.commands={},UE.instants={},UE.I18N={},UE._customizeUI={},UE.version="1.4.3";var dom=UE.dom={},browser=UE.browser=function(){var a=navigator.userAgent.toLowerCase(),b=window.opera,c={ie:/(msie\s|trident.*rv:)([\w.]+)/.test(a),opera:!!b&&b.version,webkit:a.indexOf(" applewebkit/")>-1,mac:a.indexOf("macintosh")>-1,quirks:"BackCompat"==document.compatMode};c.gecko="Gecko"==navigator.product&&!c.webkit&&!c.opera&&!c.ie;var d=0;if(c.ie){var e=a.match(/(?:msie\s([\w.]+))/),f=a.match(/(?:trident.*rv:([\w.]+))/);d=e&&f&&e[1]&&f[1]?Math.max(1*e[1],1*f[1]):e&&e[1]?1*e[1]:f&&f[1]?1*f[1]:0,c.ie11Compat=11==document.documentMode,c.ie9Compat=9==document.documentMode,c.ie8=!!document.documentMode,c.ie8Compat=8==document.documentMode,c.ie7Compat=7==d&&!document.documentMode||7==document.documentMode,c.ie6Compat=d<7||c.quirks,c.ie9above=d>8,c.ie9below=d<9,c.ie11above=d>10,c.ie11below=d<11}if(c.gecko){var g=a.match(/rv:([\d\.]+)/);g&&(g=g[1].split("."),d=1e4*g[0]+100*(g[1]||0)+1*(g[2]||0))}return/chrome\/(\d+\.\d)/i.test(a)&&(c.chrome=+RegExp.$1),/(\d+\.\d)?(?:\.\d)?\s+safari\/?(\d+\.\d+)?/i.test(a)&&!/chrome/i.test(a)&&(c.safari=+(RegExp.$1||RegExp.$2)),c.opera&&(d=parseFloat(b.version())),c.webkit&&(d=parseFloat(a.match(/ applewebkit\/(\d+)/)[1])),c.version=d,c.isCompatible=!c.mobile&&(c.ie&&d>=6||c.gecko&&d>=10801||c.opera&&d>=9.5||c.air&&d>=1||c.webkit&&d>=522||!1),c}(),ie=browser.ie,webkit=browser.webkit,gecko=browser.gecko,opera=browser.opera,utils=UE.utils={each:function(a,b,c){if(null!=a)if(a.length===+a.length){for(var d=0,e=a.length;d=c&&a===b)return d=e,!1}),d},removeItem:function(a,b){for(var c=0,d=a.length;c'](?:(amp|lt|quot|gt|#39|nbsp|#\d+);)?/g,function(a,b){return b?a:{"<":"<","&":"&",'"':""",">":">","'":"'"}[a]}):""},unhtmlForUrl:function(a,b){return a?a.replace(b||/[<">']/g,function(a){return{"<":"<","&":"&",'"':""",">":">","'":"'"}[a]}):""},html:function(a){return a?a.replace(/&((g|l|quo)t|amp|#39|nbsp);/g,function(a){return{"<":"<","&":"&",""":'"',">":">","'":"'"," ":" "}[a]}):""},cssStyleToDomStyle:function(){var a=document.createElement("div").style,b={"float":void 0!=a.cssFloat?"cssFloat":void 0!=a.styleFloat?"styleFloat":"float"};return function(a){return b[a]||(b[a]=a.toLowerCase().replace(/-./g,function(a){return a.charAt(1).toUpperCase()}))}}(),loadFile:function(){function a(a,c){try{for(var d,e=0;d=b[e++];)if(d.doc===a&&d.url==(c.src||c.href))return d}catch(f){return null}}var b=[];return function(c,d,e){var f=a(c,d);if(f)return void(f.ready?e&&e():f.funs.push(e));if(b.push({doc:c,url:d.src||d.href,funs:[e]}),!c.body){var g=[];for(var h in d)"tag"!=h&&g.push(h+'="'+d[h]+'"');return void c.write("<"+d.tag+" "+g.join(" ")+" >")}if(!d.id||!c.getElementById(d.id)){var i=c.createElement(d.tag);delete d.tag;for(var h in d)i.setAttribute(h,d[h]);i.onload=i.onreadystatechange=function(){if(!this.readyState||/loaded|complete/.test(this.readyState)){if(f=a(c,d),f.funs.length>0){f.ready=1;for(var b;b=f.funs.pop();)b()}i.onload=i.onreadystatechange=null}},i.onerror=function(){throw Error("The load "+(d.href||d.src)+" fails,check the url settings of file ueditor.config.js ")},c.getElementsByTagName("head")[0].appendChild(i)}}}(),isEmptyObject:function(a){if(null==a)return!0;if(this.isArray(a)||this.isString(a))return 0===a.length;for(var b in a)if(a.hasOwnProperty(b))return!1;return!0},fixColor:function(a,b){if(/color/i.test(a)&&/rgba?/.test(b)){var c=b.split(",");if(c.length>3)return"";b="#";for(var d,e=0;d=c[e++];)d=parseInt(d.replace(/[^\d]/gi,""),10).toString(16),b+=1==d.length?"0"+d:d;b=b.toUpperCase()}return b},optCss:function(a){function b(a,b){if(!a)return"";var c=a.top,d=a.bottom,e=a.left,f=a.right,g="";if(c&&e&&d&&f)g+=";"+b+":"+(c==d&&d==e&&e==f?c:c==d&&e==f?c+" "+e:e==f?c+" "+e+" "+d:c+" "+f+" "+d+" "+e)+";";else for(var h in a)g+=";"+b+"-"+h+":"+a[h]+";";return g}var c,d;return a=a.replace(/(padding|margin|border)\-([^:]+):([^;]+);?/gi,function(a,b,e,f){if(1==f.split(" ").length)switch(b){case"padding":return!c&&(c={}),c[e]=f,"";case"margin":return!d&&(d={}),d[e]=f,"";case"border":return"initial"==f?"":a}return a}),a+=b(c,"padding")+b(d,"margin"),a.replace(/^[ \n\r\t;]*|[ \n\r\t]*$/,"").replace(/;([ \n\r\t]+)|\1;/g,";").replace(/(&((l|g)t|quot|#39))?;{2,}/g,function(a,b){return b?b+";;":";"})},clone:function(a,b){var c;b=b||{};for(var d in a)a.hasOwnProperty(d)&&(c=a[d],"object"==typeof c?(b[d]=utils.isArray(c)?[]:{},utils.clone(a[d],b[d])):b[d]=c);return b},transUnitToPx:function(a){if(!/(pt|cm)/.test(a))return a;var b;switch(a.replace(/([\d.]+)(\w+)/,function(c,d,e){a=d,b=e}),b){case"cm":a=25*parseFloat(a);break;case"pt":a=Math.round(96*parseFloat(a)/72)}return a+(a?"px":"")},domReady:function(){function a(a){a.isReady=!0;for(var c;c=b.pop();c());}var b=[];return function(c,d){d=d||window;var e=d.document;c&&b.push(c),"complete"===e.readyState?a(e):(e.isReady&&a(e),browser.ie&&11!=browser.version?(!function(){if(!e.isReady){try{e.documentElement.doScroll("left")}catch(b){return void setTimeout(arguments.callee,0)}a(e)}}(),d.attachEvent("onload",function(){a(e)})):(e.addEventListener("DOMContentLoaded",function(){e.removeEventListener("DOMContentLoaded",arguments.callee,!1),a(e)},!1),d.addEventListener("load",function(){a(e)},!1)))}}(),cssRule:browser.ie&&11!=browser.version?function(a,b,c){var d,e;if(void 0===b||b&&b.nodeType&&9==b.nodeType){if(c=b&&b.nodeType&&9==b.nodeType?b:c||document,d=c.indexList||(c.indexList={}),e=d[a],void 0!==e)return c.styleSheets[e].cssText}else{if(c=c||document,d=c.indexList||(c.indexList={}),e=d[a],""===b)return void 0!==e&&(c.styleSheets[e].cssText="",delete d[a],!0);void 0!==e?sheetStyle=c.styleSheets[e]:(sheetStyle=c.createStyleSheet("",e=c.styleSheets.length),d[a]=e),sheetStyle.cssText=b}}:function(a,b,c){var d;return void 0===b||b&&b.nodeType&&9==b.nodeType?(c=b&&b.nodeType&&9==b.nodeType?b:c||document,d=c.getElementById(a),d?d.innerHTML:void 0):(c=c||document,d=c.getElementById(a),""===b?!!d&&(d.parentNode.removeChild(d),!0):void(d?d.innerHTML=b:(d=c.createElement("style"),d.id=a,d.innerHTML=b,c.getElementsByTagName("head")[0].appendChild(d))))},sort:function(a,b){b=b||function(a,b){return a.localeCompare(b)};for(var c=0,d=a.length;c0){var g=a[c];a[c]=a[e],a[e]=g}return a},serializeParam:function(a){var b=[];for(var c in a)if("method"!=c&&"timeout"!=c&&"async"!=c)if("function"!=(typeof a[c]).toLowerCase()&&"object"!=(typeof a[c]).toLowerCase())b.push(encodeURIComponent(c)+"="+encodeURIComponent(a[c]));else if(utils.isArray(a[c]))for(var d=0;d1||b!==a.parentNode){a.style.cssText=b.style.cssText+";"+a.style.cssText,b=b.parentNode;continue}b.style.cssText+=";"+a.style.cssText,"A"==b.tagName&&(b.style.textDecoration="underline")}if("A"!=b.tagName){b===a.parentNode&&domUtils.remove(a,!0);break}}b=b.parentNode}},mergeSibling:function(a,b,c){function d(a,b,c){var d;if((d=c[a])&&!domUtils.isBookmarkNode(d)&&1==d.nodeType&&domUtils.isSameElement(c,d)){for(;d.firstChild;)"firstChild"==b?c.insertBefore(d.lastChild,c.firstChild):c.appendChild(d.firstChild);domUtils.remove(d)}}!b&&d("previousSibling","firstChild",a),!c&&d("nextSibling","lastChild",a)},unSelectable:ie&&browser.ie9below||browser.opera?function(a){a.onselectstart=function(){return!1},a.onclick=a.onkeyup=a.onkeydown=function(){return!1},a.unselectable="on",a.setAttribute("unselectable","on");for(var b,c=0;b=a.all[c++];)switch(b.tagName.toLowerCase()){case"iframe":case"textarea":case"input":case"select":break;default:b.unselectable="on",a.setAttribute("unselectable","on")}}:function(a){a.style.MozUserSelect=a.style.webkitUserSelect=a.style.msUserSelect=a.style.KhtmlUserSelect="none"},removeAttributes:function(a,b){b=utils.isArray(b)?b:utils.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0;c=b[d++];){switch(c=attrFix[c]||c){case"className":a[c]="";break;case"style":a.style.cssText="";var e=a.getAttributeNode("style");!browser.ie&&e&&a.removeAttributeNode(e)}a.removeAttribute(c)}},createElement:function(a,b,c){return domUtils.setAttributes(a.createElement(b),c)},setAttributes:function(a,b){for(var c in b)if(b.hasOwnProperty(c)){var d=b[c];switch(c){case"class":a.className=d;break;case"style":a.style.cssText=a.style.cssText+";"+d;break;case"innerHTML":a[c]=d;break;case"value":a.value=d;break;default:a.setAttribute(attrFix[c]||c,d)}}return a},getComputedStyle:function(a,b){var c="width height top left";if(c.indexOf(b)>-1)return a["offset"+b.replace(/^\w/,function(a){return a.toUpperCase()})]+"px";if(3==a.nodeType&&(a=a.parentNode),browser.ie&&browser.version<9&&"font-size"==b&&!a.style.fontSize&&!dtd.$empty[a.tagName]&&!dtd.$nonChild[a.tagName]){var d=a.ownerDocument.createElement("span");d.style.cssText="padding:0;border:0;font-family:simsun;",d.innerHTML=".",a.appendChild(d);var e=d.offsetHeight;return a.removeChild(d),d=null,e+"px"}try{var f=domUtils.getStyle(a,b)||(window.getComputedStyle?domUtils.getWindow(a).getComputedStyle(a,"").getPropertyValue(b):(a.currentStyle||a.style)[utils.cssStyleToDomStyle(b)])}catch(g){return""}return utils.transUnitToPx(utils.fixColor(b,f))},removeClasses:function(a,b){b=utils.isArray(b)?b:utils.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)e=e.replace(new RegExp("\\b"+c+"\\b"),"");e=utils.trim(e).replace(/[ ]{2,}/g," "),e?a.className=e:domUtils.removeAttributes(a,["class"])},addClass:function(a,b){if(a){b=utils.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)new RegExp("\\b"+c+"\\b").test(e)||(e+=" "+c);a.className=utils.trim(e)}},hasClass:function(a,b){if(utils.isRegExp(b))return b.test(a.className);b=utils.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)if(!new RegExp("\\b"+c+"\\b","i").test(e))return!1;return d-1==b.length},preventDefault:function(a){a.preventDefault?a.preventDefault():a.returnValue=!1},removeStyle:function(a,b){browser.ie?("color"==b&&(b="(^|;)"+b),a.style.cssText=a.style.cssText.replace(new RegExp(b+"[^:]*:[^;]+;?","ig"),"")):a.style.removeProperty?a.style.removeProperty(b):a.style.removeAttribute(utils.cssStyleToDomStyle(b)),a.style.cssText||domUtils.removeAttributes(a,["style"])},getStyle:function(a,b){var c=a.style[utils.cssStyleToDomStyle(b)];return utils.fixColor(b,c)},setStyle:function(a,b,c){a.style[utils.cssStyleToDomStyle(b)]=c,utils.trim(a.style.cssText)||this.removeAttributes(a,"style")},setStyles:function(a,b){for(var c in b)b.hasOwnProperty(c)&&domUtils.setStyle(a,c,b[c])},removeDirtyAttr:function(a){for(var b,c=0,d=a.getElementsByTagName("*");b=d[c++];)b.removeAttribute("_moz_dirty");a.removeAttribute("_moz_dirty")},getChildCount:function(a,b){var c=0,d=a.firstChild;for(b=b||function(){return 1};d;)b(d)&&c++,d=d.nextSibling;return c},isEmptyNode:function(a){return!a.firstChild||0==domUtils.getChildCount(a,function(a){return!domUtils.isBr(a)&&!domUtils.isBookmarkNode(a)&&!domUtils.isWhitespace(a)})},clearSelectedArr:function(a){for(var b;b=a.pop();)domUtils.removeAttributes(b,["class"])},scrollToView:function(a,b,c){var d=function(){var a=b.document,c="CSS1Compat"==a.compatMode;return{width:(c?a.documentElement.clientWidth:a.body.clientWidth)||0,height:(c?a.documentElement.clientHeight:a.body.clientHeight)||0}},e=function(a){if("pageXOffset"in a)return{x:a.pageXOffset||0,y:a.pageYOffset||0};var b=a.document;return{x:b.documentElement.scrollLeft||b.body.scrollLeft||0,y:b.documentElement.scrollTop||b.body.scrollTop||0}},f=d().height,g=f*-1+c;g+=a.offsetHeight||0;var h=domUtils.getXY(a);g+=h.y;var i=e(b).y;(g>i||g0)return 0;for(var c in dtd.$isNotEmpty)if(a.getElementsByTagName(c).length)return 0;return 1},setViewportOffset:function(a,b){var c=0|parseInt(a.style.left),d=0|parseInt(a.style.top),e=a.getBoundingClientRect(),f=b.left-e.left,g=b.top-e.top;f&&(a.style.left=c+f+"px"),g&&(a.style.top=d+g+"px")},fillNode:function(a,b){var c=browser.ie?a.createTextNode(domUtils.fillChar):a.createElement("br");b.innerHTML="",b.appendChild(c)},moveChild:function(a,b,c){for(;a.firstChild;)c&&b.firstChild?b.insertBefore(a.lastChild,b.firstChild):b.appendChild(a.firstChild)},hasNoAttributes:function(a){return browser.ie?/^<\w+\s*?>/.test(a.outerHTML):0==a.attributes.length},isCustomeNode:function(a){return 1==a.nodeType&&a.getAttribute("_ue_custom_node_")},isTagNode:function(a,b){return 1==a.nodeType&&new RegExp("\\b"+a.tagName+"\\b","i").test(b)},filterNodeList:function(a,b,c){var d=[];if(!utils.isFunction(b)){var e=b;b=function(a){return utils.indexOf(utils.isArray(e)?e:e.split(" "),a.tagName.toLowerCase())!=-1}}return utils.each(a,function(a){b(a)&&d.push(a)}),0==d.length?null:1!=d.length&&c?d:d[0]},isInNodeEndBoundary:function(a,b){var c=a.startContainer;if(3==c.nodeType&&a.startOffset!=c.nodeValue.length)return 0;if(1==c.nodeType&&a.startOffset!=c.childNodes.length)return 0;for(;c!==b;){if(c.nextSibling)return 0;c=c.parentNode}return 1},isBoundaryNode:function(a,b){for(var c;!domUtils.isBody(a);)if(c=a,a=a.parentNode,c!==a[b])return!1;return!0},fillHtml:browser.ie11below?" ":"
      "},fillCharReg=new RegExp(domUtils.fillChar,"g");!function(){function a(a){a.collapsed=a.startContainer&&a.endContainer&&a.startContainer===a.endContainer&&a.startOffset==a.endOffset}function b(a){return!a.collapsed&&1==a.startContainer.nodeType&&a.startContainer===a.endContainer&&a.endOffset-a.startOffset==1}function c(b,c,d,e){return 1==c.nodeType&&(dtd.$empty[c.tagName]||dtd.$nonChild[c.tagName])&&(d=domUtils.getNodeIndex(c)+(b?0:1),c=c.parentNode),b?(e.startContainer=c,e.startOffset=d,e.endContainer||e.collapse(!0)):(e.endContainer=c,e.endOffset=d,e.startContainer||e.collapse(!1)),a(e),e}function d(a,b){var c,d,e=a.startContainer,f=a.endContainer,g=a.startOffset,h=a.endOffset,i=a.document,j=i.createDocumentFragment();if(1==e.nodeType&&(e=e.childNodes[g]||(c=e.appendChild(i.createTextNode("")))),1==f.nodeType&&(f=f.childNodes[h]||(d=f.appendChild(i.createTextNode("")))),e===f&&3==e.nodeType)return j.appendChild(i.createTextNode(e.substringData(g,h-g))),b&&(e.deleteData(g,h-g),a.collapse(!0)),j;for(var k,l,m=j,n=domUtils.findParents(e,!0),o=domUtils.findParents(f,!0),p=0;n[p]==o[p];)p++;for(var q,r=p;q=n[r];r++){for(k=q.nextSibling,q==e?c||(3==a.startContainer.nodeType?(m.appendChild(i.createTextNode(e.nodeValue.slice(g))),b&&e.deleteData(g,e.nodeValue.length-g)):m.appendChild(b?e:e.cloneNode(!0))):(l=q.cloneNode(!1),m.appendChild(l));k&&k!==f&&k!==o[r];)q=k.nextSibling,m.appendChild(b?k:k.cloneNode(!0)),k=q;m=l}m=j,n[p]||(m.appendChild(n[p-1].cloneNode(!1)),m=m.firstChild);for(var s,r=p;s=o[r];r++){if(k=s.previousSibling,s==f?d||3!=a.endContainer.nodeType||(m.appendChild(i.createTextNode(f.substringData(0,h))),b&&f.deleteData(0,h)):(l=s.cloneNode(!1),m.appendChild(l)),r!=p||!n[p])for(;k&&k!==e;)s=k.previousSibling,m.insertBefore(b?k:k.cloneNode(!0),m.firstChild),k=s;m=l}return b&&a.setStartBefore(o[p]?n[p]?o[p]:n[p-1]:o[p-1]).collapse(!0),c&&domUtils.remove(c),d&&domUtils.remove(d),j}function e(a,b){try{if(g&&domUtils.inDoc(g,a))if(g.nodeValue.replace(fillCharReg,"").length)g.nodeValue=g.nodeValue.replace(fillCharReg,"");else{var c=g.parentNode;for(domUtils.remove(g);c&&domUtils.isEmptyInlineElement(c)&&(browser.safari?!(domUtils.getPosition(c,b)&domUtils.POSITION_CONTAINS):!c.contains(b));)g=c.parentNode,domUtils.remove(c),c=g}}catch(d){} +}function f(a,b){var c;for(a=a[b];a&&domUtils.isFillChar(a);)c=a[b],domUtils.remove(a),a=c}var g,h=0,i=domUtils.fillChar,j=dom.Range=function(a){var b=this;b.startContainer=b.startOffset=b.endContainer=b.endOffset=null,b.document=a,b.collapsed=!0};j.prototype={cloneContents:function(){return this.collapsed?null:d(this,0)},deleteContents:function(){var a;return this.collapsed||d(this,1),browser.webkit&&(a=this.startContainer,3!=a.nodeType||a.nodeValue.length||(this.setStartBefore(a).collapse(!0),domUtils.remove(a))),this},extractContents:function(){return this.collapsed?null:d(this,2)},setStart:function(a,b){return c(!0,a,b,this)},setEnd:function(a,b){return c(!1,a,b,this)},setStartAfter:function(a){return this.setStart(a.parentNode,domUtils.getNodeIndex(a)+1)},setStartBefore:function(a){return this.setStart(a.parentNode,domUtils.getNodeIndex(a))},setEndAfter:function(a){return this.setEnd(a.parentNode,domUtils.getNodeIndex(a)+1)},setEndBefore:function(a){return this.setEnd(a.parentNode,domUtils.getNodeIndex(a))},setStartAtFirst:function(a){return this.setStart(a,0)},setStartAtLast:function(a){return this.setStart(a,3==a.nodeType?a.nodeValue.length:a.childNodes.length)},setEndAtFirst:function(a){return this.setEnd(a,0)},setEndAtLast:function(a){return this.setEnd(a,3==a.nodeType?a.nodeValue.length:a.childNodes.length)},selectNode:function(a){return this.setStartBefore(a).setEndAfter(a)},selectNodeContents:function(a){return this.setStart(a,0).setEndAtLast(a)},cloneRange:function(){var a=this;return new j(a.document).setStart(a.startContainer,a.startOffset).setEnd(a.endContainer,a.endOffset)},collapse:function(a){var b=this;return a?(b.endContainer=b.startContainer,b.endOffset=b.startOffset):(b.startContainer=b.endContainer,b.startOffset=b.endOffset),b.collapsed=!0,b},shrinkBoundary:function(a){function b(a){return 1==a.nodeType&&!domUtils.isBookmarkNode(a)&&!dtd.$empty[a.tagName]&&!dtd.$nonChild[a.tagName]}for(var c,d=this,e=d.collapsed;1==d.startContainer.nodeType&&(c=d.startContainer.childNodes[d.startOffset])&&b(c);)d.setStart(c,0);if(e)return d.collapse(!0);if(!a)for(;1==d.endContainer.nodeType&&d.endOffset>0&&(c=d.endContainer.childNodes[d.endOffset-1])&&b(c);)d.setEnd(c,c.childNodes.length);return d},getCommonAncestor:function(a,c){var d=this,e=d.startContainer,f=d.endContainer;return e===f?a&&b(this)&&(e=e.childNodes[d.startOffset],1==e.nodeType)?e:c&&3==e.nodeType?e.parentNode:e:domUtils.getCommonAncestor(e,f)},trimBoundary:function(a){this.txtToElmBoundary();var b=this.startContainer,c=this.startOffset,d=this.collapsed,e=this.endContainer;if(3==b.nodeType){if(0==c)this.setStartBefore(b);else if(c>=b.nodeValue.length)this.setStartAfter(b);else{var f=domUtils.split(b,c);b===e?this.setEnd(f,this.endOffset-c):b.parentNode===e&&(this.endOffset+=1),this.setStartBefore(f)}if(d)return this.collapse(!0)}return a||(c=this.endOffset,e=this.endContainer,3==e.nodeType&&(0==c?this.setEndBefore(e):(c=c.nodeValue.length&&a["set"+b.replace(/(\w)/,function(a){return a.toUpperCase()})+"After"](c):a["set"+b.replace(/(\w)/,function(a){return a.toUpperCase()})+"Before"](c))}return!a&&this.collapsed||(b(this,"start"),b(this,"end")),this},insertNode:function(a){var b=a,c=1;11==a.nodeType&&(b=a.firstChild,c=a.childNodes.length),this.trimBoundary(!0);var d=this.startContainer,e=this.startOffset,f=d.childNodes[e];return f?d.insertBefore(a,f):d.appendChild(a),b.parentNode===this.endContainer&&(this.endOffset=this.endOffset+c),this.setStartBefore(b)},setCursor:function(a,b){return this.collapse(!a).select(b)},createBookmark:function(a,b){var c,d=this.document.createElement("span");return d.style.cssText="display:none;line-height:0px;",d.appendChild(this.document.createTextNode("‍")),d.id="_baidu_bookmark_start_"+(b?"":h++),this.collapsed||(c=d.cloneNode(!0),c.id="_baidu_bookmark_end_"+(b?"":h++)),this.insertNode(d),c&&this.collapse().insertNode(c).setEndBefore(c),this.setStartAfter(d),{start:a?d.id:d,end:c?a?c.id:c:null,id:a}},moveToBookmark:function(a){var b=a.id?this.document.getElementById(a.start):a.start,c=a.end&&a.id?this.document.getElementById(a.end):a.end;return this.setStartBefore(b),domUtils.remove(b),c?(this.setEndBefore(c),domUtils.remove(c)):this.collapse(!0),this},enlarge:function(a,b){var c,d,e=domUtils.isBody,f=this.document.createTextNode("");if(a){for(d=this.startContainer,1==d.nodeType?d.childNodes[this.startOffset]?c=d=d.childNodes[this.startOffset]:(d.appendChild(f),c=d=f):c=d;;){if(domUtils.isBlockElm(d)){for(d=c;(c=d.previousSibling)&&!domUtils.isBlockElm(c);)d=c;this.setStartBefore(d);break}c=d,d=d.parentNode}for(d=this.endContainer,1==d.nodeType?((c=d.childNodes[this.endOffset])?d.insertBefore(f,c):d.appendChild(f),c=d=f):c=d;;){if(domUtils.isBlockElm(d)){for(d=c;(c=d.nextSibling)&&!domUtils.isBlockElm(c);)d=c;this.setEndAfter(d);break}c=d,d=d.parentNode}f.parentNode===this.endContainer&&this.endOffset--,domUtils.remove(f)}if(!this.collapsed){for(;!(0!=this.startOffset||b&&b(this.startContainer)||e(this.startContainer));)this.setStartBefore(this.startContainer);for(;!(this.endOffset!=(1==this.endContainer.nodeType?this.endContainer.childNodes.length:this.endContainer.nodeValue.length)||b&&b(this.endContainer)||e(this.endContainer));)this.setEndAfter(this.endContainer)}return this},enlargeToBlockElm:function(a){for(;!domUtils.isBlockElm(this.startContainer);)this.setStartBefore(this.startContainer);if(!a)for(;!domUtils.isBlockElm(this.endContainer);)this.setEndAfter(this.endContainer);return this},adjustmentBoundary:function(){if(!this.collapsed){for(;!domUtils.isBody(this.startContainer)&&this.startOffset==this.startContainer[3==this.startContainer.nodeType?"nodeValue":"childNodes"].length&&this.startContainer[3==this.startContainer.nodeType?"nodeValue":"childNodes"].length;)this.setStartAfter(this.startContainer);for(;!domUtils.isBody(this.endContainer)&&!this.endOffset&&this.endContainer[3==this.endContainer.nodeType?"nodeValue":"childNodes"].length;)this.setEndBefore(this.endContainer)}return this},applyInlineStyle:function(a,b,c){if(this.collapsed)return this;this.trimBoundary().enlarge(!1,function(a){return 1==a.nodeType&&domUtils.isBlockElm(a)}).adjustmentBoundary();for(var d,e,f=this.createBookmark(),g=f.end,h=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase():!domUtils.isWhitespace(a)},i=domUtils.getNextDomNode(f.start,!1,h),j=this.cloneRange();i&&domUtils.getPosition(i,g)&domUtils.POSITION_PRECEDING;)if(3==i.nodeType||dtd[a][i.tagName]){for(j.setStartBefore(i),d=i;d&&(3==d.nodeType||dtd[a][d.tagName])&&d!==g;)e=d,d=domUtils.getNextDomNode(d,1==d.nodeType,null,function(b){return dtd[a][b.tagName]});var k,l=j.setEndAfter(e).extractContents();if(c&&c.length>0){var m,n;n=m=c[0].cloneNode(!1);for(var o,p=1;o=c[p++];)m.appendChild(o.cloneNode(!1)),m=m.firstChild;k=m}else k=j.document.createElement(a);b&&domUtils.setAttributes(k,b),k.appendChild(l),j.insertNode(c?n:k);var q;if("span"==a&&b.style&&/text\-decoration/.test(b.style)&&(q=domUtils.findParentByTagName(k,"a",!0))?(domUtils.setAttributes(q,b),domUtils.remove(k,!0),k=q):(domUtils.mergeSibling(k),domUtils.clearEmptySibling(k)),domUtils.mergeChild(k,b),i=domUtils.getNextDomNode(k,!1,h),domUtils.mergeToParent(k),d===g)break}else i=domUtils.getNextDomNode(i,!0,h);return this.moveToBookmark(f)},removeInlineStyle:function(a){if(this.collapsed)return this;a=utils.isArray(a)?a:[a],this.shrinkBoundary().adjustmentBoundary();for(var b=this.startContainer,c=this.endContainer;;){if(1==b.nodeType){if(utils.indexOf(a,b.tagName.toLowerCase())>-1)break;if("body"==b.tagName.toLowerCase()){b=null;break}}b=b.parentNode}for(;;){if(1==c.nodeType){if(utils.indexOf(a,c.tagName.toLowerCase())>-1)break;if("body"==c.tagName.toLowerCase()){c=null;break}}c=c.parentNode}var d,e,f=this.createBookmark();b&&(e=this.cloneRange().setEndBefore(f.start).setStartBefore(b),d=e.extractContents(),e.insertNode(d),domUtils.clearEmptySibling(b,!0),b.parentNode.insertBefore(f.start,b)),c&&(e=this.cloneRange().setStartAfter(f.end).setEndAfter(c),d=e.extractContents(),e.insertNode(d),domUtils.clearEmptySibling(c,!1,!0),c.parentNode.insertBefore(f.end,c.nextSibling));for(var g,h=domUtils.getNextDomNode(f.start,!1,function(a){return 1==a.nodeType});h&&h!==f.end;)g=domUtils.getNextDomNode(h,!0,function(a){return 1==a.nodeType}),utils.indexOf(a,h.tagName.toLowerCase())>-1&&domUtils.remove(h,!0),h=g;return this.moveToBookmark(f)},getClosedNode:function(){var a;if(!this.collapsed){var c=this.cloneRange().adjustmentBoundary().shrinkBoundary();if(b(c)){var d=c.startContainer.childNodes[c.startOffset];d&&1==d.nodeType&&(dtd.$empty[d.tagName]||dtd.$nonChild[d.tagName])&&(a=d)}}return a},select:browser.ie?function(a,b){var c;this.collapsed||this.shrinkBoundary();var d=this.getClosedNode();if(d&&!b){try{c=this.document.body.createControlRange(),c.addElement(d),c.select()}catch(h){}return this}var j,k=this.createBookmark(),l=k.start;if(c=this.document.body.createTextRange(),c.moveToElementText(l),c.moveStart("character",1),this.collapsed){if(!a&&3!=this.startContainer.nodeType){var m=this.document.createTextNode(i),n=this.document.createElement("span");n.appendChild(this.document.createTextNode(i)),l.parentNode.insertBefore(n,l),l.parentNode.insertBefore(m,l),e(this.document,m),g=m,f(n,"previousSibling"),f(l,"nextSibling"),c.moveStart("character",-1),c.collapse(!0)}}else{var o=this.document.body.createTextRange();j=k.end,o.moveToElementText(j),c.setEndPoint("EndToEnd",o)}this.moveToBookmark(k),n&&domUtils.remove(n);try{c.select()}catch(h){}return this}:function(a){function b(a){function b(b,c,d){3==b.nodeType&&b.nodeValue.length0)j=k-1;else{if(!(l<0))return{container:d,offset:c(e)};i=k+1}}if(k==-1){if(h.moveToElementText(d),h.setEndPoint("StartToStart",a),f=h.text.replace(/(\r\n|\r)/g,"\n").length,g=d.childNodes,!f)return e=g[g.length-1],{container:e,offset:e.nodeValue.length};for(var m=g.length;f>0;)f-=g[--m].nodeValue.length;return{container:g[m],offset:-f}}if(h.collapse(l>0),h.setEndPoint(l>0?"StartToStart":"EndToStart",a),f=h.text.replace(/(\r\n|\r)/g,"\n").length,!f)return dtd.$empty[e.tagName]||dtd.$nonChild[e.tagName]?{container:d,offset:c(e)+(l>0?0:1)}:{container:e,offset:l>0?0:e.childNodes.length};for(;f>0;)try{var n=e;e=e[l>0?"previousSibling":"nextSibling"],f-=e.nodeValue.length}catch(o){return{container:d,offset:c(n)}}return{container:e,offset:l>0?-f:e.nodeValue.length+f}}function b(b,c){if(b.item)c.selectNode(b.item(0));else{var d=a(b,!0);c.setStart(d.container,d.offset),0!=b.compareEndPoints("StartToEnd",b)&&(d=a(b,!1),c.setEnd(d.container,d.offset))}return c}function c(a){var b;try{b=a.getNative().createRange()}catch(c){return null}var d=b.item?b.item(0):b.parentElement();return(d.ownerDocument||d)===a.document?b:null}var d=dom.Selection=function(a){var b,d=this;d.document=a,browser.ie9below&&(b=domUtils.getWindow(a).frameElement,domUtils.on(b,"beforedeactivate",function(){d._bakIERange=d.getIERange()}),domUtils.on(b,"activate",function(){try{!c(d)&&d._bakIERange&&d._bakIERange.select()}catch(a){}d._bakIERange=null})),b=a=null};d.prototype={rangeInBody:function(a,b){var c=browser.ie9below||b?a.item?a.item():a.parentElement():a.startContainer;return c===this.document.body||domUtils.inDoc(c,this.document)},getNative:function(){var a=this.document;try{return a?browser.ie9below?a.selection:domUtils.getWindow(a).getSelection():null}catch(b){return null}},getIERange:function(){var a=c(this);return!a&&this._bakIERange?this._bakIERange:a},cache:function(){this.clear(),this._cachedRange=this.getRange(),this._cachedStartElement=this.getStart(),this._cachedStartElementPath=this.getStartElementPath()},getStartElementPath:function(){if(this._cachedStartElementPath)return this._cachedStartElementPath;var a=this.getStart();return a?domUtils.findParents(a,!0,null,!0):[]},clear:function(){this._cachedStartElementPath=this._cachedRange=this._cachedStartElement=null},isFocus:function(){try{if(browser.ie9below){var a=c(this);return!(!a||!this.rangeInBody(a))}return!!this.getNative().rangeCount}catch(b){return!1}},getRange:function(){function a(a){for(var b=c.document.body.firstChild,d=a.collapsed;b&&b.firstChild;)a.setStart(b,0),b=b.firstChild;a.startContainer||a.setStart(c.document.body,0),d&&a.collapse(!0)}var c=this;if(null!=c._cachedRange)return this._cachedRange;var d=new baidu.editor.dom.Range(c.document);if(browser.ie9below){var e=c.getIERange();if(e)try{b(e,d)}catch(f){a(d)}else a(d)}else{var g=c.getNative();if(g&&g.rangeCount){var h=g.getRangeAt(0),i=g.getRangeAt(g.rangeCount-1);d.setStart(h.startContainer,h.startOffset).setEnd(i.endContainer,i.endOffset),d.collapsed&&domUtils.isBody(d.startContainer)&&!d.startOffset&&a(d)}else{if(this._bakRange&&domUtils.inDoc(this._bakRange.startContainer,this.document))return this._bakRange;a(d)}}return this._bakRange=d},getStart:function(){if(this._cachedStartElement)return this._cachedStartElement;var a,b,c,d,e=browser.ie9below?this.getIERange():this.getRange();if(browser.ie9below){if(!e)return this.document.body.firstChild;if(e.item)return e.item(0);for(a=e.duplicate(),a.text.length>0&&a.moveStart("character",1),a.collapse(1),b=a.parentElement(),d=c=e.parentElement();c=c.parentNode;)if(c==b){b=d;break}}else if(e.shrinkBoundary(),b=e.startContainer,1==b.nodeType&&b.hasChildNodes()&&(b=b.childNodes[Math.min(b.childNodes.length-1,e.startOffset)]),3==b.nodeType)return b.parentNode;return b},getText:function(){var a,b;return this.isFocus()&&(a=this.getNative())?(b=browser.ie9below?a.createRange():a.getRangeAt(0),browser.ie9below?b.text:b.toString()):""},clearRange:function(){this.getNative()[browser.ie9below?"empty":"removeAllRanges"]()}}}(),function(){function a(a,b){var c;if(b.textarea)if(utils.isString(b.textarea)){for(var d,e=0,f=domUtils.getElementsByTagName(a,"textarea");d=f[e++];)if(d.id=="ueditor_textarea_"+b.options.textarea){c=d;break}}else c=b.textarea;c||(a.appendChild(c=domUtils.createElement(document,"textarea",{name:b.options.textarea,id:"ueditor_textarea_"+b.options.textarea,style:"display:none"})),b.textarea=c),!c.getAttribute("name")&&c.setAttribute("name",b.options.textarea),c.value=b.hasContents()?b.options.allHtmlEnabled?b.getAllHtml():b.getContent(null,null,!0):""}function b(a){for(var b in a)return b}function c(a){a.langIsReady=!0,a.fireEvent("langReady")}var d,e=0,f=UE.Editor=function(a){var d=this;d.uid=e++,EventBase.call(d),d.commands={},d.options=utils.extend(utils.clone(a||{}),UEDITOR_CONFIG,!0),d.shortcutkeys={},d.inputRules=[],d.outputRules=[],d.setOpt(f.defaultOptions(d)),d.loadServerConfig(),utils.isEmptyObject(UE.I18N)?utils.loadFile(document,{src:d.options.langPath+d.options.lang+"/"+d.options.lang+".js",tag:"script",type:"text/javascript",defer:"defer"},function(){UE.plugin.load(d),c(d)}):(d.options.lang=b(UE.I18N),UE.plugin.load(d),c(d)),UE.instants["ueditorInstant"+d.uid]=d};f.prototype={registerCommand:function(a,b){this.commands[a]=b},ready:function(a){var b=this;a&&(b.isReady?a.apply(b):b.addListener("ready",a))},setOpt:function(a,b){var c={};utils.isString(a)?c[a]=b:c=a,utils.extend(this.options,c,!0)},getOpt:function(a){return this.options[a]},destroy:function(){var a=this;a.fireEvent("destroy");var b=a.container.parentNode,c=a.textarea;c?c.style.display="":(c=document.createElement("textarea"),b.parentNode.insertBefore(c,b)),c.style.width=a.iframe.offsetWidth+"px",c.style.height=a.iframe.offsetHeight+"px",c.value=a.getContent(),c.id=a.key,b.innerHTML="",domUtils.remove(b);var d=a.key;for(var e in a)a.hasOwnProperty(e)&&delete this[e];UE.delEditor(d)},render:function(a){var b=this,c=b.options,d=function(b){return parseInt(domUtils.getComputedStyle(a,b))};if(utils.isString(a)&&(a=document.getElementById(a)),a){c.initialFrameWidth?c.minFrameWidth=c.initialFrameWidth:c.minFrameWidth=c.initialFrameWidth=a.offsetWidth,c.initialFrameHeight?c.minFrameHeight=c.initialFrameHeight:c.initialFrameHeight=c.minFrameHeight=a.offsetHeight,a.style.width=/%$/.test(c.initialFrameWidth)?"100%":c.initialFrameWidth-d("padding-left")-d("padding-right")+"px",a.style.height=/%$/.test(c.initialFrameHeight)?"100%":c.initialFrameHeight-d("padding-top")-d("padding-bottom")+"px",a.style.zIndex=c.zIndex;var e=(ie&&browser.version<9?"":"")+""+(c.iframeCssUrl?"":"")+(c.initialStyle?"":"")+"";a.appendChild(domUtils.createElement(document,"iframe",{id:"ueditor_"+b.uid,width:"100%",height:"100%",frameborder:"0",src:"javascript:void(function(){document.open();"+(c.customDomain&&document.domain!=location.hostname?'document.domain="'+document.domain+'";':"")+'document.write("'+e+'");document.close();}())'})),a.style.overflow="hidden",setTimeout(function(){/%$/.test(c.initialFrameWidth)&&(c.minFrameWidth=c.initialFrameWidth=a.offsetWidth),/%$/.test(c.initialFrameHeight)&&(c.minFrameHeight=c.initialFrameHeight=a.offsetHeight,a.style.height=c.initialFrameHeight+"px")})}},_setup:function(b){var c=this,d=c.options;ie?(b.body.disabled=!0,b.body.contentEditable=!0,b.body.disabled=!1):b.body.contentEditable=!0,b.body.spellcheck=!1,c.document=b,c.window=b.defaultView||b.parentWindow,c.iframe=c.window.frameElement,c.body=b.body,c.selection=new dom.Selection(b);var e;browser.gecko&&(e=this.selection.getNative())&&e.removeAllRanges(),this._initEvents();for(var f=this.iframe.parentNode;!domUtils.isBody(f);f=f.parentNode)if("FORM"==f.tagName){c.form=f,c.options.autoSyncData?domUtils.on(c.window,"blur",function(){a(f,c)}):domUtils.on(f,"submit",function(){a(this,c)});break}if(d.initialContent)if(d.autoClearinitialContent){var g=c.execCommand;c.execCommand=function(){return c.fireEvent("firstBeforeExecCommand"),g.apply(c,arguments)},this._setDefaultContent(d.initialContent)}else this.setContent(d.initialContent,!1,!0);domUtils.isEmptyNode(c.body)&&(c.body.innerHTML="

      "+(browser.ie?"":"
      ")+"

      "),d.focus&&setTimeout(function(){c.focus(c.options.focusInEnd),!c.options.autoClearinitialContent&&c._selectionChange()},0),c.container||(c.container=this.iframe.parentNode),d.fullscreen&&c.ui&&c.ui.setFullScreen(!0);try{c.document.execCommand("2D-position",!1,!1)}catch(h){}try{c.document.execCommand("enableInlineTableEditing",!1,!1)}catch(h){}try{c.document.execCommand("enableObjectResizing",!1,!1)}catch(h){}c._bindshortcutKeys(),c.isReady=1,c.fireEvent("ready"),d.onready&&d.onready.call(c),browser.ie9below||domUtils.on(c.window,["blur","focus"],function(a){if("blur"==a.type){c._bakRange=c.selection.getRange();try{c._bakNativeRange=c.selection.getNative().getRangeAt(0),c.selection.getNative().removeAllRanges()}catch(a){c._bakNativeRange=null}}else try{c._bakRange&&c._bakRange.select()}catch(a){}}),browser.gecko&&browser.version<=10902&&(c.body.contentEditable=!1,setTimeout(function(){c.body.contentEditable=!0},100),setInterval(function(){c.body.style.height=c.iframe.offsetHeight-20+"px"},100)),!d.isShow&&c.setHide(),d.readonly&&c.setDisabled()},sync:function(b){var c=this,d=b?document.getElementById(b):domUtils.findParent(c.iframe.parentNode,function(a){return"FORM"==a.tagName},!0);d&&a(d,c)},setHeight:function(a,b){a!==parseInt(this.iframe.parentNode.style.height)&&(this.iframe.parentNode.style.height=a+"px"),!b&&(this.options.minFrameHeight=this.options.initialFrameHeight=a),this.body.style.height=a+"px",!b&&this.trigger("setHeight")},addshortcutkey:function(a,b){var c={};b?c[a]=b:c=a,utils.extend(this.shortcutkeys,c)},_bindshortcutKeys:function(){var a=this,b=this.shortcutkeys;a.addListener("keydown",function(c,d){var e=d.keyCode||d.which;for(var f in b)for(var g,h=b[f].split(","),i=0;g=h[i++];){g=g.split(":");var j=g[0],k=g[1];(/^(ctrl)(\+shift)?\+(\d+)$/.test(j.toLowerCase())||/^(\d+)$/.test(j))&&(("ctrl"==RegExp.$1?d.ctrlKey||d.metaKey:0)&&(""!=RegExp.$2?d[RegExp.$2.slice(1)+"Key"]:1)&&e==RegExp.$3||e==RegExp.$1)&&(a.queryCommandState(f,k)!=-1&&a.execCommand(f,k),domUtils.preventDefault(d))}})},getContent:function(a,b,c,d,e){var f=this;if(a&&utils.isFunction(a)&&(b=a,a=""),b?!b():!this.hasContents())return"";f.fireEvent("beforegetcontent");var g=UE.htmlparser(f.body.innerHTML,d);return f.filterOutputRule(g),f.fireEvent("aftergetcontent",a,g),g.toHtml(e)},getAllHtml:function(){var a=this,b=[];if(a.fireEvent("getAllHtml",b),browser.ie&&browser.version>8){var c="";utils.each(a.document.styleSheets,function(a){c+=a.href?'':""}),utils.each(a.document.getElementsByTagName("script"),function(a){c+=a.outerHTML})}return""+(a.options.charset?'':"")+(c||a.document.getElementsByTagName("head")[0].innerHTML)+b.join("\n")+""+a.getContent(null,null,!0)+""},getPlainTxt:function(){var a=new RegExp(domUtils.fillChar,"g"),b=this.body.innerHTML.replace(/[\n\r]/g,"");return b=b.replace(/<(p|div)[^>]*>(| )<\/\1>/gi,"\n").replace(//gi,"\n").replace(/<[^>\/]+>/g,"").replace(/(\n)?<\/([^>]+)>/g,function(a,b,c){return dtd.$block[c]?"\n":b?b:""}),b.replace(a,"").replace(/\u00a0/g," ").replace(/ /g," ")},getContentTxt:function(){var a=new RegExp(domUtils.fillChar,"g");return this.body[browser.ie?"innerText":"textContent"].replace(a,"").replace(/\u00a0/g," ")},setContent:function(b,c,d){function e(a){return"DIV"==a.tagName&&a.getAttribute("cdata_tag")}var f=this;f.fireEvent("beforesetcontent",b);var g=UE.htmlparser(b);if(f.filterInputRule(g),b=g.toHtml(),f.body.innerHTML=(c?f.body.innerHTML:"")+b,"p"==f.options.enterTag){var h,i=this.body.firstChild;if(!i||1==i.nodeType&&(dtd.$cdata[i.tagName]||e(i)||domUtils.isCustomeNode(i))&&i===this.body.lastChild)this.body.innerHTML="

      "+(browser.ie?" ":"
      ")+"

      "+this.body.innerHTML;else for(var j=f.document.createElement("p");i;){for(;i&&(3==i.nodeType||1==i.nodeType&&dtd.p[i.tagName]&&!dtd.$cdata[i.tagName]);)h=i.nextSibling,j.appendChild(i),i=h;if(j.firstChild){if(!i){f.body.appendChild(j);break}i.parentNode.insertBefore(j,i),j=f.document.createElement("p")}i=i.nextSibling}}f.fireEvent("aftersetcontent"),f.fireEvent("contentchange"),!d&&f._selectionChange(),f._bakRange=f._bakIERange=f._bakNativeRange=null;var k;browser.gecko&&(k=this.selection.getNative())&&k.removeAllRanges(),f.options.autoSyncData&&f.form&&a(f.form,f)},focus:function(a){try{var b=this,c=b.selection.getRange();if(a){var d=b.body.lastChild;d&&1==d.nodeType&&!dtd.$empty[d.tagName]&&(domUtils.isEmptyBlock(d)?c.setStartAtFirst(d):c.setStartAtLast(d),c.collapse(!0)),c.setCursor(!0)}else{if(!c.collapsed&&domUtils.isBody(c.startContainer)&&0==c.startOffset){var d=b.body.firstChild;d&&1==d.nodeType&&!dtd.$empty[d.tagName]&&c.setStartAtFirst(d).collapse(!0)}c.select(!0)}this.fireEvent("focus selectionchange")}catch(e){}},isFocus:function(){return this.selection.isFocus()},blur:function(){var a=this.selection.getNative();if(a.empty&&browser.ie){var b=document.body.createTextRange();b.moveToElementText(document.body),b.collapse(!0),b.select(),a.empty()}else a.removeAllRanges()},_initEvents:function(){var a=this,b=a.document,c=a.window;a._proxyDomEvent=utils.bind(a._proxyDomEvent,a),domUtils.on(b,["click","contextmenu","mousedown","keydown","keyup","keypress","mouseup","mouseover","mouseout","selectstart"],a._proxyDomEvent),domUtils.on(c,["focus","blur"],a._proxyDomEvent),domUtils.on(a.body,"drop",function(b){browser.gecko&&b.stopPropagation&&b.stopPropagation(),a.fireEvent("contentchange")}),domUtils.on(b,["mouseup","keydown"],function(b){"keydown"==b.type&&(b.ctrlKey||b.metaKey||b.shiftKey||b.altKey)||2!=b.button&&a._selectionChange(250,b)})},_proxyDomEvent:function(a){return this.fireEvent("before"+a.type.replace(/^on/,"").toLowerCase())!==!1&&(this.fireEvent(a.type.replace(/^on/,""),a)!==!1&&this.fireEvent("after"+a.type.replace(/^on/,"").toLowerCase()))},_selectionChange:function(a,b){var c,e,f=this,g=!1;if(browser.ie&&browser.version<9&&b&&"mouseup"==b.type){var h=this.selection.getRange();h.collapsed||(g=!0,c=b.clientX,e=b.clientY)}clearTimeout(d),d=setTimeout(function(){if(f.selection&&f.selection.getNative()){var a;if(g&&"None"==f.selection.getNative().type){a=f.document.body.createTextRange();try{a.moveToPoint(c,e)}catch(d){a=null}}var h;a&&(h=f.selection.getIERange,f.selection.getIERange=function(){return a}),f.selection.cache(),h&&(f.selection.getIERange=h),f.selection._cachedRange&&f.selection._cachedStartElement&&(f.fireEvent("beforeselectionchange"),f.fireEvent("selectionchange",!!b),f.fireEvent("afterselectionchange"),f.selection.clear())}},a||50)},_callCmdFn:function(a,b){var c,d,e=b[0].toLowerCase();return c=this.commands[e]||UE.commands[e],d=c&&c[a],c&&d||"queryCommandState"!=a?d?d.apply(this,b):void 0:0},execCommand:function(a){a=a.toLowerCase();var b,c=this,d=c.commands[a]||UE.commands[a];return d&&d.execCommand?(d.notNeedUndo||c.__hasEnterExecCommand?(b=this._callCmdFn("execCommand",arguments),!c.__hasEnterExecCommand&&!d.ignoreContentChange&&!c._ignoreContentChange&&c.fireEvent("contentchange")):(c.__hasEnterExecCommand=!0,c.queryCommandState.apply(c,arguments)!=-1&&(c.fireEvent("saveScene"),c.fireEvent.apply(c,["beforeexeccommand",a].concat(arguments)),b=this._callCmdFn("execCommand",arguments),c.fireEvent.apply(c,["afterexeccommand",a].concat(arguments)),c.fireEvent("saveScene")),c.__hasEnterExecCommand=!1),!c.__hasEnterExecCommand&&!d.ignoreContentChange&&!c._ignoreContentChange&&c._selectionChange(),b):null},queryCommandState:function(a){return this._callCmdFn("queryCommandState",arguments)},queryCommandValue:function(a){return this._callCmdFn("queryCommandValue",arguments)},hasContents:function(a){if(a)for(var b,c=0;b=a[c++];)if(this.document.getElementsByTagName(b).length>0)return!0;if(!domUtils.isEmptyBlock(this.body))return!0;for(a=["div"],c=0;b=a[c++];)for(var d,e=domUtils.getElementsByTagName(this.document,b),f=0;d=e[f++];)if(domUtils.isCustomeNode(d))return!0;return!1},reset:function(){this.fireEvent("reset")},setEnabled:function(){var a,b=this;if("false"==b.body.contentEditable){b.body.contentEditable=!0,a=b.selection.getRange();try{a.moveToBookmark(b.lastBk),delete b.lastBk}catch(c){a.setStartAtFirst(b.body).collapse(!0)}a.select(!0),b.bkqueryCommandState&&(b.queryCommandState=b.bkqueryCommandState,delete b.bkqueryCommandState),b.bkqueryCommandValue&&(b.queryCommandValue=b.bkqueryCommandValue,delete b.bkqueryCommandValue),b.fireEvent("selectionchange")}},enable:function(){return this.setEnabled()},setDisabled:function(a){var b=this;a=a?utils.isArray(a)?a:[a]:[],"true"==b.body.contentEditable&&(b.lastBk||(b.lastBk=b.selection.getRange().createBookmark(!0)),b.body.contentEditable=!1,b.bkqueryCommandState=b.queryCommandState,b.bkqueryCommandValue=b.queryCommandValue,b.queryCommandState=function(c){return utils.indexOf(a,c)!=-1?b.bkqueryCommandState.apply(b,arguments):-1},b.queryCommandValue=function(c){return utils.indexOf(a,c)!=-1?b.bkqueryCommandValue.apply(b,arguments):null},b.fireEvent("selectionchange"))},disable:function(a){return this.setDisabled(a)},_setDefaultContent:function(){function a(){var b=this;b.document.getElementById("initContent")&&(b.body.innerHTML="

      "+(ie?"":"
      ")+"

      ",b.removeListener("firstBeforeExecCommand focus",a),setTimeout(function(){b.focus(),b._selectionChange()},0))}return function(b){var c=this;c.body.innerHTML='

      '+b+"

      ",c.addListener("firstBeforeExecCommand focus",a)}}(),setShow:function(){var a=this,b=a.selection.getRange();if("none"==a.container.style.display){try{b.moveToBookmark(a.lastBk),delete a.lastBk}catch(c){b.setStartAtFirst(a.body).collapse(!0)}setTimeout(function(){b.select(!0)},100),a.container.style.display=""}},show:function(){return this.setShow()},setHide:function(){ +var a=this;a.lastBk||(a.lastBk=a.selection.getRange().createBookmark(!0)),a.container.style.display="none"},hide:function(){return this.setHide()},getLang:function(a){var b=UE.I18N[this.options.lang];if(!b)throw Error("not import language file");a=(a||"").split(".");for(var c,d=0;(c=a[d++])&&(b=b[c],b););return b},getContentLength:function(a,b){var c=this.getContent(!1,!1,!0).length;if(a){b=(b||[]).concat(["hr","img","iframe"]),c=this.getContentTxt().replace(/[\t\r\n]+/g,"").length;for(var d,e=0;d=b[e++];)c+=this.document.getElementsByTagName(d).length}return c},addInputRule:function(a){this.inputRules.push(a)},filterInputRule:function(a){for(var b,c=0;b=this.inputRules[c++];)b.call(this,a)},addOutputRule:function(a){this.outputRules.push(a)},filterOutputRule:function(a){for(var b,c=0;b=this.outputRules[c++];)b.call(this,a)},getActionUrl:function(a){var b=this.getOpt(a)||a,c=this.getOpt("imageUrl"),d=this.getOpt("serverUrl");return!d&&c&&(d=c.replace(/^(.*[\/]).+([\.].+)$/,"$1controller$2")),d?(d=d+(d.indexOf("?")==-1?"?":"&")+"action="+(b||""),utils.formatUrl(d)):""}},utils.inherits(f,EventBase)}(),UE.Editor.defaultOptions=function(a){var b=a.options.UEDITOR_HOME_URL;return{isShow:!0,initialContent:"",initialStyle:"",autoClearinitialContent:!1,iframeCssUrl:b+"themes/iframe.css",textarea:"editorValue",focus:!1,focusInEnd:!0,autoClearEmptyNode:!0,fullscreen:!1,readonly:!1,zIndex:999,imagePopup:!0,enterTag:"p",customDomain:!1,lang:"zh-cn",langPath:b+"lang/",theme:"default",themePath:b+"themes/",allHtmlEnabled:!1,scaleEnabled:!1,tableNativeEditInFF:!1,autoSyncData:!0,fileNameFormat:"{time}{rand:6}"}},function(){UE.Editor.prototype.loadServerConfig=function(){function showErrorMsg(a){console&&console.error(a)}var me=this;setTimeout(function(){try{me.options.imageUrl&&me.setOpt("serverUrl",me.options.imageUrl.replace(/^(.*[\/]).+([\.].+)$/,"$1controller$2"));var configUrl=me.getActionUrl("config"),isJsonp=utils.isCrossDomainUrl(configUrl);me._serverConfigLoaded=!1,configUrl&&UE.ajax.request(configUrl,{method:"GET",dataType:isJsonp?"jsonp":"",onsuccess:function(r){try{var config=isJsonp?r:eval("("+r.responseText+")");utils.extend(me.options,config),me.fireEvent("serverConfigLoaded"),me._serverConfigLoaded=!0}catch(e){showErrorMsg(me.getLang("loadconfigFormatError"))}},onerror:function(){showErrorMsg(me.getLang("loadconfigHttpError"))}})}catch(e){showErrorMsg(me.getLang("loadconfigError"))}})},UE.Editor.prototype.isServerConfigLoaded=function(){var a=this;return a._serverConfigLoaded||!1},UE.Editor.prototype.afterConfigReady=function(a){if(a&&utils.isFunction(a)){var b=this,c=function(){a.apply(b,arguments),b.removeListener("serverConfigLoaded",c)};b.isServerConfigLoaded()?a.call(b,"serverConfigLoaded"):b.addListener("serverConfigLoaded",c)}}}(),UE.ajax=function(){function a(a){var b=[];for(var c in a)if("method"!=c&&"timeout"!=c&&"async"!=c&&"dataType"!=c&&"callback"!=c&&void 0!=a[c]&&null!=a[c])if("function"!=(typeof a[c]).toLowerCase()&&"object"!=(typeof a[c]).toLowerCase())b.push(encodeURIComponent(c)+"="+encodeURIComponent(a[c]));else if(utils.isArray(a[c]))for(var d=0;d/gi,"").replace(/]*>[\s\S]*?.<\/v:shape>/gi,function(a){if(browser.opera)return"";try{if(/Bitmap/i.test(a))return"";var c=a.match(/width:([ \d.]*p[tx])/i)[1],d=a.match(/height:([ \d.]*p[tx])/i)[1],e=a.match(/src=\s*"([^"]*)"/i)[1];return''}catch(f){return""}}).replace(/<\/?div[^>]*>/g,"").replace(/v:\w+=(["']?)[^'"]+\1/g,"").replace(/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|xml|meta|link|style|\w+:\w+)(?=[\s\/>]))[^>]*>/gi,"").replace(/

      ]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi,"

      $1

      ").replace(/\s+(class|lang|align)\s*=\s*(['"]?)([\w-]+)\2/gi,function(a,b,c,d){return"class"==b&&"MsoListParagraph"==d?a:""}).replace(/<(font|span)[^>]*>(\s*)<\/\1>/gi,function(a,b,c){return c.replace(/[\t\r\n ]+/g," ")}).replace(/(<[a-z][^>]*)\sstyle=(["'])([^\2]*?)\2/gi,function(a,c,d,e){for(var f,g=[],h=e.replace(/^\s+|\s+$/,"").replace(/'/g,"'").replace(/"/gi,"'").replace(/[\d.]+(cm|pt)/g,function(a){return utils.transUnitToPx(a)}).split(/;\s*/g),i=0;f=h[i];i++){var j,k,l=f.split(":");if(2==l.length){if(j=l[0].toLowerCase(),k=l[1].toLowerCase(),/^(background)\w*/.test(j)&&0==k.replace(/(initial|\s)/g,"").length||/^(margin)\w*/.test(j)&&/^0\w+$/.test(k))continue;switch(j){case"mso-padding-alt":case"mso-padding-top-alt":case"mso-padding-right-alt":case"mso-padding-bottom-alt":case"mso-padding-left-alt":case"mso-margin-alt":case"mso-margin-top-alt":case"mso-margin-right-alt":case"mso-margin-bottom-alt":case"mso-margin-left-alt":case"mso-height":case"mso-width":case"mso-vertical-align-alt":/1&&(a(h,j,!0),b(h,j)),c(k,h,i,j);break;case"text":d(g,h);break;case"element":e(g,h,i,j);break;case"comment":f(g,h,i)}return h}function d(a,b){"pre"==a.parentNode.tagName?b.push(a.data):b.push(l[a.parentNode.tagName]?utils.html(a.data):a.data.replace(/[ ]{2}/g,"  "))}function e(d,e,f,g){var h="";if(d.attrs){h=[];var i=d.attrs;for(var j in i)h.push(j+(void 0!==i[j]?'="'+(k[j]?utils.html(i[j]).replace(/["]/g,function(a){return"""}):utils.unhtml(i[j]))+'"':""));h=h.join(" ")}if(e.push("<"+d.tagName+(h?" "+h:"")+(dtd.$empty[d.tagName]?"/":"")+">"),f&&!dtd.$inlineWithA[d.tagName]&&"pre"!=d.tagName&&d.children&&d.children.length&&(g=a(e,g,!0),b(e,g)),d.children&&d.children.length)for(var l,m=0;l=d.children[m++];)f&&"element"==l.type&&!dtd.$inlineWithA[l.tagName]&&m>1&&(a(e,g),b(e,g)),c(l,e,f,g);dtd.$empty[d.tagName]||(f&&!dtd.$inlineWithA[d.tagName]&&"pre"!=d.tagName&&d.children&&d.children.length&&(g=a(e,g),b(e,g)),e.push(""))}function f(a,b){b.push("")}function g(a,b){var c;if("element"==a.type&&a.getAttr("id")==b)return a;if(a.children&&a.children.length)for(var d,e=0;d=a.children[e++];)if(c=g(d,b))return c}function h(a,b,c){if("element"==a.type&&a.tagName==b&&c.push(a),a.children&&a.children.length)for(var d,e=0;d=a.children[e++];)h(d,b,c)}function i(a,b){if(a.children&&a.children.length)for(var c,d=0;c=a.children[d];)i(c,b),c.parentNode&&(c.children&&c.children.length&&b(c),c.parentNode&&d++);else b(a)}var j=UE.uNode=function(a){this.type=a.type,this.data=a.data,this.tagName=a.tagName,this.parentNode=a.parentNode,this.attrs=a.attrs||{},this.children=a.children},k={href:1,src:1,_src:1,_href:1,cdata_data:1},l={style:1,script:1},m=" ",n="\n";j.createElement=function(a){return/[<>]/.test(a)?UE.htmlparser(a).children[0]:new j({type:"element",children:[],tagName:a})},j.createText=function(a,b){return new UE.uNode({type:"text",data:b?a:utils.unhtml(a||"")})},j.prototype={toHtml:function(a){var b=[];return c(this,b,a,0),b.join("")},innerHTML:function(a){if("element"!=this.type||dtd.$empty[this.tagName])return this;if(utils.isString(a)){if(this.children)for(var b,c=0;b=this.children[c++];)b.parentNode=null;this.children=[];for(var b,d=UE.htmlparser(a),c=0;b=d.children[c++];)this.children.push(b),b.parentNode=this;return this}var d=new UE.uNode({type:"root",children:this.children});return d.toHtml()},innerText:function(a,b){if("element"!=this.type||dtd.$empty[this.tagName])return this;if(a){if(this.children)for(var c,d=0;c=this.children[d++];)c.parentNode=null;return this.children=[],this.appendChild(j.createText(a,b)),this}return this.toHtml().replace(/<[^>]+>/g,"")},getData:function(){return"element"==this.type?"":this.data},firstChild:function(){return this.children?this.children[0]:null},lastChild:function(){return this.children?this.children[this.children.length-1]:null},previousSibling:function(){for(var a,b=this.parentNode,c=0;a=b.children[c];c++)if(a===this)return 0==c?null:b.children[c-1]},nextSibling:function(){for(var a,b=this.parentNode,c=0;a=b.children[c++];)if(a===this)return b.children[c]},replaceChild:function(a,b){if(this.children){a.parentNode&&a.parentNode.removeChild(a);for(var c,d=0;c=this.children[d];d++)if(c===b)return this.children.splice(d,1,a),b.parentNode=null,a.parentNode=this,a}},appendChild:function(a){if("root"==this.type||"element"==this.type&&!dtd.$empty[this.tagName]){this.children||(this.children=[]),a.parentNode&&a.parentNode.removeChild(a);for(var b,c=0;b=this.children[c];c++)if(b===a){this.children.splice(c,1);break}return this.children.push(a),a.parentNode=this,a}},insertBefore:function(a,b){if(this.children){a.parentNode&&a.parentNode.removeChild(a);for(var c,d=0;c=this.children[d];d++)if(c===b)return this.children.splice(d,0,a),a.parentNode=this,a}},insertAfter:function(a,b){if(this.children){a.parentNode&&a.parentNode.removeChild(a);for(var c,d=0;c=this.children[d];d++)if(c===b)return this.children.splice(d+1,0,a),a.parentNode=this,a}},removeChild:function(a,b){if(this.children)for(var c,d=0;c=this.children[d];d++)if(c===a){if(this.children.splice(d,1),c.parentNode=null,b&&c.children&&c.children.length)for(var e,f=0;e=c.children[f];f++)this.children.splice(d+f,0,e),e.parentNode=this;return c}},getAttr:function(a){return this.attrs&&this.attrs[a.toLowerCase()]},setAttr:function(a,b){if(!a)return void delete this.attrs;if(this.attrs||(this.attrs={}),utils.isObject(a))for(var c in a)a[c]?this.attrs[c.toLowerCase()]=a[c]:delete this.attrs[c];else b?this.attrs[a.toLowerCase()]=b:delete this.attrs[a]},getIndex:function(){for(var a,b=this.parentNode,c=0;a=b.children[c];c++)if(a===this)return c;return-1},getNodeById:function(a){var b;if(this.children&&this.children.length)for(var c,d=0;c=this.children[d++];)if(b=g(c,a))return b},getNodesByTagName:function(a){a=utils.trim(a).replace(/[ ]{2,}/g," ").split(" ");var b=[],c=this;return utils.each(a,function(a){if(c.children&&c.children.length)for(var d,e=0;d=c.children[e++];)h(d,a,b)}),b},getStyle:function(a){var b=this.getAttr("style");if(!b)return"";var c=new RegExp("(^|;)\\s*"+a+":([^;]+)","i"),d=b.match(c);return d&&d[0]?d[2]:""},setStyle:function(a,b){function c(a,b){var c=new RegExp("(^|;)\\s*"+a+":([^;]+;?)","gi");d=d.replace(c,"$1"),b&&(d=a+":"+utils.unhtml(b)+";"+d)}var d=this.getAttr("style");if(d||(d=""),utils.isObject(a))for(var e in a)c(e,a[e]);else c(a,b);this.setAttr("style",utils.trim(d))},traversal:function(a){return this.children&&this.children.length&&i(this,a),this}}}();var htmlparser=UE.htmlparser=function(a,b){function c(a,b){if(m[a.tagName]){var c=k.createElement(m[a.tagName]);a.appendChild(c),c.appendChild(k.createText(b)),a=c}else a.appendChild(k.createText(b))}function d(a,b,c){var e;if(e=l[b]){for(var f,h=a;"root"!=h.type;){if(utils.isArray(e)?utils.indexOf(e,h.tagName)!=-1:e==h.tagName){a=h,f=!0;break}h=h.parentNode}f||(a=d(a,utils.isArray(e)?e[0]:e))}var i=new k({parentNode:a,type:"element",tagName:b.toLowerCase(),children:dtd.$empty[b]?null:[]});if(c){for(var m,n={};m=g.exec(c);)n[m[1].toLowerCase()]=j[m[1].toLowerCase()]?m[2]||m[3]||m[4]:utils.unhtml(m[2]||m[3]||m[4]);i.attrs=n}return a.children.push(i),dtd.$empty[b]?a:i}function e(a,b){a.children.push(new k({type:"comment",data:b,parentNode:a}))}var f=/<(?:(?:\/([^>]+)>)|(?:!--([\S|\s]*?)-->)|(?:([^\s\/<>]+)\s*((?:(?:"[^"]*")|(?:'[^']*')|[^"'<>])*)\/?>))/g,g=/([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g,h={b:1,code:1,i:1,u:1,strike:1,s:1,tt:1,strong:1,q:1,samp:1,em:1,span:1,sub:1,img:1,sup:1,font:1,big:1,small:1,iframe:1,a:1,br:1,pre:1};a=a.replace(new RegExp(domUtils.fillChar,"g"),""),b||(a=a.replace(new RegExp("[\\r\\t\\n"+(b?"":" ")+"]*]*)>[\\r\\t\\n"+(b?"":" ")+"]*","g"),function(a,c){return c&&h[c.toLowerCase()]?a.replace(/(^[\n\r]+)|([\n\r]+$)/g,""):a.replace(new RegExp("^[\\r\\n"+(b?"":" ")+"]+"),"").replace(new RegExp("[\\r\\n"+(b?"":" ")+"]+$"),"")}));for(var i,j={href:1,src:1},k=UE.uNode,l={td:"tr",tr:["tbody","thead","tfoot"],tbody:"table",th:"tr",thead:"table",tfoot:"table",caption:"table",li:["ul","ol"],dt:"dl",dd:"dl",option:"select"},m={ol:"li",ul:"li"},n=0,o=0,p=new k({type:"root",children:[]}),q=p;i=f.exec(a);){n=i.index;try{if(n>o&&c(q,a.slice(o,n)),i[3])dtd.$cdata[q.tagName]?c(q,i[0]):q=d(q,i[3].toLowerCase(),i[4]);else if(i[1]){if("root"!=q.type)if(dtd.$cdata[q.tagName]&&!dtd.$cdata[i[1]])c(q,i[0]);else{for(var r=q;"element"==q.type&&q.tagName!=i[1].toLowerCase();)if(q=q.parentNode,"root"==q.type)throw q=r,"break";q=q.parentNode}}else i[2]&&e(q,i[2])}catch(s){}o=f.lastIndex}return o");break;case"div":if(b.getAttr("cdata_tag"))break;if(d=b.getAttr("class"),d&&/^line number\d+/.test(d))break;if(!e)break;for(var f,g=UE.uNode.createElement("p");f=b.firstChild();)"text"!=f.type&&UE.dom.dtd.$block[f.tagName]?g.firstChild()?(b.parentNode.insertBefore(g,b),g=UE.uNode.createElement("p")):b.parentNode.insertBefore(f,b):g.appendChild(f);g.firstChild()&&b.parentNode.insertBefore(g,b),b.parentNode.removeChild(b);break;case"dl":b.tagName="ul";break;case"dt":case"dd":b.tagName="li";break;case"li":var h=b.getAttr("class");h&&/list\-/.test(h)||b.setAttr();var i=b.getNodesByTagName("ol ul");UE.utils.each(i,function(a){b.parentNode.insertAfter(a,b)});break;case"td":case"th":case"caption":b.children&&b.children.length||b.appendChild(browser.ie11below?UE.uNode.createText(" "):UE.uNode.createElement("br"));break;case"table":a.options.disabledTableInTable&&c(b)&&(b.parentNode.insertBefore(UE.uNode.createText(b.innerText()),b),b.parentNode.removeChild(b))}}})}),a.addOutputRule(function(b){var c;b.traversal(function(b){if("element"==b.type){if(a.options.autoClearEmptyNode&&dtd.$inline[b.tagName]&&!dtd.$empty[b.tagName]&&(!b.attrs||utils.isEmptyObject(b.attrs)))return void(b.firstChild()?"span"!=b.tagName||b.attrs&&!utils.isEmptyObject(b.attrs)||b.parentNode.removeChild(b,!0):b.parentNode.removeChild(b));switch(b.tagName){case"div":(c=b.getAttr("cdata_tag"))&&(b.tagName=c,b.appendChild(UE.uNode.createText(b.getAttr("cdata_data"))),b.setAttr({cdata_tag:"",cdata_data:"",_ue_custom_node_:""}));break;case"a":(c=b.getAttr("_href"))&&b.setAttr({href:utils.html(c),_href:""});break;case"span":c=b.getAttr("id"),c&&/^_baidu_bookmark_/i.test(c)&&b.parentNode.removeChild(b);break;case"img":(c=b.getAttr("_src"))&&b.setAttr({src:b.getAttr("_src"),_src:""})}}})})},UE.commands.inserthtml={execCommand:function(a,b,c){var d,e,f=this;if(b&&f.fireEvent("beforeinserthtml",b)!==!0){if(d=f.selection.getRange(),e=d.document.createElement("div"),e.style.display="inline",!c){var g=UE.htmlparser(b);f.options.filterRules&&UE.filterNode(g,f.options.filterRules),f.filterInputRule(g),b=g.toHtml()}if(e.innerHTML=utils.trim(b),!d.collapsed){var h=d.startContainer;if(domUtils.isFillChar(h)&&d.setStartBefore(h),h=d.endContainer,domUtils.isFillChar(h)&&d.setEndAfter(h),d.txtToElmBoundary(),d.endContainer&&1==d.endContainer.nodeType&&(h=d.endContainer.childNodes[d.endOffset],h&&domUtils.isBr(h)&&d.setEndAfter(h)),0==d.startOffset&&(h=d.startContainer,domUtils.isBoundaryNode(h,"firstChild")&&(h=d.endContainer,d.endOffset==(3==h.nodeType?h.nodeValue.length:h.childNodes.length)&&domUtils.isBoundaryNode(h,"lastChild")&&(f.body.innerHTML="

      "+(browser.ie?"":"
      ")+"

      ",d.setStart(f.body.firstChild,0).collapse(!0)))),!d.collapsed&&d.deleteContents(),1==d.startContainer.nodeType){var i,j=d.startContainer.childNodes[d.startOffset];if(j&&domUtils.isBlockElm(j)&&(i=j.previousSibling)&&domUtils.isBlockElm(i)){for(d.setEnd(i,i.childNodes.length).collapse();j.firstChild;)i.appendChild(j.firstChild);domUtils.remove(j)}}}var j,k,i,l,m,n=0;d.inFillChar()&&(j=d.startContainer,domUtils.isFillChar(j)?(d.setStartBefore(j).collapse(!0),domUtils.remove(j)):domUtils.isFillChar(j,!0)&&(j.nodeValue=j.nodeValue.replace(fillCharReg,""),d.startOffset--,d.collapsed&&d.collapse(!0)));var o=domUtils.findParentByTagName(d.startContainer,"li",!0);if(o){for(var p,q;j=e.firstChild;){for(;j&&(3==j.nodeType||!domUtils.isBlockElm(j)||"HR"==j.tagName);)p=j.nextSibling,d.insertNode(j).collapse(),q=j,j=p;if(j)if(/^(ol|ul)$/i.test(j.tagName)){for(;j.firstChild;)q=j.firstChild,domUtils.insertAfter(o,j.firstChild),o=o.nextSibling;domUtils.remove(j)}else{var r;p=j.nextSibling,r=f.document.createElement("li"),domUtils.insertAfter(o,r),r.appendChild(j),q=j,j=p,o=r}}o=domUtils.findParentByTagName(d.startContainer,"li",!0),domUtils.isEmptyBlock(o)&&domUtils.remove(o),q&&d.setStartAfter(q).collapse(!0).select(!0)}else{for(;j=e.firstChild;){if(n){for(var s=f.document.createElement("p");j&&(3==j.nodeType||!dtd.$block[j.tagName]);)m=j.nextSibling,s.appendChild(j),j=m;s.firstChild&&(j=s)}if(d.insertNode(j),m=j.nextSibling,!n&&j.nodeType==domUtils.NODE_ELEMENT&&domUtils.isBlockElm(j)&&(k=domUtils.findParent(j,function(a){return domUtils.isBlockElm(a)}),k&&"body"!=k.tagName.toLowerCase()&&(!dtd[k.tagName][j.nodeName]||j.parentNode!==k))){if(dtd[k.tagName][j.nodeName])for(l=j.parentNode;l!==k;)i=l,l=l.parentNode;else i=k;domUtils.breakParent(j,i||l);var i=j.previousSibling;domUtils.trimWhiteTextNode(i),i.childNodes.length||domUtils.remove(i),!browser.ie&&(p=j.nextSibling)&&domUtils.isBlockElm(p)&&p.lastChild&&!domUtils.isBr(p.lastChild)&&p.appendChild(f.document.createElement("br")),n=1}var p=j.nextSibling;if(!e.firstChild&&p&&domUtils.isBlockElm(p)){d.setStart(p,0).collapse(!0);break}d.setEndAfter(j).collapse()}if(j=d.startContainer,m&&domUtils.isBr(m)&&domUtils.remove(m),domUtils.isBlockElm(j)&&domUtils.isEmptyNode(j))if(m=j.nextSibling)domUtils.remove(j),1==m.nodeType&&dtd.$block[m.tagName]&&d.setStart(m,0).collapse(!0).shrinkBoundary();else try{j.innerHTML=browser.ie?domUtils.fillChar:"
      "}catch(t){d.setStartBefore(j),domUtils.remove(j)}try{d.select(!0)}catch(t){}}setTimeout(function(){d=f.selection.getRange(),d.scrollToView(f.autoHeightEnabled,f.autoHeightEnabled?domUtils.getXY(f.iframe).y:0),f.fireEvent("afterinserthtml",b)},200)}}},UE.plugins.autotypeset=function(){function a(a,b){return a&&3!=a.nodeType?domUtils.isBr(a)?1:a&&a.parentNode&&l[a.tagName.toLowerCase()]?g&&g.contains(a)||a.getAttribute("pagebreak")?0:b?!domUtils.isEmptyBlock(a):domUtils.isEmptyBlock(a,new RegExp("[\\s"+domUtils.fillChar+"]","g")):void 0:0}function b(a){a.style.cssText||(domUtils.removeAttributes(a,["style"]),"span"==a.tagName.toLowerCase()&&domUtils.hasNoAttributes(a)&&domUtils.remove(a,!0))}function c(c,f){var h,l=this;if(f){if(!i.pasteFilter)return;h=l.document.createElement("div"),h.innerHTML=f.html}else h=l.document.body;for(var m,n=domUtils.getElementsByTagName(h,"*"),o=0;m=n[o++];)if(l.fireEvent("excludeNodeinautotype",m)!==!0){if(i.clearFontSize&&m.style.fontSize&&(domUtils.removeStyle(m,"font-size"),b(m)),i.clearFontFamily&&m.style.fontFamily&&(domUtils.removeStyle(m,"font-family"),b(m)),a(m)){if(i.mergeEmptyline)for(var p,q=m.nextSibling,r=domUtils.isBr(m);a(q)&&(p=q,q=p.nextSibling,!r||q&&(!q||domUtils.isBr(q)));)domUtils.remove(p);if(i.removeEmptyline&&domUtils.inDoc(m,h)&&!k[m.parentNode.tagName.toLowerCase()]){if(domUtils.isBr(m)&&(q=m.nextSibling,q&&!domUtils.isBr(q)))continue;domUtils.remove(m);continue}}if(a(m,!0)&&"SPAN"!=m.tagName&&(i.indent&&(m.style.textIndent=i.indentValue),i.textAlign&&(m.style.textAlign=i.textAlign)),i.removeClass&&m.className&&!j[m.className.toLowerCase()]){if(g&&g.contains(m))continue;domUtils.removeAttributes(m,["class"])}if(i.imageBlockLine&&"img"==m.tagName.toLowerCase()&&!m.getAttribute("emotion"))if(f){var s=m;switch(i.imageBlockLine){case"left":case"right":case"none":for(var p,t,q,u=s.parentNode;dtd.$inline[u.tagName]||"A"==u.tagName;)u=u.parentNode;if(p=u,"P"==p.tagName&&"center"==domUtils.getStyle(p,"text-align")&&!domUtils.isBody(p)&&1==domUtils.getChildCount(p,function(a){return!domUtils.isBr(a)&&!domUtils.isWhitespace(a)}))if(t=p.previousSibling,q=p.nextSibling,t&&q&&1==t.nodeType&&1==q.nodeType&&t.tagName==q.tagName&&domUtils.isBlockElm(t)){for(t.appendChild(p.firstChild);q.firstChild;)t.appendChild(q.firstChild);domUtils.remove(p),domUtils.remove(q)}else domUtils.setStyle(p,"text-align","");domUtils.setStyle(s,"float",i.imageBlockLine);break;case"center":if("center"!=l.queryCommandValue("imagefloat")){for(u=s.parentNode,domUtils.setStyle(s,"float","none"),p=s;u&&1==domUtils.getChildCount(u,function(a){return!domUtils.isBr(a)&&!domUtils.isWhitespace(a)})&&(dtd.$inline[u.tagName]||"A"==u.tagName);)p=u,u=u.parentNode;var v=l.document.createElement("p");domUtils.setAttributes(v,{style:"text-align:center"}),p.parentNode.insertBefore(v,p),v.appendChild(p),domUtils.setStyle(p,"float","")}}}else{var w=l.selection.getRange();w.selectNode(m).select(),l.execCommand("imagefloat",i.imageBlockLine)}i.removeEmptyNode&&i.removeTagNames[m.tagName.toLowerCase()]&&domUtils.hasNoAttributes(m)&&domUtils.isEmptyBlock(m)&&domUtils.remove(m)}if(i.tobdc){var x=UE.htmlparser(h.innerHTML);x.traversal(function(a){"text"==a.type&&(a.data=e(a.data))}),h.innerHTML=x.toHtml()}if(i.bdc2sb){var x=UE.htmlparser(h.innerHTML);x.traversal(function(a){"text"==a.type&&(a.data=d(a.data))}),h.innerHTML=x.toHtml()}f&&(f.html=h.innerHTML)}function d(a){for(var b="",c=0;c=65281&&d<=65373?String.fromCharCode(a.charCodeAt(c)-65248):12288==d?String.fromCharCode(a.charCodeAt(c)-12288+32):a.charAt(c)}return b}function e(a){a=utils.html(a);for(var b="",c=0;c0?e.substring(e.indexOf(d.options.imagePath),e.length-1).replace(/"|\(|\)/gi,""):"none"!=e?e.replace(/url\("?|"?\)/gi,""):"";var g=' ",b.push(g)},aftersetcontent:function(){0==c&&b()}},inputRule:function(d){c=!1,utils.each(d.getNodesByTagName("p"),function(d){var e=d.getAttr("data-background");e&&(c=!0,b(a(e)),d.parentNode.removeChild(d))})},outputRule:function(a){var b=this,c=(utils.cssRule(e,b.document)||"").replace(/[\n\r]+/g,"").match(f);c&&a.appendChild(UE.uNode.createElement('


      '))},commands:{background:{execCommand:function(a,c){b(c)},queryCommandValue:function(){var b=this,c=(utils.cssRule(e,b.document)||"").replace(/[\n\r]+/g,"").match(f);return c?a(c[1]):null},notNeedUndo:!0}}}}),UE.commands.imagefloat={execCommand:function(a,b){var c=this,d=c.selection.getRange();if(!d.collapsed){var e=d.getClosedNode();if(e&&"IMG"==e.tagName)switch(b){case"left":case"right":case"none":for(var f,g,h,i=e.parentNode;dtd.$inline[i.tagName]||"A"==i.tagName;)i=i.parentNode;if(f=i,"P"==f.tagName&&"center"==domUtils.getStyle(f,"text-align")){if(!domUtils.isBody(f)&&1==domUtils.getChildCount(f,function(a){return!domUtils.isBr(a)&&!domUtils.isWhitespace(a)}))if(g=f.previousSibling,h=f.nextSibling,g&&h&&1==g.nodeType&&1==h.nodeType&&g.tagName==h.tagName&&domUtils.isBlockElm(g)){for(g.appendChild(f.firstChild);h.firstChild;)g.appendChild(h.firstChild);domUtils.remove(f),domUtils.remove(h)}else domUtils.setStyle(f,"text-align","");d.selectNode(e).select()}domUtils.setStyle(e,"float","none"==b?"":b),"none"==b&&domUtils.removeAttributes(e,"align");break;case"center":if("center"!=c.queryCommandValue("imagefloat")){for(i=e.parentNode,domUtils.setStyle(e,"float",""),domUtils.removeAttributes(e,"align"),f=e;i&&1==domUtils.getChildCount(i,function(a){return!domUtils.isBr(a)&&!domUtils.isWhitespace(a)})&&(dtd.$inline[i.tagName]||"A"==i.tagName);)f=i,i=i.parentNode;d.setStartBefore(f).setCursor(!1),i=c.document.createElement("div"),i.appendChild(f),domUtils.setStyle(f,"float",""),c.execCommand("insertHtml",'

      '+i.innerHTML+"

      "),f=c.document.getElementById("_img_parent_tmp"),f.removeAttribute("id"),f=f.firstChild,d.selectNode(f).select(),h=f.parentNode.nextSibling,h&&domUtils.isEmptyNode(h)&&domUtils.remove(h)}}}},queryCommandValue:function(){var a,b,c=this.selection.getRange();return c.collapsed?"none":(a=c.getClosedNode(),a&&1==a.nodeType&&"IMG"==a.tagName?(b=domUtils.getComputedStyle(a,"float")||a.getAttribute("align"),"none"==b&&(b="center"==domUtils.getComputedStyle(a.parentNode,"text-align")?"center":b),{left:1,right:1,center:1}[b]?b:"none"):"none")},queryCommandState:function(){var a,b=this.selection.getRange();return b.collapsed?-1:(a=b.getClosedNode(),a&&1==a.nodeType&&"IMG"==a.tagName?0:-1)}},UE.commands.insertimage={execCommand:function(a,b){function c(a){utils.each("width,height,border,hspace,vspace".split(","),function(b){a[b]&&(a[b]=parseInt(a[b],10)||0)}),utils.each("src,_src".split(","),function(b){a[b]&&(a[b]=utils.unhtmlForUrl(a[b]))}),utils.each("title,alt".split(","),function(b){a[b]&&(a[b]=utils.unhtml(a[b]))})}if(b=utils.isArray(b)?b:[b],b.length){var d=this,e=d.selection.getRange(),f=e.getClosedNode();if(d.fireEvent("beforeinsertimage",b)!==!0){if(!f||!/img/i.test(f.tagName)||"edui-faked-video"==f.className&&f.className.indexOf("edui-upload-video")==-1||f.getAttribute("word_img")){var g,h=[],i="";if(g=b[0],1==b.length)c(g),i=''+g.alt+'","center"==g.floatStyle&&(i='

      '+i+"

      "),h.push(i);else for(var j=0;g=b[j++];)c(g),i="

      ",h.push(i);d.execCommand("insertHtml",h.join(""))}else{var k=b.shift(),l=k.floatStyle;delete k.floatStyle,domUtils.setAttributes(f,k),d.execCommand("imagefloat",l),b.length>0&&(e.setStartAfter(f).setCursor(!1,!0),d.execCommand("insertimage",b))}d.fireEvent("afterinsertimage",b)}}}},UE.plugins.justify=function(){var a=domUtils.isBlockElm,b={left:1,right:1,center:1,justify:1},c=function(b,c){var d=b.createBookmark(),e=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase()&&!domUtils.isBookmarkNode(a):!domUtils.isWhitespace(a)};b.enlarge(!0);for(var f,g=b.createBookmark(),h=domUtils.getNextDomNode(g.start,!1,e),i=b.cloneRange();h&&!(domUtils.getPosition(h,g.end)&domUtils.POSITION_FOLLOWING);)if(3!=h.nodeType&&a(h))h=domUtils.getNextDomNode(h,!0,e);else{for(i.setStartBefore(h);h&&h!==g.end&&!a(h);)f=h,h=domUtils.getNextDomNode(h,!1,null,function(b){return!a(b)});i.setEndAfter(f);var j=i.getCommonAncestor();if(!domUtils.isBody(j)&&a(j))domUtils.setStyles(j,utils.isString(c)?{"text-align":c}:c),h=j;else{var k=b.document.createElement("p");domUtils.setStyles(k,utils.isString(c)?{"text-align":c}:c);var l=i.extractContents();k.appendChild(l),i.insertNode(k),h=k}h=domUtils.getNextDomNode(h,!1,e)}return b.moveToBookmark(g).moveToBookmark(d)};UE.commands.justify={execCommand:function(a,b){var d,e=this.selection.getRange();return e.collapsed&&(d=this.document.createTextNode("p"),e.insertNode(d)),c(e,b),d&&(e.setStartBefore(d).collapse(!0),domUtils.remove(d)),e.select(),!0},queryCommandValue:function(){var a=this.selection.getStart(),c=domUtils.getComputedStyle(a,"text-align");return b[c]?c:"left"},queryCommandState:function(){var a=this.selection.getStart(),b=a&&domUtils.findParentByTagName(a,["td","th","caption"],!0);return b?-1:0}}},UE.plugins.font=function(){function a(a){for(var b;(b=a.parentNode)&&"SPAN"==b.tagName&&1==domUtils.getChildCount(b,function(a){return!domUtils.isBookmarkNode(a)&&!domUtils.isBr(a)});)b.style.cssText+=a.style.cssText,domUtils.remove(a,!0),a=b}function b(a,b,c){if(g[b]&&(a.adjustmentBoundary(),!a.collapsed&&1==a.startContainer.nodeType)){var d=a.startContainer.childNodes[a.startOffset];if(d&&domUtils.isTagNode(d,"span")){var e=a.createBookmark();utils.each(domUtils.getElementsByTagName(d,"span"),function(a){a.parentNode&&!domUtils.isBookmarkNode(a)&&("backcolor"==b&&domUtils.getComputedStyle(a,"background-color").toLowerCase()===c||(domUtils.removeStyle(a,g[b]),0==a.style.cssText.replace(/^\s+$/,"").length&&domUtils.remove(a,!0)))}),a.moveToBookmark(e)}}}function c(c,d,e){var f,g=c.collapsed,h=c.createBookmark();if(g)for(f=h.start.parentNode;dtd.$inline[f.tagName];)f=f.parentNode;else f=domUtils.getCommonAncestor(h.start,h.end);utils.each(domUtils.getElementsByTagName(f,"span"),function(b){if(b.parentNode&&!domUtils.isBookmarkNode(b)){if(/\s*border\s*:\s*none;?\s*/i.test(b.style.cssText))return void(/^\s*border\s*:\s*none;?\s*$/.test(b.style.cssText)?domUtils.remove(b,!0):domUtils.removeStyle(b,"border"));if(/border/i.test(b.style.cssText)&&"SPAN"==b.parentNode.tagName&&/border/i.test(b.parentNode.style.cssText)&&(b.style.cssText=b.style.cssText.replace(/border[^:]*:[^;]+;?/gi,"")),"fontborder"!=d||"none"!=e)for(var c=b.nextSibling;c&&1==c.nodeType&&"SPAN"==c.tagName;)if(domUtils.isBookmarkNode(c)&&"fontborder"==d)b.appendChild(c),c=b.nextSibling;else{if(c.style.cssText==b.style.cssText&&(domUtils.moveChild(c,b),domUtils.remove(c)),b.nextSibling===c)break;c=b.nextSibling}if(a(b),browser.ie&&browser.version>8){var f=domUtils.findParent(b,function(a){return"SPAN"==a.tagName&&/background-color/.test(a.style.cssText)});f&&!/background-color/.test(b.style.cssText)&&(b.style.backgroundColor=f.style.backgroundColor)}}}),c.moveToBookmark(h),b(c,d,e)}var d=this,e={forecolor:"color",backcolor:"background-color",fontsize:"font-size",fontfamily:"font-family",underline:"text-decoration",strikethrough:"text-decoration",fontborder:"border"},f={underline:1,strikethrough:1,fontborder:1},g={forecolor:"color",backcolor:"background-color",fontsize:"font-size",fontfamily:"font-family"};d.setOpt({fontfamily:[{name:"songti",val:"宋体,SimSun"},{name:"yahei",val:"微软雅黑,Microsoft YaHei"},{name:"kaiti",val:"楷体,楷体_GB2312, SimKai"},{name:"heiti",val:"黑体, SimHei"},{name:"lishu",val:"隶书, SimLi"},{name:"andaleMono",val:"andale mono"},{name:"arial",val:"arial, helvetica,sans-serif"},{name:"arialBlack",val:"arial black,avant garde"},{name:"comicSansMs",val:"comic sans ms"},{name:"impact",val:"impact,chicago"},{name:"timesNewRoman",val:"times new roman"}],fontsize:[10,11,12,14,16,18,20,24,36]}),d.addInputRule(function(a){utils.each(a.getNodesByTagName("u s del font strike"),function(a){if("font"==a.tagName){var b=[];for(var c in a.attrs)switch(c){case"size":b.push("font-size:"+({1:"10",2:"12",3:"16",4:"18",5:"24",6:"32",7:"48"}[a.attrs[c]]||a.attrs[c])+"px");break;case"color":b.push("color:"+a.attrs[c]);break;case"face":b.push("font-family:"+a.attrs[c]);break;case"style":b.push(a.attrs[c])}a.attrs={style:b.join(";")}}else{var d="u"==a.tagName?"underline":"line-through";a.attrs={style:(a.getAttr("style")||"")+"text-decoration:"+d+";"}}a.tagName="span"})});for(var h in e)!function(a,b){UE.commands[a]={execCommand:function(d,e){e=e||(this.queryCommandState(d)?"none":"underline"==d?"underline":"fontborder"==d?"1px solid #000":"line-through");var g,h=this,i=this.selection.getRange();if("default"==e)i.collapsed&&(g=h.document.createTextNode("font"),i.insertNode(g).select()),h.execCommand("removeFormat","span,a",b),g&&(i.setStartBefore(g).collapse(!0),domUtils.remove(g)),c(i,d,e),i.select();else if(i.collapsed){var j=domUtils.findParentByTagName(i.startContainer,"span",!0);if(g=h.document.createTextNode("font"),!j||j.children.length||j[browser.ie?"innerText":"textContent"].replace(fillCharReg,"").length){if(i.insertNode(g),i.selectNode(g).select(),j=i.document.createElement("span"),f[a]){if(domUtils.findParentByTagName(g,"a",!0))return i.setStartBefore(g).setCursor(),void domUtils.remove(g);h.execCommand("removeFormat","span,a",b)}if(j.style.cssText=b+":"+e,g.parentNode.insertBefore(j,g),!browser.ie||browser.ie&&9==browser.version)for(var k=j.parentNode;!domUtils.isBlockElm(k);)"SPAN"==k.tagName&&(j.style.cssText=k.style.cssText+";"+j.style.cssText),k=k.parentNode;opera?setTimeout(function(){i.setStart(j,0).collapse(!0),c(i,d,e),i.select()}):(i.setStart(j,0).collapse(!0),c(i,d,e),i.select())}else i.insertNode(g),f[a]&&(i.selectNode(g).select(),h.execCommand("removeFormat","span,a",b,null),j=domUtils.findParentByTagName(g,"span",!0),i.setStartBefore(g)),j&&(j.style.cssText+=";"+b+":"+e),i.collapse(!0).select();domUtils.remove(g)}else f[a]&&h.queryCommandValue(a)&&h.execCommand("removeFormat","span,a",b),i=h.selection.getRange(),i.applyInlineStyle("span",{style:b+":"+e}),c(i,d,e),i.select();return!0},queryCommandValue:function(a){var c=this.selection.getStart();if("underline"==a||"strikethrough"==a){for(var d,e=c;e&&!domUtils.isBlockElm(e)&&!domUtils.isBody(e);){if(1==e.nodeType&&(d=domUtils.getComputedStyle(e,b),"none"!=d))return d;e=e.parentNode}return"none"}if("fontborder"==a){for(var f,g=c;g&&dtd.$inline[g.tagName];){if((f=domUtils.getComputedStyle(g,"border"))&&/1px/.test(f)&&/solid/.test(f))return f;g=g.parentNode}return""}if("FontSize"==a){var h=domUtils.getComputedStyle(c,b),g=/^([\d\.]+)(\w+)$/.exec(h);return g?Math.floor(g[1])+g[2]:h}return domUtils.getComputedStyle(c,b)},queryCommandState:function(a){if(!f[a])return 0;var b=this.queryCommandValue(a);return"fontborder"==a?/1px/.test(b)&&/solid/.test(b):"underline"==a?/underline/.test(b):/line\-through/.test(b)}}}(h,e[h])},UE.plugins.link=function(){function a(a){var b=a.startContainer,c=a.endContainer;(b=domUtils.findParentByTagName(b,"a",!0))&&a.setStartBefore(b),(c=domUtils.findParentByTagName(c,"a",!0))&&a.setEndAfter(c)}function b(b,c,d){var e=b.cloneRange(),f=d.queryCommandValue("link");a(b=b.adjustmentBoundary());var g=b.startContainer;if(1==g.nodeType&&f&&(g=g.childNodes[b.startOffset],g&&1==g.nodeType&&"A"==g.tagName&&/^(?:https?|ftp|file)\s*:\s*\/\//.test(g[browser.ie?"innerText":"textContent"])&&(g[browser.ie?"innerText":"textContent"]=utils.html(c.textValue||c.href))),e.collapsed&&!f||(b.removeInlineStyle("a"),e=b.cloneRange()),e.collapsed){var h=b.document.createElement("a"),i="";c.textValue?(i=utils.html(c.textValue),delete c.textValue):i=utils.html(c.href),domUtils.setAttributes(h,c),g=domUtils.findParentByTagName(e.startContainer,"a",!0),g&&domUtils.isInNodeEndBoundary(e,g)&&b.setStartAfter(g).collapse(!0),h[browser.ie?"innerText":"textContent"]=i,b.insertNode(h).selectNode(h)}else b.applyInlineStyle("a",c)}UE.commands.unlink={execCommand:function(){var b,c=this.selection.getRange();c.collapsed&&!domUtils.findParentByTagName(c.startContainer,"a",!0)||(b=c.createBookmark(),a(c),c.removeInlineStyle("a").moveToBookmark(b).select())},queryCommandState:function(){return!this.highlight&&this.queryCommandValue("link")?0:-1}},UE.commands.link={execCommand:function(a,c){var d;c._href&&(c._href=utils.unhtml(c._href,/[<">]/g)),c.href&&(c.href=utils.unhtml(c.href,/[<">]/g)),c.textValue&&(c.textValue=utils.unhtml(c.textValue,/[<">]/g)),b(d=this.selection.getRange(),c,this),d.collapse().select(!0)},queryCommandValue:function(){var a,b=this.selection.getRange();if(!b.collapsed){b.shrinkBoundary();var c=3!=b.startContainer.nodeType&&b.startContainer.childNodes[b.startOffset]?b.startContainer.childNodes[b.startOffset]:b.startContainer,d=3==b.endContainer.nodeType||0==b.endOffset?b.endContainer:b.endContainer.childNodes[b.endOffset-1],e=b.getCommonAncestor();if(a=domUtils.findParentByTagName(e,"a",!0),!a&&1==e.nodeType)for(var f,g,h,i=e.getElementsByTagName("a"),j=0;h=i[j++];)if(f=domUtils.getPosition(h,c),g=domUtils.getPosition(h,d),(f&domUtils.POSITION_FOLLOWING||f&domUtils.POSITION_CONTAINS)&&(g&domUtils.POSITION_PRECEDING||g&domUtils.POSITION_CONTAINS)){a=h;break}return a}if(a=b.startContainer,a=1==a.nodeType?a:a.parentNode,a&&(a=domUtils.findParentByTagName(a,"a",!0))&&!domUtils.isInNodeEndBoundary(b,a))return a},queryCommandState:function(){var a=this.selection.getRange().getClosedNode(),b=a&&("edui-faked-video"==a.className||a.className.indexOf("edui-upload-video")!=-1);return b?-1:0}}},UE.plugins.insertframe=function(){function a(){b._iframe&&delete b._iframe}var b=this;b.addListener("selectionchange",function(){a()})},UE.commands.scrawl={queryCommandState:function(){return browser.ie&&browser.version<=8?-1:0}},UE.plugins.removeformat=function(){var a=this;a.setOpt({removeFormatTags:"b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var",removeFormatAttributes:"class,style,lang,width,height,align,hspace,valign"}),a.commands.removeformat={execCommand:function(a,b,c,d,e){function f(a){if(3==a.nodeType||"span"!=a.tagName.toLowerCase())return 0;if(browser.ie){var b=a.attributes;if(b.length){for(var c=0,d=b.length;c
      "+this.getContent(null,null,!0)+"
      "),b.close()},notNeedUndo:1},UE.plugins.selectall=function(){var a=this;a.commands.selectall={execCommand:function(){var a=this,b=a.body,c=a.selection.getRange();c.selectNodeContents(b),domUtils.isEmptyBlock(b)&&(browser.opera&&b.firstChild&&1==b.firstChild.nodeType&&c.setStartAtFirst(b.firstChild),c.collapse(!0)),c.select(!0)},notNeedUndo:1},a.addshortcutkey({selectAll:"ctrl+65"})},UE.plugins.paragraph=function(){var a=this,b=domUtils.isBlockElm,c=["TD","LI","PRE"],d=function(a,d,e,f){var g,h=a.createBookmark(),i=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase()&&!domUtils.isBookmarkNode(a):!domUtils.isWhitespace(a)};a.enlarge(!0);for(var j,k=a.createBookmark(),l=domUtils.getNextDomNode(k.start,!1,i),m=a.cloneRange();l&&!(domUtils.getPosition(l,k.end)&domUtils.POSITION_FOLLOWING);)if(3!=l.nodeType&&b(l))l=domUtils.getNextDomNode(l,!0,i);else{for(m.setStartBefore(l);l&&l!==k.end&&!b(l);)j=l,l=domUtils.getNextDomNode(l,!1,null,function(a){return!b(a)});m.setEndAfter(j),g=a.document.createElement(d),e&&(domUtils.setAttributes(g,e),f&&"customstyle"==f&&e.style&&(g.style.cssText=e.style)),g.appendChild(m.extractContents()),domUtils.isEmptyNode(g)&&domUtils.fillChar(a.document,g),m.insertNode(g);var n=g.parentNode;b(n)&&!domUtils.isBody(g.parentNode)&&utils.indexOf(c,n.tagName)==-1&&(f&&"customstyle"==f||(n.getAttribute("dir")&&g.setAttribute("dir",n.getAttribute("dir")),n.style.cssText&&(g.style.cssText=n.style.cssText+";"+g.style.cssText),n.style.textAlign&&!g.style.textAlign&&(g.style.textAlign=n.style.textAlign),n.style.textIndent&&!g.style.textIndent&&(g.style.textIndent=n.style.textIndent),n.style.padding&&!g.style.padding&&(g.style.padding=n.style.padding)),e&&/h\d/i.test(n.tagName)&&!/h\d/i.test(g.tagName)?(domUtils.setAttributes(n,e),f&&"customstyle"==f&&e.style&&(n.style.cssText=e.style),domUtils.remove(g,!0),g=n):domUtils.remove(g.parentNode,!0)),l=utils.indexOf(c,n.tagName)!=-1?n:g,l=domUtils.getNextDomNode(l,!1,i)}return a.moveToBookmark(k).moveToBookmark(h)};a.setOpt("paragraph",{p:"",h1:"",h2:"",h3:"",h4:"",h5:"",h6:""}),a.commands.paragraph={execCommand:function(a,b,c,e){var f=this.selection.getRange();if(f.collapsed){var g=this.document.createTextNode("p");if(f.insertNode(g),browser.ie){var h=g.previousSibling;h&&domUtils.isWhitespace(h)&&domUtils.remove(h),h=g.nextSibling,h&&domUtils.isWhitespace(h)&&domUtils.remove(h)}}if(f=d(f,b,c,e),g&&(f.setStartBefore(g).collapse(!0),pN=g.parentNode,domUtils.remove(g),domUtils.isBlockElm(pN)&&domUtils.isEmptyNode(pN)&&domUtils.fillNode(this.document,pN)),browser.gecko&&f.collapsed&&1==f.startContainer.nodeType){var i=f.startContainer.childNodes[f.startOffset];i&&1==i.nodeType&&i.tagName.toLowerCase()==b&&f.setStart(i,0).collapse(!0)}return f.select(),!0},queryCommandValue:function(){var a=domUtils.filterNodeList(this.selection.getStartElementPath(),"p h1 h2 h3 h4 h5 h6");return a?a.tagName.toLowerCase():""}}},function(){var a=domUtils.isBlockElm,b=function(a){return domUtils.filterNodeList(a.selection.getStartElementPath(),function(a){return a&&1==a.nodeType&&a.getAttribute("dir")})},c=function(c,d,e){var f,g=function(a){return 1==a.nodeType?!domUtils.isBookmarkNode(a):!domUtils.isWhitespace(a)},h=b(d);if(h&&c.collapsed)return h.setAttribute("dir",e),c;f=c.createBookmark(),c.enlarge(!0);for(var i,j=c.createBookmark(),k=domUtils.getNextDomNode(j.start,!1,g),l=c.cloneRange();k&&!(domUtils.getPosition(k,j.end)&domUtils.POSITION_FOLLOWING);)if(3!=k.nodeType&&a(k))k=domUtils.getNextDomNode(k,!0,g);else{for(l.setStartBefore(k);k&&k!==j.end&&!a(k);)i=k,k=domUtils.getNextDomNode(k,!1,null,function(b){return!a(b)});l.setEndAfter(i);var m=l.getCommonAncestor();if(!domUtils.isBody(m)&&a(m))m.setAttribute("dir",e),k=m;else{var n=c.document.createElement("p");n.setAttribute("dir",e);var o=l.extractContents();n.appendChild(o),l.insertNode(n),k=n}k=domUtils.getNextDomNode(k,!1,g)}return c.moveToBookmark(j).moveToBookmark(f)};UE.commands.directionality={execCommand:function(a,b){var d=this.selection.getRange();if(d.collapsed){var e=this.document.createTextNode("d");d.insertNode(e)}return c(d,this,b),e&&(d.setStartBefore(e).collapse(!0),domUtils.remove(e)),d.select(),!0},queryCommandValue:function(){var a=b(this);return a?a.getAttribute("dir"):"ltr"}}}(),UE.plugins.horizontal=function(){var a=this;a.commands.horizontal={execCommand:function(a){var b=this;if(b.queryCommandState(a)!==-1){b.execCommand("insertHtml","
      ");var c=b.selection.getRange(),d=c.startContainer;if(1==d.nodeType&&!d.childNodes[c.startOffset]){var e;(e=d.childNodes[c.startOffset-1])&&1==e.nodeType&&"HR"==e.tagName&&("p"==b.options.enterTag?(e=b.document.createElement("p"),c.insertNode(e),c.setStart(e,0).setCursor()):(e=b.document.createElement("br"),c.insertNode(e),c.setStartBefore(e).setCursor()))}return!0}},queryCommandState:function(){return domUtils.filterNodeList(this.selection.getStartElementPath(),"table")?-1:0}},a.addListener("delkeydown",function(a,b){var c=this.selection.getRange();if(c.txtToElmBoundary(!0),domUtils.isStartInblock(c)){var d=c.startContainer,e=d.previousSibling;if(e&&domUtils.isTagNode(e,"hr"))return domUtils.remove(e),c.select(),domUtils.preventDefault(b),!0}})},UE.commands.time=UE.commands.date={execCommand:function(a,b){function c(a,b){var c=("0"+a.getHours()).slice(-2),d=("0"+a.getMinutes()).slice(-2),e=("0"+a.getSeconds()).slice(-2);return b=b||"hh:ii:ss",b.replace(/hh/gi,c).replace(/ii/gi,d).replace(/ss/gi,e)}function d(a,b){var c=("000"+a.getFullYear()).slice(-4),d=c.slice(-2),e=("0"+(a.getMonth()+1)).slice(-2),f=("0"+a.getDate()).slice(-2);return b=b||"yyyy-mm-dd",b.replace(/yyyy/gi,c).replace(/yy/gi,d).replace(/mm/gi,e).replace(/dd/gi,f)}var e=new Date;this.execCommand("insertHtml","time"==a?c(e,b):d(e,b))}},UE.plugins.rowspacing=function(){var a=this;a.setOpt({rowspacingtop:["5","10","15","20","25"],rowspacingbottom:["5","10","15","20","25"]}),a.commands.rowspacing={execCommand:function(a,b,c){return this.execCommand("paragraph","p",{style:"margin-"+c+":"+b+"px"}),!0},queryCommandValue:function(a,b){var c,d=domUtils.filterNodeList(this.selection.getStartElementPath(),function(a){return domUtils.isBlockElm(a)});return d?(c=domUtils.getComputedStyle(d,"margin-"+b).replace(/[^\d]/g,""),c?c:0):0}}},UE.plugins.lineheight=function(){var a=this;a.setOpt({lineheight:["1","1.5","1.75","2","3","4","5"]}),a.commands.lineheight={execCommand:function(a,b){return this.execCommand("paragraph","p",{style:"line-height:"+("1"==b?"normal":b+"em")}),!0},queryCommandValue:function(){var a=domUtils.filterNodeList(this.selection.getStartElementPath(),function(a){return domUtils.isBlockElm(a)});if(a){var b=domUtils.getComputedStyle(a,"line-height");return"normal"==b?1:b.replace(/[^\d.]*/gi,"")}}}},UE.plugins.insertcode=function(){var a=this;a.ready(function(){utils.cssRule("pre","pre{margin:.5em 0;padding:.4em .6em;border-radius:8px;background:#f8f8f8;}",a.document)}),a.setOpt("insertcode",{as3:"ActionScript3",bash:"Bash/Shell",cpp:"C/C++",css:"Css",cf:"CodeFunction","c#":"C#",delphi:"Delphi",diff:"Diff",erlang:"Erlang",groovy:"Groovy",html:"Html",java:"Java",jfx:"JavaFx",js:"Javascript",pl:"Perl",php:"Php",plain:"Plain Text",ps:"PowerShell",python:"Python",ruby:"Ruby",scala:"Scala",sql:"Sql",vb:"Vb",xml:"Xml"}),a.commands.insertcode={execCommand:function(a,b){var c=this,d=c.selection.getRange(),e=domUtils.findParentByTagName(d.startContainer,"pre",!0);if(e)e.className="brush:"+b+";toolbar:false;";else{var f="";if(d.collapsed)f=browser.ie&&browser.ie11below?browser.version<=8?" ":"":"
      ";else{var g=d.extractContents(),h=c.document.createElement("div");h.appendChild(g),utils.each(UE.filterNode(UE.htmlparser(h.innerHTML.replace(/[\r\t]/g,"")),c.options.filterTxtRules).children,function(a){if(browser.ie&&browser.ie11below&&browser.version>8)"element"==a.type?"br"==a.tagName?f+="\n":dtd.$empty[a.tagName]||(utils.each(a.children,function(b){"element"==b.type?"br"==b.tagName?f+="\n":dtd.$empty[a.tagName]||(f+=b.innerText()):f+=b.data}),/\n$/.test(f)||(f+="\n")):f+=a.data+"\n",!a.nextSibling()&&/\n$/.test(f)&&(f=f.replace(/\n$/,""));else if(browser.ie&&browser.ie11below)"element"==a.type?"br"==a.tagName?f+="
      ":dtd.$empty[a.tagName]||(utils.each(a.children,function(b){"element"==b.type?"br"==b.tagName?f+="
      ":dtd.$empty[a.tagName]||(f+=b.innerText()):f+=b.data}),/br>$/.test(f)||(f+="
      ")):f+=a.data+"
      ",!a.nextSibling()&&/
      $/.test(f)&&(f=f.replace(/
      $/,""));else if(f+="element"==a.type?dtd.$empty[a.tagName]?"":a.innerText():a.data,!/br\/?\s*>$/.test(f)){if(!a.nextSibling())return;f+="
      "}})}c.execCommand("inserthtml",'
      '+f+"
      ",!0),e=c.document.getElementById("coder"),domUtils.removeAttributes(e,"id");var i=e.previousSibling;i&&(3==i.nodeType&&1==i.nodeValue.length&&browser.ie&&6==browser.version||domUtils.isEmptyBlock(i))&&domUtils.remove(i);var d=c.selection.getRange();domUtils.isEmptyBlock(e)?d.setStart(e,0).setCursor(!1,!0):d.selectNodeContents(e).select()}},queryCommandValue:function(){var a=this.selection.getStartElementPath(),b="";return utils.each(a,function(a){if("PRE"==a.nodeName){var c=a.className.match(/brush:([^;]+)/);return b=c&&c[1]?c[1]:"",!1}}),b}},a.addInputRule(function(a){utils.each(a.getNodesByTagName("pre"),function(a){var b=a.getNodesByTagName("br");if(b.length)return void(browser.ie&&browser.ie11below&&browser.version>8&&utils.each(b,function(a){var b=UE.uNode.createText("\n");a.parentNode.insertBefore(b,a),a.parentNode.removeChild(a)}));if(!(browser.ie&&browser.ie11below&&browser.version>8)){var c=a.innerText().split(/\n/);a.innerHTML(""),utils.each(c,function(b){b.length&&a.appendChild(UE.uNode.createText(b)),a.appendChild(UE.uNode.createElement("br"))})}})}),a.addOutputRule(function(a){utils.each(a.getNodesByTagName("pre"),function(a){var b="";utils.each(a.children,function(a){b+="text"==a.type?a.data.replace(/[ ]/g," ").replace(/\n$/,""):"br"==a.tagName?"\n":dtd.$empty[a.tagName]?a.innerText():""}),a.innerText(b.replace(/( |\n)+$/,""))})}),a.notNeedCodeQuery={help:1,undo:1,redo:1,source:1,print:1,searchreplace:1,fullscreen:1,preview:1,insertparagraph:1,elementpath:1,insertcode:1,inserthtml:1,selectall:1};a.queryCommandState;a.queryCommandState=function(a){var b=this;return!b.notNeedCodeQuery[a.toLowerCase()]&&b.selection&&b.queryCommandValue("insertcode")?-1:UE.Editor.prototype.queryCommandState.apply(this,arguments)},a.addListener("beforeenterkeydown",function(){var b=a.selection.getRange(),c=domUtils.findParentByTagName(b.startContainer,"pre",!0);if(c){if(a.fireEvent("saveScene"),b.collapsed||b.deleteContents(),!browser.ie||browser.ie9above){var c,d=a.document.createElement("br");b.insertNode(d).setStartAfter(d).collapse(!0);var e=d.nextSibling;e||browser.ie&&!(browser.version>10)?b.setStartAfter(d):b.insertNode(d.cloneNode(!1)), +c=d.previousSibling;for(var f;c;)if(f=c,c=c.previousSibling,!c||"BR"==c.nodeName){c=f;break}if(c){for(var g="";c&&"BR"!=c.nodeName&&new RegExp("^[\\s"+domUtils.fillChar+"]*$").test(c.nodeValue);)g+=c.nodeValue,c=c.nextSibling;if("BR"!=c.nodeName){var h=c.nodeValue.match(new RegExp("^([\\s"+domUtils.fillChar+"]+)"));h&&h[1]&&(g+=h[1])}g&&(g=a.document.createTextNode(g),b.insertNode(g).setStartAfter(g))}b.collapse(!0).select(!0)}else if(browser.version>8){var i=a.document.createTextNode("\n"),j=b.startContainer;if(0==b.startOffset){var k=j.previousSibling;if(k){b.insertNode(i);var l=a.document.createTextNode(" ");b.setStartAfter(i).insertNode(l).setStart(l,0).collapse(!0).select(!0)}}else{b.insertNode(i).setStartAfter(i);var l=a.document.createTextNode(" ");j=b.startContainer.childNodes[b.startOffset],j&&!/^\n/.test(j.nodeValue)&&b.setStartBefore(i),b.insertNode(l).setStart(l,0).collapse(!0).select(!0)}}else{var d=a.document.createElement("br");b.insertNode(d),b.insertNode(a.document.createTextNode(domUtils.fillChar)),b.setStartAfter(d),c=d.previousSibling;for(var f;c;)if(f=c,c=c.previousSibling,!c||"BR"==c.nodeName){c=f;break}if(c){for(var g="";c&&"BR"!=c.nodeName&&new RegExp("^[ "+domUtils.fillChar+"]*$").test(c.nodeValue);)g+=c.nodeValue,c=c.nextSibling;if("BR"!=c.nodeName){var h=c.nodeValue.match(new RegExp("^([ "+domUtils.fillChar+"]+)"));h&&h[1]&&(g+=h[1])}g=a.document.createTextNode(g),b.insertNode(g).setStartAfter(g)}b.collapse(!0).select()}return a.fireEvent("saveScene"),!0}}),a.addListener("tabkeydown",function(b,c){var d=a.selection.getRange(),e=domUtils.findParentByTagName(d.startContainer,"pre",!0);if(e){if(a.fireEvent("saveScene"),c.shiftKey);else if(d.collapsed){var f=a.document.createTextNode(" ");d.insertNode(f).setStartAfter(f).collapse(!0).select(!0)}else{for(var g=d.createBookmark(),h=g.start.previousSibling;h;){if(e.firstChild===h&&!domUtils.isBr(h)){e.insertBefore(a.document.createTextNode(" "),h);break}if(domUtils.isBr(h)){e.insertBefore(a.document.createTextNode(" "),h.nextSibling);break}h=h.previousSibling}var i=g.end;for(h=g.start.nextSibling,e.firstChild===g.start&&e.insertBefore(a.document.createTextNode(" "),h.nextSibling);h&&h!==i;){if(domUtils.isBr(h)&&h.nextSibling){if(h.nextSibling===i)break;e.insertBefore(a.document.createTextNode(" "),h.nextSibling)}h=h.nextSibling}d.moveToBookmark(g).select()}return a.fireEvent("saveScene"),!0}}),a.addListener("beforeinserthtml",function(a,b){var c=this,d=c.selection.getRange(),e=domUtils.findParentByTagName(d.startContainer,"pre",!0);if(e){d.collapsed||d.deleteContents();var f="";if(browser.ie&&browser.version>8){utils.each(UE.filterNode(UE.htmlparser(b),c.options.filterTxtRules).children,function(a){"element"==a.type?"br"==a.tagName?f+="\n":dtd.$empty[a.tagName]||(utils.each(a.children,function(b){"element"==b.type?"br"==b.tagName?f+="\n":dtd.$empty[a.tagName]||(f+=b.innerText()):f+=b.data}),/\n$/.test(f)||(f+="\n")):f+=a.data+"\n",!a.nextSibling()&&/\n$/.test(f)&&(f=f.replace(/\n$/,""))});var g=c.document.createTextNode(utils.html(f.replace(/ /g," ")));d.insertNode(g).selectNode(g).select()}else{var h=c.document.createDocumentFragment();utils.each(UE.filterNode(UE.htmlparser(b),c.options.filterTxtRules).children,function(a){"element"==a.type?"br"==a.tagName?h.appendChild(c.document.createElement("br")):dtd.$empty[a.tagName]||(utils.each(a.children,function(b){"element"==b.type?"br"==b.tagName?h.appendChild(c.document.createElement("br")):dtd.$empty[a.tagName]||h.appendChild(c.document.createTextNode(utils.html(b.innerText().replace(/ /g," ")))):h.appendChild(c.document.createTextNode(utils.html(b.data.replace(/ /g," "))))}),"BR"!=h.lastChild.nodeName&&h.appendChild(c.document.createElement("br"))):h.appendChild(c.document.createTextNode(utils.html(a.data.replace(/ /g," ")))),a.nextSibling()||"BR"!=h.lastChild.nodeName||h.removeChild(h.lastChild)}),d.insertNode(h).select()}return!0}}),a.addListener("keydown",function(a,b){var c=this,d=b.keyCode||b.which;if(40==d){var e,f=c.selection.getRange(),g=f.startContainer;if(f.collapsed&&(e=domUtils.findParentByTagName(f.startContainer,"pre",!0))&&!e.nextSibling){for(var h=e.lastChild;h&&"BR"==h.nodeName;)h=h.previousSibling;(h===g||f.startContainer===e&&f.startOffset==e.childNodes.length)&&(c.execCommand("insertparagraph"),domUtils.preventDefault(b))}}}),a.addListener("delkeydown",function(b,c){var d=this.selection.getRange();d.txtToElmBoundary(!0);var e=d.startContainer;if(domUtils.isTagNode(e,"pre")&&d.collapsed&&domUtils.isStartInblock(d)){var f=a.document.createElement("p");return domUtils.fillNode(a.document,f),e.parentNode.insertBefore(f,e),domUtils.remove(e),d.setStart(f,0).setCursor(!1,!0),domUtils.preventDefault(c),!0}})},UE.commands.cleardoc={execCommand:function(a){var b=this,c=b.options.enterTag,d=b.selection.getRange();"br"==c?(b.body.innerHTML="
      ",d.setStart(b.body,0).setCursor()):(b.body.innerHTML="

      "+(ie?"":"
      ")+"

      ",d.setStart(b.body.firstChild,0).setCursor(!1,!0)),setTimeout(function(){b.fireEvent("clearDoc")},0)}},UE.plugin.register("anchor",function(){return{bindEvents:{ready:function(){utils.cssRule("anchor",".anchorclass{background: url('"+this.options.themePath+this.options.theme+"/images/anchor.gif') no-repeat scroll left center transparent;cursor: auto;display: inline-block;height: 16px;width: 15px;}",this.document)}},outputRule:function(a){utils.each(a.getNodesByTagName("img"),function(a){var b;(b=a.getAttr("anchorname"))&&(a.tagName="a",a.setAttr({anchorname:"",name:b,"class":""}))})},inputRule:function(a){utils.each(a.getNodesByTagName("a"),function(a){var b;(b=a.getAttr("name"))&&!a.getAttr("href")&&(a.tagName="img",a.setAttr({anchorname:a.getAttr("name"),"class":"anchorclass"}),a.setAttr("name"))})},commands:{anchor:{execCommand:function(a,b){var c=this.selection.getRange(),d=c.getClosedNode();if(d&&d.getAttribute("anchorname"))b?d.setAttribute("anchorname",b):(c.setStartBefore(d).setCursor(),domUtils.remove(d));else if(b){var e=this.document.createElement("img");c.collapse(!0),domUtils.setAttributes(e,{anchorname:b,"class":"anchorclass"}),c.insertNode(e).setStartAfter(e).setCursor(!1,!0)}}}}}}),UE.plugins.wordcount=function(){var a=this;a.setOpt("wordCount",!0),a.addListener("contentchange",function(){a.fireEvent("wordcount")});var b;a.addListener("ready",function(){var a=this;domUtils.on(a.body,"keyup",function(c){var d=c.keyCode||c.which,e={16:1,18:1,20:1,37:1,38:1,39:1,40:1};d in e||(clearTimeout(b),b=setTimeout(function(){a.fireEvent("wordcount")},200))})})},UE.plugins.pagebreak=function(){function a(a){if(domUtils.isEmptyBlock(a)){for(var b,d=a.firstChild;d&&1==d.nodeType&&domUtils.isEmptyBlock(d);)b=d,d=d.firstChild;!b&&(b=a),domUtils.fillNode(c.document,b)}}function b(a){return a&&1==a.nodeType&&"HR"==a.tagName&&"pagebreak"==a.className}var c=this,d=["td"];c.setOpt("pageBreakTag","_ueditor_page_break_tag_"),c.ready(function(){utils.cssRule("pagebreak",".pagebreak{display:block;clear:both !important;cursor:default !important;width: 100% !important;margin:0;}",c.document)}),c.addInputRule(function(a){a.traversal(function(a){if("text"==a.type&&a.data==c.options.pageBreakTag){var b=UE.uNode.createElement('
      ');a.parentNode.insertBefore(b,a),a.parentNode.removeChild(a)}})}),c.addOutputRule(function(a){utils.each(a.getNodesByTagName("hr"),function(a){if("pagebreak"==a.getAttr("class")){var b=UE.uNode.createText(c.options.pageBreakTag);a.parentNode.insertBefore(b,a),a.parentNode.removeChild(a)}})}),c.commands.pagebreak={execCommand:function(){var e=c.selection.getRange(),f=c.document.createElement("hr");domUtils.setAttributes(f,{"class":"pagebreak",noshade:"noshade",size:"5"}),domUtils.unSelectable(f);var g,h=domUtils.findParentByTagName(e.startContainer,d,!0),i=[];if(h)switch(h.tagName){case"TD":if(g=h.parentNode,g.previousSibling)g.parentNode.insertBefore(f,g),i=domUtils.findParents(f);else{var j=domUtils.findParentByTagName(g,"table");j.parentNode.insertBefore(f,j),i=domUtils.findParents(f,!0)}g=i[1],f!==g&&domUtils.breakParent(f,g),c.fireEvent("afteradjusttable",c.document)}else{if(!e.collapsed){e.deleteContents();for(var k=e.startContainer;!domUtils.isBody(k)&&domUtils.isBlockElm(k)&&domUtils.isEmptyNode(k);)e.setStartBefore(k).collapse(!0),domUtils.remove(k),k=e.startContainer}e.insertNode(f);for(var l,g=f.parentNode;!domUtils.isBody(g);)domUtils.breakParent(f,g),l=f.nextSibling,l&&domUtils.isEmptyBlock(l)&&domUtils.remove(l),g=f.parentNode;l=f.nextSibling;var m=f.previousSibling;if(b(m)?domUtils.remove(m):m&&a(m),l)b(l)?domUtils.remove(l):a(l),e.setEndAfter(f).collapse(!1);else{var n=c.document.createElement("p");f.parentNode.appendChild(n),domUtils.fillNode(c.document,n),e.setStart(n,0).collapse(!0)}e.select(!0)}}}},UE.plugin.register("wordimage",function(){var a=this,b=[];return{commands:{wordimage:{execCommand:function(){for(var b,c=domUtils.getElementsByTagName(a.body,"img"),d=[],e=0;b=c[e++];){var f=b.getAttribute("word_img");f&&d.push(f)}return d},queryCommandState:function(){b=domUtils.getElementsByTagName(a.body,"img");for(var c,d=0;c=b[d++];)if(c.getAttribute("word_img"))return 1;return-1},notNeedUndo:!0}},inputRule:function(b){utils.each(b.getNodesByTagName("img"),function(b){var c=b.attrs,d=parseInt(c.width)<128||parseInt(c.height)<43,e=a.options,f=e.UEDITOR_HOME_URL+"themes/default/images/spacer.gif";c.src&&/^(?:(file:\/+))/.test(c.src)&&b.setAttr({width:c.width,height:c.height,alt:c.alt,word_img:c.src,src:f,style:"background:url("+(d?e.themePath+e.theme+"/images/word.gif":e.langPath+e.lang+"/images/localimage.png")+") no-repeat center center;border:1px solid #ddd"})})}}}),UE.plugins.dragdrop=function(){var a=this;a.ready(function(){domUtils.on(this.body,"dragend",function(){var b=a.selection.getRange(),c=b.getClosedNode()||a.selection.getStart();if(c&&"IMG"==c.tagName){for(var d,e=c.previousSibling;(d=c.nextSibling)&&1==d.nodeType&&"SPAN"==d.tagName&&!d.firstChild;)domUtils.remove(d);(!e||1!=e.nodeType||domUtils.isEmptyBlock(e))&&e||d&&(!d||domUtils.isEmptyBlock(d))||(e&&"P"==e.tagName&&!domUtils.isEmptyBlock(e)?(e.appendChild(c),domUtils.moveChild(d,e),domUtils.remove(d)):d&&"P"==d.tagName&&!domUtils.isEmptyBlock(d)&&d.insertBefore(c,d.firstChild),e&&"P"==e.tagName&&domUtils.isEmptyBlock(e)&&domUtils.remove(e),d&&"P"==d.tagName&&domUtils.isEmptyBlock(d)&&domUtils.remove(d),b.selectNode(c).select(),a.fireEvent("saveScene"))}})}),a.addListener("keyup",function(b,c){var d=c.keyCode||c.which;if(13==d){var e,f=a.selection.getRange();(e=domUtils.findParentByTagName(f.startContainer,"p",!0))&&"center"==domUtils.getComputedStyle(e,"text-align")&&domUtils.removeStyle(e,"text-align")}})},UE.plugins.undo=function(){function a(a,b){if(a.length!=b.length)return 0;for(var c=0,d=a.length;cf&&this.list.shift(),this.index=this.list.length-1,this.clearKey(),this.update())},this.update=function(){this.hasRedo=!!this.list[this.index+1],this.hasUndo=!!this.list[this.index-1]},this.reset=function(){this.list=[],this.index=0,this.hasUndo=!1,this.hasRedo=!1,this.clearKey()},this.clearKey=function(){m=0,k=null}}var d,e=this,f=e.options.maxUndoCount||20,g=e.options.maxInputCount||20,h=new RegExp(domUtils.fillChar+"|","gi"),i={ol:1,ul:1,table:1,tbody:1,tr:1,body:1},j=e.options.autoClearEmptyNode;e.undoManger=new c,e.undoManger.editor=e,e.addListener("saveScene",function(){var a=Array.prototype.splice.call(arguments,1);this.undoManger.save.apply(this.undoManger,a)}),e.addListener("reset",function(a,b){b||this.undoManger.reset()}),e.commands.redo=e.commands.undo={execCommand:function(a){this.undoManger[a]()},queryCommandState:function(a){return this.undoManger["has"+("undo"==a.toLowerCase()?"Undo":"Redo")]?0:-1},notNeedUndo:1};var k,l={16:1,17:1,18:1,37:1,38:1,39:1,40:1},m=0,n=!1;e.addListener("ready",function(){domUtils.on(this.body,"compositionstart",function(){n=!0}),domUtils.on(this.body,"compositionend",function(){n=!1})}),e.addshortcutkey({Undo:"ctrl+90",Redo:"ctrl+89"});var o=!0;e.addListener("keydown",function(a,b){function c(a){a.undoManger.save(!1,!0),a.fireEvent("selectionchange")}var e=this,f=b.keyCode||b.which;if(!(l[f]||b.ctrlKey||b.metaKey||b.shiftKey||b.altKey)){if(n)return;if(!e.selection.getRange().collapsed)return e.undoManger.save(!1,!0),void(o=!1);0==e.undoManger.list.length&&e.undoManger.save(!0),clearTimeout(d),d=setTimeout(function(){if(n)var a=setInterval(function(){n||(c(e),clearInterval(a))},300);else c(e)},200),k=f,m++,m>=g&&c(e)}}),e.addListener("keyup",function(a,b){var c=b.keyCode||b.which;if(!(l[c]||b.ctrlKey||b.metaKey||b.shiftKey||b.altKey)){if(n)return;o||(this.undoManger.save(!1,!0),o=!0)}}),e.stopCmdUndo=function(){e.__hasEnterExecCommand=!0},e.startCmdUndo=function(){e.__hasEnterExecCommand=!1}},UE.plugin.register("copy",function(){function a(){ZeroClipboard.config({debug:!1,swfPath:b.options.UEDITOR_HOME_URL+"third-party/zeroclipboard/ZeroClipboard.swf"});var a=b.zeroclipboard=new ZeroClipboard;a.on("copy",function(a){var c=a.client,d=b.selection.getRange(),e=document.createElement("div");e.appendChild(d.cloneContents()),c.setText(e.innerText||e.textContent),c.setHtml(e.innerHTML),d.select()}),a.on("mouseover mouseout",function(a){var b=a.target;"mouseover"==a.type?domUtils.addClass(b,"edui-state-hover"):"mouseout"==a.type&&domUtils.removeClasses(b,"edui-state-hover")}),a.on("wrongflash noflash",function(){ZeroClipboard.destroy()})}var b=this;return{bindEvents:{ready:function(){browser.ie||(window.ZeroClipboard?a():utils.loadFile(document,{src:b.options.UEDITOR_HOME_URL+"third-party/zeroclipboard/ZeroClipboard.js",tag:"script",type:"text/javascript",defer:"defer"},function(){a()}))}},commands:{copy:{execCommand:function(a){b.document.execCommand("copy")||alert(b.getLang("copymsg"))}}}}}),UE.plugins.paste=function(){function a(a){var b=this.document;if(!b.getElementById("baidu_pastebin")){var c=this.selection.getRange(),d=c.createBookmark(),e=b.createElement("div");e.id="baidu_pastebin",browser.webkit&&e.appendChild(b.createTextNode(domUtils.fillChar+domUtils.fillChar)),b.body.appendChild(e),d.start.style.display="",e.style.cssText="position:absolute;width:1px;height:1px;overflow:hidden;left:-1000px;white-space:nowrap;top:"+domUtils.getXY(d.start).y+"px",c.selectNodeContents(e).select(!0),setTimeout(function(){if(browser.webkit)for(var f,g=0,h=b.querySelectorAll("#baidu_pastebin");f=h[g++];){if(!domUtils.isEmptyNode(f)){e=f;break}domUtils.remove(f)}try{e.parentNode.removeChild(e)}catch(i){}c.moveToBookmark(d).select(!0),a(e)},0)}}function b(a){return a.replace(/<(\/?)([\w\-]+)([^>]*)>/gi,function(a,b,c,d){return c=c.toLowerCase(),{img:1}[c]?a:(d=d.replace(/([\w\-]*?)\s*=\s*(("([^"]*)")|('([^']*)')|([^\s>]+))/gi,function(a,b,c){return{src:1,href:1,name:1}[b.toLowerCase()]?b+"="+c+" ":""}),{span:1,div:1}[c]?"":"<"+b+c+" "+utils.trim(d)+">")})}function c(a){var c;if(a.firstChild){for(var h,i=domUtils.getElementsByTagName(a,"span"),j=0;h=i[j++];)"_baidu_cut_start"!=h.id&&"_baidu_cut_end"!=h.id||domUtils.remove(h);if(browser.webkit){for(var k,l=a.querySelectorAll("div br"),j=0;k=l[j++];){var m=k.parentNode;"DIV"==m.tagName&&1==m.childNodes.length&&(m.innerHTML="


      ",domUtils.remove(m))}for(var n,o=a.querySelectorAll("#baidu_pastebin"),j=0;n=o[j++];){var p=d.document.createElement("p");for(n.parentNode.insertBefore(p,n);n.firstChild;)p.appendChild(n.firstChild);domUtils.remove(n)}for(var q,r=a.querySelectorAll("meta"),j=0;q=r[j++];)domUtils.remove(q);var l=a.querySelectorAll("br");for(j=0;q=l[j++];)/^apple-/i.test(q.className)&&domUtils.remove(q)}if(browser.gecko){var s=a.querySelectorAll("[_moz_dirty]");for(j=0;q=s[j++];)q.removeAttribute("_moz_dirty")}if(!browser.ie)for(var q,t=a.querySelectorAll("span.Apple-style-span"),j=0;q=t[j++];)domUtils.remove(q,!0);c=a.innerHTML,c=UE.filterWord(c);var u=UE.htmlparser(c);if(d.options.filterRules&&UE.filterNode(u,d.options.filterRules),d.filterInputRule(u),browser.webkit){var v=u.lastChild();v&&"element"==v.type&&"br"==v.tagName&&u.removeChild(v),utils.each(d.body.querySelectorAll("div"),function(a){domUtils.isEmptyBlock(a)&&domUtils.remove(a,!0)})}if(c={html:u.toHtml()},d.fireEvent("beforepaste",c,u),!c.html)return;u=UE.htmlparser(c.html,!0),1===d.queryCommandState("pasteplain")?d.execCommand("insertHtml",UE.filterNode(u,d.options.filterTxtRules).toHtml(),!0):(UE.filterNode(u,d.options.filterTxtRules),e=u.toHtml(),f=c.html,g=d.selection.getRange().createAddress(!0),d.execCommand("insertHtml",d.getOpt("retainOnlyLabelPasted")===!0?b(f):f,!0)),d.fireEvent("afterpaste",c)}}var d=this;d.setOpt({retainOnlyLabelPasted:!1});var e,f,g;d.addListener("pasteTransfer",function(a,c){if(g&&e&&f&&e!=f){var h=d.selection.getRange();if(h.moveToAddress(g,!0),!h.collapsed){for(;!domUtils.isBody(h.startContainer);){var i=h.startContainer;if(1==i.nodeType){if(i=i.childNodes[h.startOffset],!i){h.setStartBefore(h.startContainer);continue}var j=i.previousSibling;j&&3==j.nodeType&&new RegExp("^[\n\r\t "+domUtils.fillChar+"]*$").test(j.nodeValue)&&h.setStartBefore(j)}if(0!=h.startOffset)break;h.setStartBefore(h.startContainer)}for(;!domUtils.isBody(h.endContainer);){var k=h.endContainer;if(1==k.nodeType){if(k=k.childNodes[h.endOffset],!k){h.setEndAfter(h.endContainer);continue}var l=k.nextSibling;l&&3==l.nodeType&&new RegExp("^[\n\r\t"+domUtils.fillChar+"]*$").test(l.nodeValue)&&h.setEndAfter(l)}if(h.endOffset!=h.endContainer[3==h.endContainer.nodeType?"nodeValue":"childNodes"].length)break;h.setEndAfter(h.endContainer)}}h.deleteContents(),h.select(!0),d.__hasEnterExecCommand=!0;var m=f;2===c?m=b(m):c&&(m=e),d.execCommand("inserthtml",m,!0),d.__hasEnterExecCommand=!1;for(var n=d.selection.getRange();!domUtils.isBody(n.startContainer)&&!n.startOffset&&n.startContainer[3==n.startContainer.nodeType?"nodeValue":"childNodes"].length;)n.setStartBefore(n.startContainer);var o=n.createAddress(!0);g.endAddress=o.startAddress}}),d.addListener("ready",function(){domUtils.on(d.body,"cut",function(){var a=d.selection.getRange();!a.collapsed&&d.undoManger&&d.undoManger.save()}),domUtils.on(d.body,browser.ie||browser.opera?"keydown":"paste",function(b){(!browser.ie&&!browser.opera||(b.ctrlKey||b.metaKey)&&"86"==b.keyCode)&&a.call(d,function(a){c(a)})})}),d.commands.paste={execCommand:function(b){browser.ie?(a.call(d,function(a){c(a)}),d.document.execCommand("paste")):alert(d.getLang("pastemsg"))}}},UE.plugins.pasteplain=function(){var a=this;a.setOpt({pasteplain:!1,filterTxtRules:function(){function a(a){a.tagName="p",a.setStyle()}function b(a){a.parentNode.removeChild(a,!0)}return{"-":"script style object iframe embed input select",p:{$:{}},br:{$:{}},div:function(a){for(var b,c=UE.uNode.createElement("p");b=a.firstChild();)"text"!=b.type&&UE.dom.dtd.$block[b.tagName]?c.firstChild()?(a.parentNode.insertBefore(c,a),c=UE.uNode.createElement("p")):a.parentNode.insertBefore(b,a):c.appendChild(b);c.firstChild()&&a.parentNode.insertBefore(c,a),a.parentNode.removeChild(a)},ol:b,ul:b,dl:b,dt:b,dd:b,li:b,caption:a,th:a,tr:a,h1:a,h2:a,h3:a,h4:a,h5:a,h6:a,td:function(a){var b=!!a.innerText();b&&a.parentNode.insertAfter(UE.uNode.createText("    "),a),a.parentNode.removeChild(a,a.innerText())}}}()});var b=a.options.pasteplain;a.commands.pasteplain={queryCommandState:function(){return b?1:0},execCommand:function(){b=0|!b},notNeedUndo:1}},UE.plugins.list=function(){function a(a){var b=[];for(var c in a)b.push(c);return b}function b(a){var b=a.className;return domUtils.hasClass(a,/custom_/)?b.match(/custom_(\w+)/)[1]:domUtils.getStyle(a,"list-style-type")}function c(a,c){utils.each(domUtils.getElementsByTagName(a,"ol ul"),function(f){if(domUtils.inDoc(f,a)){var g=f.parentNode;if(g.tagName==f.tagName){var h=b(f)||("OL"==f.tagName?"decimal":"disc"),i=b(g)||("OL"==g.tagName?"decimal":"disc");if(h==i){var l=utils.indexOf(k[f.tagName],h);l=l+1==k[f.tagName].length?0:l+1,e(f,k[f.tagName][l])}}var m=0,n=2;domUtils.hasClass(f,/custom_/)?/[ou]l/i.test(g.tagName)&&domUtils.hasClass(g,/custom_/)||(n=1):/[ou]l/i.test(g.tagName)&&domUtils.hasClass(g,/custom_/)&&(n=3);var o=domUtils.getStyle(f,"list-style-type");o&&(f.style.cssText="list-style-type:"+o),f.className=utils.trim(f.className.replace(/list-paddingleft-\w+/,""))+" list-paddingleft-"+n,utils.each(domUtils.getElementsByTagName(f,"li"),function(a){if(a.style.cssText&&(a.style.cssText=""),!a.firstChild)return void domUtils.remove(a);if(a.parentNode===f){if(m++,domUtils.hasClass(f,/custom_/)){var c=1,d=b(f);if("OL"==f.tagName){if(d)switch(d){case"cn":case"cn1":case"cn2":m>10&&(m%10==0||m>10&&m<20)?c=2:m>20&&(c=3);break;case"num2":m>9&&(c=2)}a.className="list-"+j[d]+m+" list-"+d+"-paddingleft-"+c}else a.className="list-"+j[d]+" list-"+d+"-paddingleft"}else a.className=a.className.replace(/list-[\w\-]+/gi,"");var e=a.getAttribute("class");null===e||e.replace(/\s/g,"")||domUtils.removeAttributes(a,"class")}}),!c&&d(f,f.tagName.toLowerCase(),b(f)||domUtils.getStyle(f,"list-style-type"),!0)}})}function d(a,d,e,f){var g=a.nextSibling;g&&1==g.nodeType&&g.tagName.toLowerCase()==d&&(b(g)||domUtils.getStyle(g,"list-style-type")||("ol"==d?"decimal":"disc"))==e&&(domUtils.moveChild(g,a),0==g.childNodes.length&&domUtils.remove(g)),g&&domUtils.isFillChar(g)&&domUtils.remove(g);var h=a.previousSibling;h&&1==h.nodeType&&h.tagName.toLowerCase()==d&&(b(h)||domUtils.getStyle(h,"list-style-type")||("ol"==d?"decimal":"disc"))==e&&domUtils.moveChild(a,h),h&&domUtils.isFillChar(h)&&domUtils.remove(h),!f&&domUtils.isEmptyBlock(a)&&domUtils.remove(a),b(a)&&c(a.ownerDocument,!0)}function e(a,b){j[b]&&(a.className="custom_"+b);try{domUtils.setStyle(a,"list-style-type",b)}catch(c){}}function f(a){var b=a.previousSibling;b&&domUtils.isEmptyBlock(b)&&domUtils.remove(b),b=a.nextSibling,b&&domUtils.isEmptyBlock(b)&&domUtils.remove(b)}function g(a){for(;a&&!domUtils.isBody(a);){if("TABLE"==a.nodeName)return null;if("LI"==a.nodeName)return a;a=a.parentNode}}var h=this,i={TD:1,PRE:1,BLOCKQUOTE:1},j={cn:"cn-1-",cn1:"cn-2-",cn2:"cn-3-",num:"num-1-",num1:"num-2-",num2:"num-3-",dash:"dash",dot:"dot"};h.setOpt({autoTransWordToList:!1,insertorderedlist:{num:"",num1:"",num2:"",cn:"",cn1:"",cn2:"",decimal:"","lower-alpha":"","lower-roman":"","upper-alpha":"","upper-roman":""},insertunorderedlist:{circle:"",disc:"",square:"",dash:"",dot:""},listDefaultPaddingLeft:"30",listiconpath:"http://bs.baidu.com/listicon/",maxListLevel:-1,disablePInList:!1});var k={OL:a(h.options.insertorderedlist),UL:a(h.options.insertunorderedlist)},l=h.options.listiconpath;for(var m in j)h.options.insertorderedlist.hasOwnProperty(m)||h.options.insertunorderedlist.hasOwnProperty(m)||delete j[m];h.ready(function(){var a=[];for(var b in j){if("dash"==b||"dot"==b)a.push("li.list-"+j[b]+"{background-image:url("+l+j[b]+".gif)}"),a.push("ul.custom_"+b+"{list-style:none;}ul.custom_"+b+" li{background-position:0 3px;background-repeat:no-repeat}");else{for(var c=0;c<99;c++)a.push("li.list-"+j[b]+c+"{background-image:url("+l+"list-"+j[b]+c+".gif)}");a.push("ol.custom_"+b+"{list-style:none;}ol.custom_"+b+" li{background-position:0 3px;background-repeat:no-repeat}")}switch(b){case"cn":a.push("li.list-"+b+"-paddingleft-1{padding-left:25px}"),a.push("li.list-"+b+"-paddingleft-2{padding-left:40px}"),a.push("li.list-"+b+"-paddingleft-3{padding-left:55px}");break;case"cn1":a.push("li.list-"+b+"-paddingleft-1{padding-left:30px}"),a.push("li.list-"+b+"-paddingleft-2{padding-left:40px}"),a.push("li.list-"+b+"-paddingleft-3{padding-left:55px}");break;case"cn2":a.push("li.list-"+b+"-paddingleft-1{padding-left:40px}"),a.push("li.list-"+b+"-paddingleft-2{padding-left:55px}"),a.push("li.list-"+b+"-paddingleft-3{padding-left:68px}");break;case"num":case"num1":a.push("li.list-"+b+"-paddingleft-1{padding-left:25px}");break;case"num2":a.push("li.list-"+b+"-paddingleft-1{padding-left:35px}"),a.push("li.list-"+b+"-paddingleft-2{padding-left:40px}");break;case"dash":a.push("li.list-"+b+"-paddingleft{padding-left:35px}");break;case"dot":a.push("li.list-"+b+"-paddingleft{padding-left:20px}")}}a.push(".list-paddingleft-1{padding-left:0}"),a.push(".list-paddingleft-2{padding-left:"+h.options.listDefaultPaddingLeft+"px}"),a.push(".list-paddingleft-3{padding-left:"+2*h.options.listDefaultPaddingLeft+"px}"),utils.cssRule("list","ol,ul{margin:0;pading:0;"+(browser.ie?"":"width:95%")+"}li{clear:both;}"+a.join("\n"),h.document)}),h.ready(function(){domUtils.on(h.body,"cut",function(){setTimeout(function(){var a,b=h.selection.getRange();if(!b.collapsed&&(a=domUtils.findParentByTagName(b.startContainer,"li",!0))&&!a.nextSibling&&domUtils.isEmptyBlock(a)){var c,d=a.parentNode;if(c=d.previousSibling)domUtils.remove(d),b.setStartAtLast(c).collapse(!0),b.select(!0);else if(c=d.nextSibling)domUtils.remove(d),b.setStartAtFirst(c).collapse(!0),b.select(!0);else{var e=h.document.createElement("p");domUtils.fillNode(h.document,e),d.parentNode.insertBefore(e,d),domUtils.remove(d),b.setStart(e,0).collapse(!0),b.select(!0)}}})})}),h.addListener("beforepaste",function(a,c){var d,e=this,f=e.selection.getRange(),g=UE.htmlparser(c.html,!0);if(d=domUtils.findParentByTagName(f.startContainer,"li",!0)){var h=d.parentNode,i="OL"==h.tagName?"ul":"ol";utils.each(g.getNodesByTagName(i),function(c){if(c.tagName=h.tagName,c.setAttr(),c.parentNode===g)a=b(h)||("OL"==h.tagName?"decimal":"disc");else{var d=c.parentNode.getAttr("class");a=d&&/custom_/.test(d)?d.match(/custom_(\w+)/)[1]:c.parentNode.getStyle("list-style-type"),a||(a="OL"==h.tagName?"decimal":"disc")}var e=utils.indexOf(k[h.tagName],a);c.parentNode!==g&&(e=e+1==k[h.tagName].length?0:e+1);var f=k[h.tagName][e];j[f]?c.setAttr("class","custom_"+f):c.setStyle("list-style-type",f)})}c.html=g.toHtml()}),h.getOpt("disablePInList")===!0&&h.addOutputRule(function(a){utils.each(a.getNodesByTagName("li"),function(a){var b=[],c=0;utils.each(a.children,function(d){if("p"==d.tagName){for(var e;e=d.children.pop();)b.splice(c,0,e),e.parentNode=a,lastNode=e;if(e=b[b.length-1],!e||"element"!=e.type||"br"!=e.tagName){var f=UE.uNode.createElement("br");f.parentNode=a,b.push(f)}c=b.length}}),b.length&&(a.children=b)})}),h.addInputRule(function(a){function b(a,b){var e=b.firstChild();if(e&&"element"==e.type&&"span"==e.tagName&&/Wingdings|Symbol/.test(e.getStyle("font-family"))){for(var f in d)if(d[f]==e.data)return f;return"disc"}for(var f in c)if(c[f].test(a))return f}if(utils.each(a.getNodesByTagName("li"),function(a){for(var b,c=UE.uNode.createElement("p"),d=0;b=a.children[d];)"text"==b.type||dtd.p[b.tagName]?c.appendChild(b):c.firstChild()?(a.insertBefore(c,b),c=UE.uNode.createElement("p"),d+=2):d++;(c.firstChild()&&!c.parentNode||!a.firstChild())&&a.appendChild(c),c.firstChild()||c.innerHTML(browser.ie?" ":"
      ");var e=a.firstChild(),f=e.lastChild();f&&"text"==f.type&&/^\s*$/.test(f.data)&&e.removeChild(f)}),h.options.autoTransWordToList){var c={num1:/^\d+\)/,decimal:/^\d+\./,"lower-alpha":/^[a-z]+\)/,"upper-alpha":/^[A-Z]+\./,cn:/^[\u4E00\u4E8C\u4E09\u56DB\u516d\u4e94\u4e03\u516b\u4e5d]+[\u3001]/,cn2:/^\([\u4E00\u4E8C\u4E09\u56DB\u516d\u4e94\u4e03\u516b\u4e5d]+\)/},d={square:"n"};utils.each(a.getNodesByTagName("p"),function(a){function d(a,b,d){if("ol"==a.tagName)if(browser.ie){var e=b.firstChild();"element"==e.type&&"span"==e.tagName&&c[d].test(e.innerText())&&b.removeChild(e)}else b.innerHTML(b.innerHTML().replace(c[d],""));else b.removeChild(b.firstChild());var f=UE.uNode.createElement("li");f.appendChild(b),a.appendChild(f)}if("MsoListParagraph"==a.getAttr("class")){a.setStyle("margin",""),a.setStyle("margin-left",""),a.setAttr("class","");var e,f=a,g=a;if("li"!=a.parentNode.tagName&&(e=b(a.innerText(),a))){var i=UE.uNode.createElement(h.options.insertorderedlist.hasOwnProperty(e)?"ol":"ul");for(j[e]?i.setAttr("class","custom_"+e):i.setStyle("list-style-type",e);a&&"li"!=a.parentNode.tagName&&b(a.innerText(),a);)f=a.nextSibling(),f||a.parentNode.insertBefore(i,a),d(i,a,e),a=f;!i.parentNode&&a&&a.parentNode&&a.parentNode.insertBefore(i,a)}var k=g.firstChild();k&&"element"==k.type&&"span"==k.tagName&&/^\s*( )+\s*$/.test(k.innerText())&&k.parentNode.removeChild(k)}})}}),h.addListener("contentchange",function(){c(h.document)}),h.addListener("keydown",function(a,b){function c(){b.preventDefault?b.preventDefault():b.returnValue=!1,h.fireEvent("contentchange"),h.undoManger&&h.undoManger.save()}function d(a,b){for(;a&&!domUtils.isBody(a);){if(b(a))return null;if(1==a.nodeType&&/[ou]l/i.test(a.tagName))return a;a=a.parentNode}return null}var e=b.keyCode||b.which;if(13==e&&!b.shiftKey){var g=h.selection.getRange(),i=domUtils.findParent(g.startContainer,function(a){return domUtils.isBlockElm(a)},!0),j=domUtils.findParentByTagName(g.startContainer,"li",!0);if(i&&"PRE"!=i.tagName&&!j){var k=i.innerHTML.replace(new RegExp(domUtils.fillChar,"g"),"");/^\s*1\s*\.[^\d]/.test(k)&&(i.innerHTML=k.replace(/^\s*1\s*\./,""),g.setStartAtLast(i).collapse(!0).select(),h.__hasEnterExecCommand=!0,h.execCommand("insertorderedlist"),h.__hasEnterExecCommand=!1)}var l=h.selection.getRange(),m=d(l.startContainer,function(a){return"TABLE"==a.tagName}),n=l.collapsed?m:d(l.endContainer,function(a){return"TABLE"==a.tagName});if(m&&n&&m===n){if(!l.collapsed){if(m=domUtils.findParentByTagName(l.startContainer,"li",!0),n=domUtils.findParentByTagName(l.endContainer,"li",!0),!m||!n||m!==n){var o=l.cloneRange(),p=o.collapse(!1).createBookmark();l.deleteContents(),o.moveToBookmark(p);var j=domUtils.findParentByTagName(o.startContainer,"li",!0);return f(j),o.select(),void c()}if(l.deleteContents(),j=domUtils.findParentByTagName(l.startContainer,"li",!0),j&&domUtils.isEmptyBlock(j))return v=j.previousSibling,next=j.nextSibling,s=h.document.createElement("p"),domUtils.fillNode(h.document,s),q=j.parentNode,v&&next?(l.setStart(next,0).collapse(!0).select(!0),domUtils.remove(j)):((v||next)&&v?j.parentNode.parentNode.insertBefore(s,q.nextSibling):q.parentNode.insertBefore(s,q),domUtils.remove(j),q.firstChild||domUtils.remove(q),l.setStart(s,0).setCursor()),void c()}if(j=domUtils.findParentByTagName(l.startContainer,"li",!0)){ +if(domUtils.isEmptyBlock(j)){p=l.createBookmark();var q=j.parentNode;if(j!==q.lastChild?(domUtils.breakParent(j,q),f(j)):(q.parentNode.insertBefore(j,q.nextSibling),domUtils.isEmptyNode(q)&&domUtils.remove(q)),!dtd.$list[j.parentNode.tagName])if(domUtils.isBlockElm(j.firstChild))domUtils.remove(j,!0);else{for(s=h.document.createElement("p"),j.parentNode.insertBefore(s,j);j.firstChild;)s.appendChild(j.firstChild);domUtils.remove(j)}l.moveToBookmark(p).select()}else{var r=j.firstChild;if(!r||!domUtils.isBlockElm(r)){var s=h.document.createElement("p");for(!j.firstChild&&domUtils.fillNode(h.document,s);j.firstChild;)s.appendChild(j.firstChild);j.appendChild(s),r=s}var t=h.document.createElement("span");l.insertNode(t),domUtils.breakParent(t,j);var u=t.nextSibling;r=u.firstChild,r||(s=h.document.createElement("p"),domUtils.fillNode(h.document,s),u.appendChild(s),r=s),domUtils.isEmptyNode(r)&&(r.innerHTML="",domUtils.fillNode(h.document,r)),l.setStart(r,0).collapse(!0).shrinkBoundary().select(),domUtils.remove(t);var v=u.previousSibling;v&&domUtils.isEmptyBlock(v)&&(v.innerHTML="

      ",domUtils.fillNode(h.document,v.firstChild))}c()}}}if(8==e&&(l=h.selection.getRange(),l.collapsed&&domUtils.isStartInblock(l)&&(o=l.cloneRange().trimBoundary(),j=domUtils.findParentByTagName(l.startContainer,"li",!0),j&&domUtils.isStartInblock(o)))){if(m=domUtils.findParentByTagName(l.startContainer,"p",!0),m&&m!==j.firstChild){var q=domUtils.findParentByTagName(m,["ol","ul"]);return domUtils.breakParent(m,q),f(m),h.fireEvent("contentchange"),l.setStart(m,0).setCursor(!1,!0),h.fireEvent("saveScene"),void domUtils.preventDefault(b)}if(j&&(v=j.previousSibling)){if(46==e&&j.childNodes.length)return;if(dtd.$list[v.tagName]&&(v=v.lastChild),h.undoManger&&h.undoManger.save(),r=j.firstChild,domUtils.isBlockElm(r))if(domUtils.isEmptyNode(r))for(v.appendChild(r),l.setStart(r,0).setCursor(!1,!0);j.firstChild;)v.appendChild(j.firstChild);else t=h.document.createElement("span"),l.insertNode(t),domUtils.isEmptyBlock(v)&&(v.innerHTML=""),domUtils.moveChild(j,v),l.setStartBefore(t).collapse(!0).select(!0),domUtils.remove(t);else if(domUtils.isEmptyNode(j)){var s=h.document.createElement("p");v.appendChild(s),l.setStart(s,0).setCursor()}else for(l.setEnd(v,v.childNodes.length).collapse().select(!0);j.firstChild;)v.appendChild(j.firstChild);return domUtils.remove(j),h.fireEvent("contentchange"),h.fireEvent("saveScene"),void domUtils.preventDefault(b)}if(j&&!j.previousSibling){var q=j.parentNode,p=l.createBookmark();if(domUtils.isTagNode(q.parentNode,"ol ul"))q.parentNode.insertBefore(j,q),domUtils.isEmptyNode(q)&&domUtils.remove(q);else{for(;j.firstChild;)q.parentNode.insertBefore(j.firstChild,q);domUtils.remove(j),domUtils.isEmptyNode(q)&&domUtils.remove(q)}return l.moveToBookmark(p).setCursor(!1,!0),h.fireEvent("contentchange"),h.fireEvent("saveScene"),void domUtils.preventDefault(b)}}}),h.addListener("keyup",function(a,c){var e=c.keyCode||c.which;if(8==e){var f,g=h.selection.getRange();(f=domUtils.findParentByTagName(g.startContainer,["ol","ul"],!0))&&d(f,f.tagName.toLowerCase(),b(f)||domUtils.getComputedStyle(f,"list-style-type"),!0)}}),h.addListener("tabkeydown",function(){function a(a){if(h.options.maxListLevel!=-1){for(var b=a.parentNode,c=0;/[ou]l/i.test(b.tagName);)c++,b=b.parentNode;if(c>=h.options.maxListLevel)return!0}}var c=h.selection.getRange(),f=domUtils.findParentByTagName(c.startContainer,"li",!0);if(f){var g;if(!c.collapsed){h.fireEvent("saveScene"),g=c.createBookmark();for(var i,j,l=0,m=domUtils.findParents(f);j=m[l++];)if(domUtils.isTagNode(j,"ol ul")){i=j;break}var n=f;if(g.end)for(;n&&!(domUtils.getPosition(n,g.end)&domUtils.POSITION_FOLLOWING);)if(a(n))n=domUtils.getNextDomNode(n,!1,null,function(a){return a!==i});else{var o=n.parentNode,p=h.document.createElement(o.tagName),q=utils.indexOf(k[p.tagName],b(o)||domUtils.getComputedStyle(o,"list-style-type")),r=q+1==k[p.tagName].length?0:q+1,s=k[p.tagName][r];for(e(p,s),o.insertBefore(p,n);n&&!(domUtils.getPosition(n,g.end)&domUtils.POSITION_FOLLOWING);){if(f=n.nextSibling,p.appendChild(n),!f||domUtils.isTagNode(f,"ol ul")){if(f)for(;(f=f.firstChild)&&"LI"!=f.tagName;);else f=domUtils.getNextDomNode(n,!1,null,function(a){return a!==i});break}n=f}d(p,p.tagName.toLowerCase(),s),n=f}return h.fireEvent("contentchange"),c.moveToBookmark(g).select(),!0}if(a(f))return!0;var o=f.parentNode,p=h.document.createElement(o.tagName),q=utils.indexOf(k[p.tagName],b(o)||domUtils.getComputedStyle(o,"list-style-type"));q=q+1==k[p.tagName].length?0:q+1;var s=k[p.tagName][q];if(e(p,s),domUtils.isStartInblock(c))return h.fireEvent("saveScene"),g=c.createBookmark(),o.insertBefore(p,f),p.appendChild(f),d(p,p.tagName.toLowerCase(),s),h.fireEvent("contentchange"),c.moveToBookmark(g).select(!0),!0}}),h.commands.insertorderedlist=h.commands.insertunorderedlist={execCommand:function(a,c){c||(c="insertorderedlist"==a.toLowerCase()?"decimal":"disc");var f=this,h=this.selection.getRange(),j=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase():!domUtils.isWhitespace(a)},k="insertorderedlist"==a.toLowerCase()?"ol":"ul",l=f.document.createDocumentFragment();h.adjustmentBoundary().shrinkBoundary();var m,n,o,p,q=h.createBookmark(!0),r=g(f.document.getElementById(q.start)),s=0,t=g(f.document.getElementById(q.end)),u=0;if(r||t){if(r&&(m=r.parentNode),q.end||(t=r),t&&(n=t.parentNode),m===n){for(;r!==t;){if(p=r,r=r.nextSibling,!domUtils.isBlockElm(p.firstChild)){for(var v=f.document.createElement("p");p.firstChild;)v.appendChild(p.firstChild);p.appendChild(v)}l.appendChild(p)}if(p=f.document.createElement("span"),m.insertBefore(p,t),!domUtils.isBlockElm(t.firstChild)){for(v=f.document.createElement("p");t.firstChild;)v.appendChild(t.firstChild);t.appendChild(v)}l.appendChild(t),domUtils.breakParent(p,m),domUtils.isEmptyNode(p.previousSibling)&&domUtils.remove(p.previousSibling),domUtils.isEmptyNode(p.nextSibling)&&domUtils.remove(p.nextSibling);var w=b(m)||domUtils.getComputedStyle(m,"list-style-type")||("insertorderedlist"==a.toLowerCase()?"decimal":"disc");if(m.tagName.toLowerCase()==k&&w==c){for(var x,y=0,z=f.document.createDocumentFragment();x=l.firstChild;)if(domUtils.isTagNode(x,"ol ul"))z.appendChild(x);else for(;x.firstChild;)z.appendChild(x.firstChild),domUtils.remove(x);p.parentNode.insertBefore(z,p)}else o=f.document.createElement(k),e(o,c),o.appendChild(l),p.parentNode.insertBefore(o,p);return domUtils.remove(p),o&&d(o,k,c),void h.moveToBookmark(q).select()}if(r){for(;r;){if(p=r.nextSibling,domUtils.isTagNode(r,"ol ul"))l.appendChild(r);else{for(var A=f.document.createDocumentFragment(),B=0;r.firstChild;)domUtils.isBlockElm(r.firstChild)&&(B=1),A.appendChild(r.firstChild);if(B)l.appendChild(A);else{var C=f.document.createElement("p");C.appendChild(A),l.appendChild(C)}domUtils.remove(r)}r=p}m.parentNode.insertBefore(l,m.nextSibling),domUtils.isEmptyNode(m)?(h.setStartBefore(m),domUtils.remove(m)):h.setStartAfter(m),s=1}if(t&&domUtils.inDoc(n,f.document)){for(r=n.firstChild;r&&r!==t;){if(p=r.nextSibling,domUtils.isTagNode(r,"ol ul"))l.appendChild(r);else{for(A=f.document.createDocumentFragment(),B=0;r.firstChild;)domUtils.isBlockElm(r.firstChild)&&(B=1),A.appendChild(r.firstChild);B?l.appendChild(A):(C=f.document.createElement("p"),C.appendChild(A),l.appendChild(C)),domUtils.remove(r)}r=p}var D=domUtils.createElement(f.document,"div",{tmpDiv:1});domUtils.moveChild(t,D),l.appendChild(D),domUtils.remove(t),n.parentNode.insertBefore(l,n),h.setEndBefore(n),domUtils.isEmptyNode(n)&&domUtils.remove(n),u=1}}s||h.setStartBefore(f.document.getElementById(q.start)),q.end&&!u&&h.setEndAfter(f.document.getElementById(q.end)),h.enlarge(!0,function(a){return i[a.tagName]}),l=f.document.createDocumentFragment();for(var E,F=h.createBookmark(),G=domUtils.getNextDomNode(F.start,!1,j),H=h.cloneRange(),I=domUtils.isBlockElm;G&&G!==F.end&&domUtils.getPosition(G,F.end)&domUtils.POSITION_PRECEDING;)if(3==G.nodeType||dtd.li[G.tagName]){if(1==G.nodeType&&dtd.$list[G.tagName]){for(;G.firstChild;)l.appendChild(G.firstChild);E=domUtils.getNextDomNode(G,!1,j),domUtils.remove(G),G=E;continue}for(E=G,H.setStartBefore(G);G&&G!==F.end&&(!I(G)||domUtils.isBookmarkNode(G));)E=G,G=domUtils.getNextDomNode(G,!1,null,function(a){return!i[a.tagName]});G&&I(G)&&(p=domUtils.getNextDomNode(E,!1,j),p&&domUtils.isBookmarkNode(p)&&(G=domUtils.getNextDomNode(p,!1,j),E=p)),H.setEndAfter(E),G=domUtils.getNextDomNode(E,!1,j);var J=h.document.createElement("li");if(J.appendChild(H.extractContents()),domUtils.isEmptyNode(J)){for(var E=h.document.createElement("p");J.firstChild;)E.appendChild(J.firstChild);J.appendChild(E)}l.appendChild(J)}else G=domUtils.getNextDomNode(G,!0,j);h.moveToBookmark(F).collapse(!0),o=f.document.createElement(k),e(o,c),o.appendChild(l),h.insertNode(o),d(o,k,c);for(var x,y=0,K=domUtils.getElementsByTagName(o,"div");x=K[y++];)x.getAttribute("tmpDiv")&&domUtils.remove(x,!0);h.moveToBookmark(q).select()},queryCommandState:function(a){for(var b,c="insertorderedlist"==a.toLowerCase()?"ol":"ul",d=this.selection.getStartElementPath(),e=0;b=d[e++];){if("TABLE"==b.nodeName)return 0;if(c==b.nodeName.toLowerCase())return 1}return 0},queryCommandValue:function(a){for(var c,d,e="insertorderedlist"==a.toLowerCase()?"ol":"ul",f=this.selection.getStartElementPath(),g=0;d=f[g++];){if("TABLE"==d.nodeName){c=null;break}if(e==d.nodeName.toLowerCase()){c=d;break}}return c?b(c)||domUtils.getComputedStyle(c,"list-style-type"):null}}},function(){var a={textarea:function(a,b){var c=b.ownerDocument.createElement("textarea");return c.style.cssText="position:absolute;resize:none;width:100%;height:100%;border:0;padding:0;margin:0;overflow-y:auto;",browser.ie&&browser.version<8&&(c.style.width=b.offsetWidth+"px",c.style.height=b.offsetHeight+"px",b.onresize=function(){c.style.width=b.offsetWidth+"px",c.style.height=b.offsetHeight+"px"}),b.appendChild(c),{setContent:function(a){c.value=a},getContent:function(){return c.value},select:function(){var a;browser.ie?(a=c.createTextRange(),a.collapse(!0),a.select()):(c.setSelectionRange(0,0),c.focus())},dispose:function(){b.removeChild(c),b.onresize=null,c=null,b=null}}},codemirror:function(a,b){var c=window.CodeMirror(b,{mode:"text/html",tabMode:"indent",lineNumbers:!0,lineWrapping:!0}),d=c.getWrapperElement();return d.style.cssText='position:absolute;left:0;top:0;width:100%;height:100%;font-family:consolas,"Courier new",monospace;font-size:13px;',c.getScrollerElement().style.cssText="position:absolute;left:0;top:0;width:100%;height:100%;",c.refresh(),{getCodeMirror:function(){return c},setContent:function(a){c.setValue(a)},getContent:function(){return c.getValue()},select:function(){c.focus()},dispose:function(){b.removeChild(d),d=null,c=null}}}};UE.plugins.source=function(){function b(b){return a["codemirror"==f.sourceEditor&&window.CodeMirror?"codemirror":"textarea"](e,b)}var c,d,e=this,f=this.options,g=!1;f.sourceEditor=browser.ie?"textarea":f.sourceEditor||"codemirror",e.setOpt({sourceEditorFirst:!1});var h,i,j;e.commands.source={execCommand:function(){if(g=!g){j=e.selection.getRange().createAddress(!1,!0),e.undoManger&&e.undoManger.save(!0),browser.gecko&&(e.body.contentEditable=!1),h=e.iframe.style.cssText,e.iframe.style.cssText+="position:absolute;left:-32768px;top:-32768px;",e.fireEvent("beforegetcontent");var a=UE.htmlparser(e.body.innerHTML);e.filterOutputRule(a),a.traversal(function(a){if("element"==a.type)switch(a.tagName){case"td":case"th":case"caption":a.children&&1==a.children.length&&"br"==a.firstChild().tagName&&a.removeChild(a.firstChild());break;case"pre":a.innerText(a.innerText().replace(/ /g," "))}}),e.fireEvent("aftergetcontent");var f=a.toHtml(!0);c=b(e.iframe.parentNode),c.setContent(f),d=e.setContent,e.setContent=function(a){var b=UE.htmlparser(a);e.filterInputRule(b),a=b.toHtml(),c.setContent(a)},setTimeout(function(){c.select(),e.addListener("fullscreenchanged",function(){try{c.getCodeMirror().refresh()}catch(a){}})}),i=e.getContent,e.getContent=function(){return c.getContent()||"

      "+(browser.ie?"":"
      ")+"

      "}}else{e.iframe.style.cssText=h;var k=c.getContent()||"

      "+(browser.ie?"":"
      ")+"

      ";k=k.replace(new RegExp("[\\r\\t\\n ]*]*)>","g"),function(a,b){return b&&!dtd.$inlineWithA[b.toLowerCase()]?a.replace(/(^[\n\r\t ]*)|([\n\r\t ]*$)/g,""):a.replace(/(^[\n\r\t]*)|([\n\r\t]*$)/g,"")}),e.setContent=d,e.setContent(k),c.dispose(),c=null,e.getContent=i;var l=e.body.firstChild;if(l||(e.body.innerHTML="

      "+(browser.ie?"":"
      ")+"

      ",l=e.body.firstChild),e.undoManger&&e.undoManger.save(!0),browser.gecko){var m=document.createElement("input");m.style.cssText="position:absolute;left:0;top:-32768px",document.body.appendChild(m),e.body.contentEditable=!1,setTimeout(function(){domUtils.setViewportOffset(m,{left:-32768,top:0}),m.focus(),setTimeout(function(){e.body.contentEditable=!0,e.selection.getRange().moveToAddress(j).select(!0),domUtils.remove(m)})})}else try{e.selection.getRange().moveToAddress(j).select(!0)}catch(n){}}this.fireEvent("sourcemodechanged",g)},queryCommandState:function(){return 0|g},notNeedUndo:1};var k=e.queryCommandState;e.queryCommandState=function(a){return a=a.toLowerCase(),g?a in{source:1,fullscreen:1}?1:-1:k.apply(this,arguments)},"codemirror"==f.sourceEditor&&e.addListener("ready",function(){utils.loadFile(document,{src:f.codeMirrorJsUrl||f.UEDITOR_HOME_URL+"third-party/codemirror/codemirror.js",tag:"script",type:"text/javascript",defer:"defer"},function(){f.sourceEditorFirst&&setTimeout(function(){e.execCommand("source")},0)}),utils.loadFile(document,{tag:"link",rel:"stylesheet",type:"text/css",href:f.codeMirrorCssUrl||f.UEDITOR_HOME_URL+"third-party/codemirror/codemirror.css"})})}}(),UE.plugins.enterkey=function(){var a,b=this,c=b.options.enterTag;b.addListener("keyup",function(c,d){var e=d.keyCode||d.which;if(13==e){var f,g=b.selection.getRange(),h=g.startContainer;if(browser.ie)b.fireEvent("saveScene",!0,!0);else{if(/h\d/i.test(a)){if(browser.gecko){var i=domUtils.findParentByTagName(h,["h1","h2","h3","h4","h5","h6","blockquote","caption","table"],!0);i||(b.document.execCommand("formatBlock",!1,"

      "),f=1)}else if(1==h.nodeType){var j,k=b.document.createTextNode("");if(g.insertNode(k),j=domUtils.findParentByTagName(k,"div",!0)){for(var l=b.document.createElement("p");j.firstChild;)l.appendChild(j.firstChild);j.parentNode.insertBefore(l,j),domUtils.remove(j),g.setStartBefore(k).setCursor(),f=1}domUtils.remove(k)}b.undoManger&&f&&b.undoManger.save()}browser.opera&&g.select()}}}),b.addListener("keydown",function(d,e){var f=e.keyCode||e.which;if(13==f){if(b.fireEvent("beforeenterkeydown"))return void domUtils.preventDefault(e);b.fireEvent("saveScene",!0,!0),a="";var g=b.selection.getRange();if(!g.collapsed){var h=g.startContainer,i=g.endContainer,j=domUtils.findParentByTagName(h,"td",!0),k=domUtils.findParentByTagName(i,"td",!0);if(j&&k&&j!==k||!j&&k||j&&!k)return void(e.preventDefault?e.preventDefault():e.returnValue=!1)}if("p"==c)browser.ie||(h=domUtils.findParentByTagName(g.startContainer,["ol","ul","p","h1","h2","h3","h4","h5","h6","blockquote","caption"],!0),h||browser.opera?(a=h.tagName,"p"==h.tagName.toLowerCase()&&browser.gecko&&domUtils.removeDirtyAttr(h)):(b.document.execCommand("formatBlock",!1,"

      "),browser.gecko&&(g=b.selection.getRange(),h=domUtils.findParentByTagName(g.startContainer,"p",!0),h&&domUtils.removeDirtyAttr(h))));else if(e.preventDefault?e.preventDefault():e.returnValue=!1,g.collapsed){m=g.document.createElement("br"),g.insertNode(m);var l=m.parentNode;l.lastChild===m?(m.parentNode.insertBefore(m.cloneNode(!0),m),g.setStartBefore(m)):g.setStartAfter(m),g.setCursor()}else if(g.deleteContents(),h=g.startContainer,1==h.nodeType&&(h=h.childNodes[g.startOffset])){for(;1==h.nodeType;){if(dtd.$empty[h.tagName])return g.setStartBefore(h).setCursor(),b.undoManger&&b.undoManger.save(),!1;if(!h.firstChild){var m=g.document.createElement("br");return h.appendChild(m),g.setStart(h,0).setCursor(),b.undoManger&&b.undoManger.save(),!1}h=h.firstChild}h===g.startContainer.childNodes[g.startOffset]?(m=g.document.createElement("br"),g.insertNode(m).setCursor()):g.setStart(h,0).setCursor()}else m=g.document.createElement("br"),g.insertNode(m).setStartAfter(m).setCursor()}})},UE.plugins.keystrokes=function(){var a=this,b=!0;a.addListener("keydown",function(c,d){var e=d.keyCode||d.which,f=a.selection.getRange();if(!f.collapsed&&!(d.ctrlKey||d.shiftKey||d.altKey||d.metaKey)&&(e>=65&&e<=90||e>=48&&e<=57||e>=96&&e<=111||{13:1,8:1,46:1}[e])){var g=f.startContainer;if(domUtils.isFillChar(g)&&f.setStartBefore(g),g=f.endContainer,domUtils.isFillChar(g)&&f.setEndAfter(g),f.txtToElmBoundary(),f.endContainer&&1==f.endContainer.nodeType&&(g=f.endContainer.childNodes[f.endOffset],g&&domUtils.isBr(g)&&f.setEndAfter(g)),0==f.startOffset&&(g=f.startContainer,domUtils.isBoundaryNode(g,"firstChild")&&(g=f.endContainer,f.endOffset==(3==g.nodeType?g.nodeValue.length:g.childNodes.length)&&domUtils.isBoundaryNode(g,"lastChild"))))return a.fireEvent("saveScene"),a.body.innerHTML="

      "+(browser.ie?"":"
      ")+"

      ",f.setStart(a.body.firstChild,0).setCursor(!1,!0),void a._selectionChange()}if(e==keymap.Backspace){if(f=a.selection.getRange(),b=f.collapsed,a.fireEvent("delkeydown",d))return;var h,i;if(f.collapsed&&f.inFillChar()&&(h=f.startContainer,domUtils.isFillChar(h)?(f.setStartBefore(h).shrinkBoundary(!0).collapse(!0),domUtils.remove(h)):(h.nodeValue=h.nodeValue.replace(new RegExp("^"+domUtils.fillChar),""),f.startOffset--,f.collapse(!0).select(!0))),h=f.getClosedNode())return a.fireEvent("saveScene"),f.setStartBefore(h),domUtils.remove(h),f.setCursor(),a.fireEvent("saveScene"),void domUtils.preventDefault(d);if(!browser.ie&&(h=domUtils.findParentByTagName(f.startContainer,"table",!0),i=domUtils.findParentByTagName(f.endContainer,"table",!0),h&&!i||!h&&i||h!==i))return void d.preventDefault()}if(e==keymap.Tab){var j={ol:1,ul:1,table:1};if(a.fireEvent("tabkeydown",d))return void domUtils.preventDefault(d);var k=a.selection.getRange();a.fireEvent("saveScene");for(var l=0,m="",n=a.options.tabSize||4,o=a.options.tabNode||" ";l"});d.insertNode(g).setStart(g,0).setCursor(!1,!0)}}if(!b&&(3==d.startContainer.nodeType||1==d.startContainer.nodeType&&domUtils.isEmptyBlock(d.startContainer)))if(browser.ie){var k=d.document.createElement("span");d.insertNode(k).setStartBefore(k).collapse(!0),d.select(),domUtils.remove(k)}else d.select()}})},UE.plugins.fiximgclick=function(){function a(){this.editor=null,this.resizer=null,this.cover=null,this.doc=document,this.prePos={x:0,y:0},this.startPos={x:0,y:0}}var b=!1;return function(){var c=[[0,0,-1,-1],[0,0,0,-1],[0,0,1,-1],[0,0,-1,0],[0,0,1,0],[0,0,-1,1],[0,0,0,1],[0,0,1,1]];a.prototype={init:function(a){var b=this;b.editor=a,b.startPos=this.prePos={x:0,y:0},b.dragId=-1;var c=[],d=b.cover=document.createElement("div"),e=b.resizer=document.createElement("div");for(d.id=b.editor.ui.id+"_imagescale_cover",d.style.cssText="position:absolute;display:none;z-index:"+b.editor.options.zIndex+";filter:alpha(opacity=0); opacity:0;background:#CCC;",domUtils.on(d,"mousedown click",function(){b.hide()}),i=0;i<8;i++)c.push('');e.id=b.editor.ui.id+"_imagescale",e.className="edui-editor-imagescale",e.innerHTML=c.join(""),e.style.cssText+=";display:none;border:1px solid #3b77ff;z-index:"+b.editor.options.zIndex+";",b.editor.ui.getDom().appendChild(d),b.editor.ui.getDom().appendChild(e),b.initStyle(),b.initEvents()},initStyle:function(){utils.cssRule("imagescale",".edui-editor-imagescale{display:none;position:absolute;border:1px solid #38B2CE;cursor:hand;-webkit-box-sizing: content-box;-moz-box-sizing: content-box;box-sizing: content-box;}.edui-editor-imagescale span{position:absolute;width:6px;height:6px;overflow:hidden;font-size:0px;display:block;background-color:#3C9DD0;}.edui-editor-imagescale .edui-editor-imagescale-hand0{cursor:nw-resize;top:0;margin-top:-4px;left:0;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand1{cursor:n-resize;top:0;margin-top:-4px;left:50%;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand2{cursor:ne-resize;top:0;margin-top:-4px;left:100%;margin-left:-3px;}.edui-editor-imagescale .edui-editor-imagescale-hand3{cursor:w-resize;top:50%;margin-top:-4px;left:0;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand4{cursor:e-resize;top:50%;margin-top:-4px;left:100%;margin-left:-3px;}.edui-editor-imagescale .edui-editor-imagescale-hand5{cursor:sw-resize;top:100%;margin-top:-3px;left:0;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand6{cursor:s-resize;top:100%;margin-top:-3px;left:50%;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand7{cursor:se-resize;top:100%;margin-top:-3px;left:100%;margin-left:-3px;}")},initEvents:function(){var a=this;a.startPos.x=a.startPos.y=0,a.isDraging=!1},_eventHandler:function(a){var c=this;switch(a.type){case"mousedown":var d,d=a.target||a.srcElement;d.className.indexOf("edui-editor-imagescale-hand")!=-1&&c.dragId==-1&&(c.dragId=d.className.slice(-1),c.startPos.x=c.prePos.x=a.clientX,c.startPos.y=c.prePos.y=a.clientY,domUtils.on(c.doc,"mousemove",c.proxy(c._eventHandler,c)));break;case"mousemove":c.dragId!=-1&&(c.updateContainerStyle(c.dragId,{x:a.clientX-c.prePos.x,y:a.clientY-c.prePos.y}),c.prePos.x=a.clientX,c.prePos.y=a.clientY,b=!0,c.updateTargetElement());break;case"mouseup":c.dragId!=-1&&(c.updateContainerStyle(c.dragId,{x:a.clientX-c.prePos.x,y:a.clientY-c.prePos.y}),c.updateTargetElement(),c.target.parentNode&&c.attachTo(c.target),c.dragId=-1),domUtils.un(c.doc,"mousemove",c.proxy(c._eventHandler,c)),b&&(b=!1,c.editor.fireEvent("contentchange"))}},updateTargetElement:function(){var a=this;domUtils.setStyles(a.target,{width:a.resizer.style.width,height:a.resizer.style.height}),a.target.width=parseInt(a.resizer.style.width),a.target.height=parseInt(a.resizer.style.height),a.attachTo(a.target)},updateContainerStyle:function(a,b){var d,e=this,f=e.resizer;0!=c[a][0]&&(d=parseInt(f.style.left)+b.x,f.style.left=e._validScaledProp("left",d)+"px"),0!=c[a][1]&&(d=parseInt(f.style.top)+b.y,f.style.top=e._validScaledProp("top",d)+"px"),0!=c[a][2]&&(d=f.clientWidth+c[a][2]*b.x,f.style.width=e._validScaledProp("width",d)+"px"),0!=c[a][3]&&(d=f.clientHeight+c[a][3]*b.y,f.style.height=e._validScaledProp("height",d)+"px")},_validScaledProp:function(a,b){var c=this.resizer,d=document;switch(b=isNaN(b)?0:b,a){case"left":return b<0?0:b+c.clientWidth>d.clientWidth?d.clientWidth-c.clientWidth:b;case"top":return b<0?0:b+c.clientHeight>d.clientHeight?d.clientHeight-c.clientHeight:b;case"width":return b<=0?1:b+c.offsetLeft>d.clientWidth?d.clientWidth-c.offsetLeft:b;case"height":return b<=0?1:b+c.offsetTop>d.clientHeight?d.clientHeight-c.offsetTop:b}},hideCover:function(){this.cover.style.display="none"},showCover:function(){var a=this,b=domUtils.getXY(a.editor.ui.getDom()),c=domUtils.getXY(a.editor.iframe);domUtils.setStyles(a.cover,{width:a.editor.iframe.offsetWidth+"px",height:a.editor.iframe.offsetHeight+"px",top:c.y-b.y+"px",left:c.x-b.x+"px",position:"absolute",display:""})},show:function(a){var b=this;b.resizer.style.display="block",a&&b.attachTo(a),domUtils.on(this.resizer,"mousedown",b.proxy(b._eventHandler,b)),domUtils.on(b.doc,"mouseup",b.proxy(b._eventHandler,b)),b.showCover(),b.editor.fireEvent("afterscaleshow",b),b.editor.fireEvent("saveScene")},hide:function(){var a=this;a.hideCover(),a.resizer.style.display="none",domUtils.un(a.resizer,"mousedown",a.proxy(a._eventHandler,a)),domUtils.un(a.doc,"mouseup",a.proxy(a._eventHandler,a)),a.editor.fireEvent("afterscalehide",a)},proxy:function(a,b){return function(c){return a.apply(b||this,arguments)}},attachTo:function(a){var b=this,c=b.target=a,d=this.resizer,e=domUtils.getXY(c),f=domUtils.getXY(b.editor.iframe),g=domUtils.getXY(d.parentNode);domUtils.setStyles(d,{width:c.width+"px",height:c.height+"px",left:f.x+e.x-b.editor.document.body.scrollLeft-g.x-parseInt(d.style.borderLeftWidth)+"px",top:f.y+e.y-b.editor.document.body.scrollTop-g.y-parseInt(d.style.borderTopWidth)+"px"})}}}(),function(){var b,c=this;c.setOpt("imageScaleEnabled",!0),!browser.ie&&c.options.imageScaleEnabled&&c.addListener("click",function(d,e){var f=c.selection.getRange(),g=f.getClosedNode();if(g&&"IMG"==g.tagName&&"false"!=c.body.contentEditable){if(g.className.indexOf("edui-faked-music")!=-1||g.getAttribute("anchorname")||domUtils.hasClass(g,"loadingclass")||domUtils.hasClass(g,"loaderrorclass"))return;if(!b){b=new a,b.init(c),c.ui.getDom().appendChild(b.resizer);var h,i=function(a){b.hide(),b.target&&c.selection.getRange().selectNode(b.target).select()},j=function(a){var b=a.target||a.srcElement;!b||void 0!==b.className&&b.className.indexOf("edui-editor-imagescale")!=-1||i(a)};c.addListener("afterscaleshow",function(a){c.addListener("beforekeydown",i),c.addListener("beforemousedown",j),domUtils.on(document,"keydown",i),domUtils.on(document,"mousedown",j),c.selection.getNative().removeAllRanges()}),c.addListener("afterscalehide",function(a){c.removeListener("beforekeydown",i),c.removeListener("beforemousedown",j),domUtils.un(document,"keydown",i),domUtils.un(document,"mousedown",j);var d=b.target;d.parentNode&&c.selection.getRange().selectNode(d).select()}),domUtils.on(b.resizer,"mousedown",function(a){c.selection.getNative().removeAllRanges();var d=a.target||a.srcElement;d&&d.className.indexOf("edui-editor-imagescale-hand")==-1&&(h=setTimeout(function(){b.hide(),b.target&&c.selection.getRange().selectNode(d).select()},200))}),domUtils.on(b.resizer,"mouseup",function(a){var b=a.target||a.srcElement;b&&b.className.indexOf("edui-editor-imagescale-hand")==-1&&clearTimeout(h)})}b.show(g)}else b&&"none"!=b.resizer.style.display&&b.hide()}),browser.webkit&&c.addListener("click",function(a,b){if("IMG"==b.target.tagName&&"false"!=c.body.contentEditable){var d=new dom.Range(c.document);d.selectNode(b.target).select()}})}}(),UE.plugin.register("autolink",function(){var a=0;return browser.ie?{}:{bindEvents:{reset:function(){a=0},keydown:function(a,b){var c=this,d=b.keyCode||b.which;if(32==d||13==d){for(var e,f,g=c.selection.getNative(),h=g.getRangeAt(0).cloneRange(),i=h.startContainer;1==i.nodeType&&h.startOffset>0&&(i=h.startContainer.childNodes[h.startOffset-1]);)h.setStart(i,1==i.nodeType?i.childNodes.length:i.nodeValue.length),h.collapse(!0),i=h.startContainer;do{if(0==h.startOffset){for(i=h.startContainer.previousSibling;i&&1==i.nodeType;)i=i.lastChild;if(!i||domUtils.isFillChar(i))break;e=i.nodeValue.length}else i=h.startContainer,e=h.startOffset;h.setStart(i,e-1),f=h.toString().charCodeAt(0)}while(160!=f&&32!=f);if(h.toString().replace(new RegExp(domUtils.fillChar,"g"),"").match(/(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i)){for(;h.toString().length&&!/^(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i.test(h.toString());)try{h.setStart(h.startContainer,h.startOffset+1)}catch(j){for(var i=h.startContainer;!(next=i.nextSibling);){if(domUtils.isBody(i))return;i=i.parentNode}h.setStart(next,0)}if(domUtils.findParentByTagName(h.startContainer,"a",!0))return;var k,l=c.document.createElement("a"),m=c.document.createTextNode(" ");c.undoManger&&c.undoManger.save(),l.appendChild(h.extractContents()),l.href=l.innerHTML=l.innerHTML.replace(/<[^>]+>/g,""),k=l.getAttribute("href").replace(new RegExp(domUtils.fillChar,"g"),""),k=/^(?:https?:\/\/)/gi.test(k)?k:"http://"+k,l.setAttribute("_src",utils.html(k)),l.href=utils.html(k),h.insertNode(l),l.parentNode.insertBefore(m,l.nextSibling),h.setStart(m,0),h.collapse(!0),g.removeAllRanges(),g.addRange(h),c.undoManger&&c.undoManger.save()}}}}}},function(){function a(a){if(3==a.nodeType)return null;if("A"==a.nodeName)return a;for(var b=a.lastChild;b;){if("A"==b.nodeName)return b;if(3==b.nodeType){if(domUtils.isWhitespace(b)){b=b.previousSibling;continue}return null}b=b.lastChild}}var b={37:1,38:1,39:1,40:1,13:1,32:1};browser.ie&&this.addListener("keyup",function(c,d){var e=this,f=d.keyCode;if(b[f]){var g=e.selection.getRange(),h=g.startContainer;if(13==f){for(;h&&!domUtils.isBody(h)&&!domUtils.isBlockElm(h);)h=h.parentNode;if(h&&!domUtils.isBody(h)&&"P"==h.nodeName){var i=h.previousSibling;if(i&&1==i.nodeType){var i=a(i);i&&!i.getAttribute("_href")&&domUtils.remove(i,!0)}}}else if(32==f)3==h.nodeType&&/^\s$/.test(h.nodeValue)&&(h=h.previousSibling,h&&"A"==h.nodeName&&!h.getAttribute("_href")&&domUtils.remove(h,!0));else if(h=domUtils.findParentByTagName(h,"a",!0),h&&!h.getAttribute("_href")){var j=g.createBookmark();domUtils.remove(h,!0),g.moveToBookmark(j).select(!0)}}})}),UE.plugins.autoheight=function(){function a(){var a=this;clearTimeout(e),f||(!a.queryCommandState||a.queryCommandState&&1!=a.queryCommandState("source"))&&(e=setTimeout(function(){for(var b=a.body.lastChild;b&&1!=b.nodeType;)b=b.previousSibling;b&&1==b.nodeType&&(b.style.clear="both",d=Math.max(domUtils.getXY(b).y+b.offsetHeight+25,Math.max(h.minFrameHeight,h.initialFrameHeight)),d!=g&&(d!==parseInt(a.iframe.parentNode.style.height)&&(a.iframe.parentNode.style.height=d+"px"),a.body.style.height=d+"px",g=d),domUtils.removeStyle(b,"clear"))},50))}var b=this;if(b.autoHeightEnabled=b.options.autoHeightEnabled!==!1,b.autoHeightEnabled){var c,d,e,f,g=0,h=b.options;b.addListener("fullscreenchanged",function(a,b){f=b}),b.addListener("destroy",function(){b.removeListener("contentchange afterinserthtml keyup mouseup",a)}),b.enableAutoHeight=function(){var b=this;if(b.autoHeightEnabled){var d=b.document;b.autoHeightEnabled=!0,c=d.body.style.overflowY,d.body.style.overflowY="hidden",b.addListener("contentchange afterinserthtml keyup mouseup",a),setTimeout(function(){a.call(b)},browser.gecko?100:0),b.fireEvent("autoheightchanged",b.autoHeightEnabled)}},b.disableAutoHeight=function(){b.body.style.overflowY=c||"",b.removeListener("contentchange",a),b.removeListener("keyup",a),b.removeListener("mouseup",a),b.autoHeightEnabled=!1,b.fireEvent("autoheightchanged",b.autoHeightEnabled)},b.on("setHeight",function(){b.disableAutoHeight()}),b.addListener("ready",function(){b.enableAutoHeight();var c;domUtils.on(browser.ie?b.body:b.document,browser.webkit?"dragover":"drop",function(){clearTimeout(c),c=setTimeout(function(){a.call(b)},100)});var d;window.onscroll=function(){ +null===d?d=this.scrollY:0==this.scrollY&&0!=d&&(b.window.scrollTo(0,0),d=null)}})}},UE.plugins.autofloat=function(){function a(){return UE.ui?1:(alert(g.autofloatMsg),0)}function b(){var a=document.body.style;a.backgroundImage='url("about:blank")',a.backgroundAttachment="fixed"}function c(){var a=domUtils.getXY(k),b=domUtils.getComputedStyle(k,"position"),c=domUtils.getComputedStyle(k,"left");k.style.width=k.offsetWidth+"px",k.style.zIndex=1*f.options.zIndex+1,k.parentNode.insertBefore(q,k),o||p&&browser.ie?("absolute"!=k.style.position&&(k.style.position="absolute"),k.style.top=(document.body.scrollTop||document.documentElement.scrollTop)-l+i+"px"):(browser.ie7Compat&&r&&(r=!1,k.style.left=domUtils.getXY(k).x-document.documentElement.getBoundingClientRect().left+2+"px"),"fixed"!=k.style.position&&(k.style.position="fixed",k.style.top=i+"px",("absolute"==b||"relative"==b)&&parseFloat(c)&&(k.style.left=a.x+"px")))}function d(){r=!0,q.parentNode&&q.parentNode.removeChild(q),k.style.cssText=j}function e(){var a=m(f.container),b=f.options.toolbarTopOffset||0;a.top<0&&a.bottom-k.offsetHeight>b?c():d()}var f=this,g=f.getLang();f.setOpt({topOffset:0});var h=f.options.autoFloatEnabled!==!1,i=f.options.topOffset;if(h){var j,k,l,m,n=UE.ui.uiUtils,o=browser.ie&&browser.version<=6,p=browser.quirks,q=document.createElement("div"),r=!0,s=utils.defer(function(){e()},browser.ie?200:100,!0);f.addListener("destroy",function(){domUtils.un(window,["scroll","resize"],e),f.removeListener("keydown",s)}),f.addListener("ready",function(){if(a(f)){if(!f.ui)return;m=n.getClientRect,k=f.ui.getDom("toolbarbox"),l=m(k).top,j=k.style.cssText,q.style.height=k.offsetHeight+"px",o&&b(),domUtils.on(window,["scroll","resize"],e),f.addListener("keydown",s),f.addListener("beforefullscreenchange",function(a,b){b&&d()}),f.addListener("fullscreenchanged",function(a,b){b||e()}),f.addListener("sourcemodechanged",function(a,b){setTimeout(function(){e()},0)}),f.addListener("clearDoc",function(){setTimeout(function(){e()},0)})}})}},UE.plugins.video=function(){function a(a,b,d,e,f,g,h){a=utils.unhtmlForUrl(a),f=utils.unhtml(f),g=utils.unhtml(g),b=parseInt(b,10)||0,d=parseInt(d,10)||0;var i;switch(h){case"image":i="';break;case"embed":i='';break;case"video":var j=a.substr(a.lastIndexOf(".")+1);"ogv"==j&&(j="ogg"),i="'}return i}function b(b,c){utils.each(b.getNodesByTagName(c?"img":"embed video"),function(b){var d=b.getAttr("class");if(d&&d.indexOf("edui-faked-video")!=-1){var e=a(c?b.getAttr("_url"):b.getAttr("src"),b.getAttr("width"),b.getAttr("height"),null,b.getStyle("float")||"",d,c?"embed":"image");b.parentNode.replaceChild(UE.uNode.createElement(e),b)}if(d&&d.indexOf("edui-upload-video")!=-1){var e=a(c?b.getAttr("_url"):b.getAttr("src"),b.getAttr("width"),b.getAttr("height"),null,b.getStyle("float")||"",d,c?"video":"image");b.parentNode.replaceChild(UE.uNode.createElement(e),b)}})}var c=this;c.addOutputRule(function(a){b(a,!0)}),c.addInputRule(function(a){b(a)}),c.commands.insertvideo={execCommand:function(b,d,e){d=utils.isArray(d)?d:[d];for(var f,g,h=[],i="tmpVedio",j=0,k=d.length;j0)return 0;for(var c in dtd.$isNotEmpty)if(dtd.$isNotEmpty.hasOwnProperty(c)&&a.getElementsByTagName(c).length)return 0;return 1},b.getWidth=function(a){return a?parseInt(domUtils.getComputedStyle(a,"width"),10):0},b.getTableCellAlignState=function(a){!utils.isArray(a)&&(a=[a]);var b={},c=["align","valign"],d=null,e=!0;return utils.each(a,function(a){return utils.each(c,function(c){if(d=a.getAttribute(c),!b[c]&&d)b[c]=d;else if(!b[c]||d!==b[c])return e=!1,!1}),e}),e?b:null},b.getTableItemsByRange=function(a){var b=a.selection.getStart();b&&b.id&&0===b.id.indexOf("_baidu_bookmark_start_")&&b.nextSibling&&(b=b.nextSibling);var c=b&&domUtils.findParentByTagName(b,["td","th"],!0),d=c&&c.parentNode,e=b&&domUtils.findParentByTagName(b,"caption",!0),f=e?e.parentNode:d&&d.parentNode.parentNode;return{cell:c,tr:d,table:f,caption:e}},b.getUETableBySelected=function(a){var c=b.getTableItemsByRange(a).table;return c&&c.ueTable&&c.ueTable.selectedTds.length?c.ueTable:null},b.getDefaultValue=function(a,b){var c,d,e,f,g={thin:"0px",medium:"1px",thick:"2px"};if(b)return h=b.getElementsByTagName("td")[0],f=domUtils.getComputedStyle(b,"border-left-width"),c=parseInt(g[f]||f,10),f=domUtils.getComputedStyle(h,"padding-left"),d=parseInt(g[f]||f,10),f=domUtils.getComputedStyle(h,"border-left-width"),e=parseInt(g[f]||f,10),{tableBorder:c,tdPadding:d,tdBorder:e};b=a.document.createElement("table"),b.insertRow(0).insertCell(0).innerHTML="xxx",a.body.appendChild(b);var h=b.getElementsByTagName("td")[0];return f=domUtils.getComputedStyle(b,"border-left-width"),c=parseInt(g[f]||f,10),f=domUtils.getComputedStyle(h,"padding-left"),d=parseInt(g[f]||f,10),f=domUtils.getComputedStyle(h,"border-left-width"),e=parseInt(g[f]||f,10),domUtils.remove(b),{tableBorder:c,tdPadding:d,tdBorder:e}},b.getUETable=function(a){var c=a.tagName.toLowerCase();return a="td"==c||"th"==c||"caption"==c?domUtils.findParentByTagName(a,"table",!0):a,a.ueTable||(a.ueTable=new b(a)),a.ueTable},b.cloneCell=function(a,b,c){if(!a||utils.isString(a))return this.table.ownerDocument.createElement(a||"td");var d=domUtils.hasClass(a,"selectTdClass");d&&domUtils.removeClasses(a,"selectTdClass");var e=a.cloneNode(!0);return b&&(e.rowSpan=e.colSpan=1),!c&&domUtils.removeAttributes(e,"width height"),!c&&domUtils.removeAttributes(e,"style"),e.style.borderLeftStyle="",e.style.borderTopStyle="",e.style.borderLeftColor=a.style.borderRightColor,e.style.borderLeftWidth=a.style.borderRightWidth,e.style.borderTopColor=a.style.borderBottomColor,e.style.borderTopWidth=a.style.borderBottomWidth,d&&domUtils.addClass(a,"selectTdClass"),e},b.prototype={getMaxRows:function(){for(var a,b=this.table.rows,c=1,d=0;a=b[d];d++){for(var e,f=1,g=0;e=a.cells[g++];)f=Math.max(e.rowSpan||1,f);c=Math.max(f+d,c)}return c},getMaxCols:function(){for(var a,b=this.table.rows,c=0,d={},e=0;a=b[e];e++){for(var f,g=0,h=0;f=a.cells[h++];)if(g+=f.colSpan||1,f.rowSpan&&f.rowSpan>1)for(var i=1;ithis.rowsNum-1)?null:(e=c?h?i.endRowIndex+1:g.rowIndex+g.rowSpan:h?i.beginRowIndex-1:g.rowIndex-1,f=h?i.beginColIndex:g.colIndex,this.getCell(this.indexTable[e][f].rowIndex,this.indexTable[e][f].cellIndex))}catch(j){a(j)}},getSameEndPosCells:function(b,c){try{for(var d="x"===c.toLowerCase(),e=domUtils.getXY(b)[d?"x":"y"]+b["offset"+(d?"Width":"Height")],f=this.table.rows,g=null,h=[],i=0;ie&&d)break;if((b==j||e==l)&&(1==j[d?"colSpan":"rowSpan"]&&h.push(j),d))break}}return h}catch(m){a(m)}},setCellContent:function(a,b){a.innerHTML=b||(browser.ie?domUtils.fillChar:"
      ")},cloneCell:b.cloneCell,getSameStartPosXCells:function(b){try{for(var c,d=domUtils.getXY(b).x+b.offsetWidth,e=this.table.rows,f=[],g=0;gd)break;if(j==d&&1==h.colSpan){f.push(h);break}}}return f}catch(k){a(k)}},update:function(a){this.table=a||this.table,this.selectedTds=[],this.cellsRange={},this.indexTable=[];for(var b=this.table.rows,c=this.getMaxRows(),d=c-b.length,e=this.getMaxCols();d--;)this.table.insertRow(b.length);this.rowsNum=c,this.colsNum=e;for(var f=0,g=b.length;fc&&(j.rowSpan=c);for(var m=k,n=j.rowSpan||1,o=j.colSpan||1;this.indexTable[i][m];)m++;for(var p=0;p0)for(h=b;hf&&(m=Math.max(h,m));if(ee&&(l=Math.max(i,l));if(b>0)for(i=a;ig||d+b.colSpan-1>h)return null;j.push(this.getCell(c,b.cellIndex))}}return j},clearSelected:function(){b.removeSelectedClass(this.selectedTds),this.selectedTds=[],this.cellsRange={}},setSelected:function(a){var c=this.getCells(a);b.addSelectedClass(c),this.selectedTds=c,this.cellsRange=a},isFullRow:function(){var a=this.cellsRange;return a.endColIndex-a.beginColIndex+1==this.colsNum},isFullCol:function(){var a=this.cellsRange,b=this.table,c=b.getElementsByTagName("th"),d=a.endRowIndex-a.beginRowIndex+1;return c.length?d==this.rowsNum||d==this.rowsNum-1:d==this.rowsNum},getNextCell:function(b,c,d){try{var e,f,g=this.getCellInfo(b),h=this.selectedTds.length&&!d,i=this.cellsRange;return!c&&0==g.rowIndex||c&&(h?i.endRowIndex==this.rowsNum-1:g.rowIndex+g.rowSpan>this.rowsNum-1)?null:(e=c?h?i.endRowIndex+1:g.rowIndex+g.rowSpan:h?i.beginRowIndex-1:g.rowIndex-1,f=h?i.beginColIndex:g.colIndex,this.getCell(this.indexTable[e][f].rowIndex,this.indexTable[e][f].cellIndex))}catch(j){a(j)}},getPreviewCell:function(b,c){try{var d,e,f=this.getCellInfo(b),g=this.selectedTds.length,h=this.cellsRange;return!c&&(g?!h.beginColIndex:!f.colIndex)||c&&(g?h.endColIndex==this.colsNum-1:f.rowIndex>this.colsNum-1)?null:(d=c?g?h.beginRowIndex:f.rowIndex<1?0:f.rowIndex-1:g?h.beginRowIndex:f.rowIndex,e=c?g?h.endColIndex+1:f.colIndex:g?h.beginColIndex-1:f.colIndex<1?0:f.colIndex-1,this.getCell(this.indexTable[d][e].rowIndex,this.indexTable[d][e].cellIndex))}catch(i){a(i)}},moveContent:function(a,c){if(!b.isEmptyBlock(c)){if(b.isEmptyBlock(a))return void(a.innerHTML=c.innerHTML);var d=a.lastChild;for(3!=d.nodeType&&dtd.$block[d.tagName]||a.appendChild(a.ownerDocument.createElement("br"));d=c.firstChild;)a.appendChild(d)}},mergeRight:function(a){var b=this.getCellInfo(a),c=b.colIndex+b.colSpan,d=this.indexTable[b.rowIndex][c],e=this.getCell(d.rowIndex,d.cellIndex);a.colSpan=b.colSpan+d.colSpan,a.removeAttribute("width"),this.moveContent(a,e),this.deleteCell(e,d.rowIndex),this.update()},mergeDown:function(a){var b=this.getCellInfo(a),c=b.rowIndex+b.rowSpan,d=this.indexTable[c][b.colIndex],e=this.getCell(d.rowIndex,d.cellIndex);a.rowSpan=b.rowSpan+d.rowSpan,a.removeAttribute("height"),this.moveContent(a,e),this.deleteCell(e,d.rowIndex),this.update()},mergeRange:function(){var a=this.cellsRange,b=this.getCell(a.beginRowIndex,this.indexTable[a.beginRowIndex][a.beginColIndex].cellIndex);if("TH"==b.tagName&&a.endRowIndex!==a.beginRowIndex){var c=this.indexTable,d=this.getCellInfo(b);b=this.getCell(1,c[1][d.colIndex].cellIndex),a=this.getCellsRange(b,this.getCell(c[this.rowsNum-1][d.colIndex].rowIndex,c[this.rowsNum-1][d.colIndex].cellIndex))}for(var e,f=this.getCells(a),g=0;e=f[g++];)e!==b&&(this.moveContent(b,e),this.deleteCell(e));if(b.rowSpan=a.endRowIndex-a.beginRowIndex+1,b.rowSpan>1&&b.removeAttribute("height"),b.colSpan=a.endColIndex-a.beginColIndex+1,b.colSpan>1&&b.removeAttribute("width"),b.rowSpan==this.rowsNum&&1!=b.colSpan&&(b.colSpan=1),b.colSpan==this.colsNum&&1!=b.rowSpan){var h=b.parentNode.rowIndex;if(this.table.deleteRow)for(var g=h+1,i=h+1,j=b.rowSpan;g1&&g.rowIndex==a){var i=h.cloneNode(!0);i.rowSpan=h.rowSpan-1,i.innerHTML="",h.rowSpan=1;var j,k=a+1,l=this.table.rows[k],m=this.getPreviewMergedCellsNum(k,f)-e;m1?l.colSpan--:c[h].deleteCell(j.cellIndex),h+=j.rowSpan||1}}this.table.setAttribute("width",d-e),this.update()},splitToCells:function(a){var b=this,c=this.splitToRows(a);utils.each(c,function(a){b.splitToCols(a)})},splitToRows:function(a){var b=this.getCellInfo(a),c=b.rowIndex,d=b.colIndex,e=[];a.rowSpan=1,e.push(a);for(var f=c,g=c+b.rowSpan;f");for(var g=0;g'+(browser.ie&&browser.version<11?domUtils.fillChar:"
      ")+"");c.push("")}return"
      "+c.join("")+"
      "}b||(b=utils.extend({},{numCols:this.options.defaultCols,numRows:this.options.defaultRows,tdvalign:this.options.tdvalign}));var d=this,e=this.selection.getRange(),f=e.startContainer,h=domUtils.findParent(f,function(a){return domUtils.isBlockElm(a)},!0)||d.body,i=g(d),j=h.offsetWidth,k=Math.floor(j/b.numCols-2*i.tdPadding-i.tdBorder);!b.tdvalign&&(b.tdvalign=d.options.tdvalign),d.execCommand("inserthtml",c(b,k))}},UE.commands.insertparagraphbeforetable={queryCommandState:function(){return e(this).cell?0:-1},execCommand:function(){var a=e(this).table;if(a){var b=this.document.createElement("p");b.innerHTML=browser.ie?" ":"
      ",a.parentNode.insertBefore(b,a),this.selection.getRange().setStart(b,0).setCursor()}}},UE.commands.deletetable={queryCommandState:function(){var a=this.selection.getRange();return domUtils.findParentByTagName(a.startContainer,"table",!0)?0:-1},execCommand:function(a,b){var c=this.selection.getRange();if(b=b||domUtils.findParentByTagName(c.startContainer,"table",!0)){var d=b.nextSibling;d||(d=domUtils.createElement(this.document,"p",{innerHTML:browser.ie?domUtils.fillChar:"
      "}),b.parentNode.insertBefore(d,b)),domUtils.remove(b),c=this.selection.getRange(),3==d.nodeType?c.setStartBefore(d):c.setStart(d,0),c.setCursor(!1,!0),this.fireEvent("tablehasdeleted")}}},UE.commands.cellalign={queryCommandState:function(){return c(this).length?0:-1},execCommand:function(a,b){var d=c(this);if(d.length)for(var e,f=0;e=d[f++];)e.setAttribute("align",b)}},UE.commands.cellvalign={queryCommandState:function(){return c(this).length?0:-1},execCommand:function(a,b){var d=c(this);if(d.length)for(var e,f=0;e=d[f++];)e.setAttribute("vAlign",b)}},UE.commands.insertcaption={queryCommandState:function(){var a=e(this).table;return a&&0==a.getElementsByTagName("caption").length?1:-1},execCommand:function(){var a=e(this).table;if(a){var b=this.document.createElement("caption");b.innerHTML=browser.ie?domUtils.fillChar:"
      ",a.insertBefore(b,a.firstChild);var c=this.selection.getRange();c.setStart(b,0).setCursor()}}},UE.commands.deletecaption={queryCommandState:function(){var a=this.selection.getRange(),b=domUtils.findParentByTagName(a.startContainer,"table");return b?0==b.getElementsByTagName("caption").length?-1:1:-1},execCommand:function(){var a=this.selection.getRange(),b=domUtils.findParentByTagName(a.startContainer,"table");if(b){domUtils.remove(b.getElementsByTagName("caption")[0]);var c=this.selection.getRange();c.setStart(b.rows[0].cells[0],0).setCursor()}}},UE.commands.inserttitle={queryCommandState:function(){var a=e(this).table;if(a){var b=a.rows[0];return"th"!=b.cells[b.cells.length-1].tagName.toLowerCase()?0:-1}return-1},execCommand:function(){var a=e(this).table;a&&h(a).insertRow(0,"th");var b=a.getElementsByTagName("th")[0];this.selection.getRange().setStart(b,0).setCursor(!1,!0)}},UE.commands.deletetitle={queryCommandState:function(){var a=e(this).table;if(a){var b=a.rows[0];return"th"==b.cells[b.cells.length-1].tagName.toLowerCase()?0:-1}return-1},execCommand:function(){var a=e(this).table;a&&domUtils.remove(a.rows[0]);var b=a.getElementsByTagName("td")[0];this.selection.getRange().setStart(b,0).setCursor(!1,!0)}},UE.commands.inserttitlecol={queryCommandState:function(){var a=e(this).table;if(a){var b=a.rows[a.rows.length-1];return b.getElementsByTagName("th").length?-1:0}return-1},execCommand:function(b){var c=e(this).table;c&&h(c).insertCol(0,"th"),a(c,this);var d=c.getElementsByTagName("th")[0];this.selection.getRange().setStart(d,0).setCursor(!1,!0)}},UE.commands.deletetitlecol={queryCommandState:function(){var a=e(this).table;if(a){var b=a.rows[a.rows.length-1];return b.getElementsByTagName("th").length?0:-1}return-1},execCommand:function(){var b=e(this).table;if(b)for(var c=0;c=f.colsNum)return-1;var j=f.indexTable[g.rowIndex][i],k=c.rows[j.rowIndex].cells[j.cellIndex];return k&&d.tagName==k.tagName&&j.rowIndex==g.rowIndex&&j.rowSpan==g.rowSpan?0:-1},execCommand:function(a){var b=this.selection.getRange(),c=b.createBookmark(!0),d=e(this).cell,f=h(d);f.mergeRight(d),b.moveToBookmark(c).select()}},UE.commands.mergedown={queryCommandState:function(a){var b=e(this),c=b.table,d=b.cell;if(!c||!d)return-1;var f=h(c);if(f.selectedTds.length)return-1;var g=f.getCellInfo(d),i=g.rowIndex+g.rowSpan;if(i>=f.rowsNum)return-1;var j=f.indexTable[i][g.colIndex],k=c.rows[j.rowIndex].cells[j.cellIndex];return k&&d.tagName==k.tagName&&j.colIndex==g.colIndex&&j.colSpan==g.colSpan?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell,d=h(c);d.mergeDown(c),a.moveToBookmark(b).select()}},UE.commands.mergecells={queryCommandState:function(){return f(this)?0:-1},execCommand:function(){var a=f(this);if(a&&a.selectedTds.length){var b=a.selectedTds[0];a.mergeRange();var c=this.selection.getRange();domUtils.isEmptyBlock(b)?c.setStart(b,0).collapse(!0):c.selectNodeContents(b),c.select()}}},UE.commands.insertrow={queryCommandState:function(){var a=e(this),b=a.cell;return b&&("TD"==b.tagName||"TH"==b.tagName&&a.tr!==a.table.rows[0])&&h(a.table).rowsNum0?-1:b&&(b.colSpan>1||b.rowSpan>1)?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell,d=h(c);d.splitToCells(c),a.moveToBookmark(b).select()}},UE.commands.splittorows={queryCommandState:function(){var a=e(this),b=a.cell;if(!b)return-1;var c=h(a.table);return c.selectedTds.length>0?-1:b&&b.rowSpan>1?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell,d=h(c);d.splitToRows(c),a.moveToBookmark(b).select()}},UE.commands.splittocols={queryCommandState:function(){var a=e(this),b=a.cell;if(!b)return-1;var c=h(a.table);return c.selectedTds.length>0?-1:b&&b.colSpan>1?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell,d=h(c);d.splitToCols(c),a.moveToBookmark(b).select()}},UE.commands.adaptbytext=UE.commands.adaptbywindow={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(b){var c=e(this),d=c.table;if(d)if("adaptbywindow"==b)a(d,this);else{var f=domUtils.getElementsByTagName(d,"td th");utils.each(f,function(a){a.removeAttribute("width")}),d.removeAttribute("width")}}},UE.commands.averagedistributecol={queryCommandState:function(){var a=f(this);return a&&(a.isFullRow()||a.isFullCol())?0:-1},execCommand:function(a){function b(){var a,b=e.table,c=0,f=0,h=g(d,b);if(e.isFullRow())c=b.offsetWidth,f=e.colsNum;else for(var i,j=e.cellsRange.beginColIndex,k=e.cellsRange.endColIndex,l=j;l<=k;)i=e.selectedTds[l],c+=i.offsetWidth,l+=i.colSpan,f+=1;return a=Math.ceil(c/f)-2*h.tdBorder-2*h.tdPadding}function c(a){utils.each(domUtils.getElementsByTagName(e.table,"th"),function(a){a.setAttribute("width","")});var b=e.isFullRow()?domUtils.getElementsByTagName(e.table,"td"):e.selectedTds;utils.each(b,function(b){1==b.colSpan&&b.setAttribute("width",a)})}var d=this,e=f(d);e&&e.selectedTds.length&&c(b())}},UE.commands.averagedistributerow={queryCommandState:function(){var a=f(this);return a?a.selectedTds&&/th/gi.test(a.selectedTds[0].tagName)?-1:a.isFullRow()||a.isFullCol()?0:-1:-1},execCommand:function(a){function b(){var a,b,c=0,f=e.table,h=g(d,f),i=parseInt(domUtils.getComputedStyle(f.getElementsByTagName("td")[0],"padding-top"));if(e.isFullCol()){var j,k,l=domUtils.getElementsByTagName(f,"caption"),m=domUtils.getElementsByTagName(f,"th");l.length>0&&(j=l[0].offsetHeight),m.length>0&&(k=m[0].offsetHeight),c=f.offsetHeight-(j||0)-(k||0),b=0==m.length?e.rowsNum:e.rowsNum-1}else{for(var n=e.cellsRange.beginRowIndex,o=e.cellsRange.endRowIndex,p=0,q=domUtils.getElementsByTagName(f,"tr"),r=n;r<=o;r++)c+=q[r].offsetHeight,p+=1;b=p}return a=browser.ie&&browser.version<9?Math.ceil(c/b):Math.ceil(c/b)-2*h.tdBorder-2*i}function c(a){var b=e.isFullCol()?domUtils.getElementsByTagName(e.table,"td"):e.selectedTds;utils.each(b,function(b){1==b.rowSpan&&b.setAttribute("height",a)})}var d=this,e=f(d);e&&e.selectedTds.length&&c(b())}},UE.commands.cellalignment={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(a,b){var c=this,d=f(c);if(d)utils.each(d.selectedTds,function(a){domUtils.setAttributes(a,b)});else{var e=c.selection.getStart(),g=e&&domUtils.findParentByTagName(e,["td","th","caption"],!0);/caption/gi.test(g.tagName)?(g.style.textAlign=b.align,g.style.verticalAlign=b.vAlign):domUtils.setAttributes(g,b),c.selection.getRange().setCursor(!0)}},queryCommandValue:function(a){var b=e(this).cell;if(b||(b=c(this)[0]),b){var d=UE.UETable.getUETable(b).selectedTds;return!d.length&&(d=b),UE.UETable.getTableCellAlignState(d)}return null}},UE.commands.tablealignment={queryCommandState:function(){return browser.ie&&browser.version<8?-1:e(this).table?0:-1},execCommand:function(a,b){var c=this,d=c.selection.getStart(),e=d&&domUtils.findParentByTagName(d,["table"],!0);e&&e.setAttribute("align",b)}},UE.commands.edittable={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(a,b){var c=this.selection.getRange(),d=domUtils.findParentByTagName(c.startContainer,"table");if(d){var e=domUtils.getElementsByTagName(d,"td").concat(domUtils.getElementsByTagName(d,"th"),domUtils.getElementsByTagName(d,"caption"));utils.each(e,function(a){a.style.borderColor=b})}}},UE.commands.edittd={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(a,b){var c=this,d=f(c);if(d)utils.each(d.selectedTds,function(a){a.style.backgroundColor=b});else{var e=c.selection.getStart(),g=e&&domUtils.findParentByTagName(e,["td","th","caption"],!0);g&&(g.style.backgroundColor=b)}}},UE.commands.settablebackground={queryCommandState:function(){return c(this).length>1?0:-1},execCommand:function(a,b){var d,e;d=c(this),e=h(d[0]),e.setBackground(d,b)}},UE.commands.cleartablebackground={queryCommandState:function(){var a=c(this);if(!a.length)return-1;for(var b,d=0;b=a[d++];)if(""!==b.style.backgroundColor)return 0;return-1},execCommand:function(){var a=c(this),b=h(a[0]);b.removeBackground(a)}},UE.commands.interlacetable=UE.commands.uninterlacetable={queryCommandState:function(a){var b=e(this).table;if(!b)return-1;var c=b.getAttribute("interlaced");return"interlacetable"==a?"enabled"===c?-1:0:c&&"disabled"!==c?0:-1},execCommand:function(a,b){var c=e(this).table;"interlacetable"==a?(c.setAttribute("interlaced","enabled"),this.fireEvent("interlacetable",c,b)):(c.setAttribute("interlaced","disabled"),this.fireEvent("uninterlacetable",c))}},UE.commands.setbordervisible={queryCommandState:function(a){var b=e(this).table;return b?0:-1},execCommand:function(){var a=e(this).table;utils.each(domUtils.getElementsByTagName(a,"td"),function(a){a.style.borderWidth="1px",a.style.borderStyle="solid"})}}}(),UE.plugins.table=function(){function a(a){}function b(a,b){c(a,"width",!0),c(a,"height",!0)}function c(a,b,c){a.style[b]&&(c&&a.setAttribute(b,parseInt(a.style[b],10)),a.style[b]="")}function d(a){if("TD"==a.tagName||"TH"==a.tagName)return a;var b;return(b=domUtils.findParentByTagName(a,"td",!0)||domUtils.findParentByTagName(a,"th",!0))?b:null}function e(a){var b=new RegExp(domUtils.fillChar,"g");if(a[browser.ie?"innerText":"textContent"].replace(/^\s*$/,"").replace(b,"").length>0)return 0;for(var c in dtd.$isNotEmpty)if(a.getElementsByTagName(c).length)return 0;return 1}function f(a){return a.pageX||a.pageY?{x:a.pageX,y:a.pageY}:{x:a.clientX+N.document.body.scrollLeft-N.document.body.clientLeft,y:a.clientY+N.document.body.scrollTop-N.document.body.clientTop}}function g(b){if(!A())try{var c,e=d(b.target||b.srcElement);if(R&&(N.body.style.webkitUserSelect="none",(Math.abs(V.x-b.clientX)>T||Math.abs(V.y-b.clientY)>T)&&(t(),R=!1,U=0,v(b))),ca&&ha)return U=0,N.body.style.webkitUserSelect="none",N.selection.getNative()[browser.ie9below?"empty":"removeAllRanges"](),c=f(b),m(N,!0,ca,c,e),void("h"==ca?ga.style.left=k(ha,b)+"px":"v"==ca&&(ga.style.top=l(ha,b)+"px"));if(e){if(N.fireEvent("excludetable",e)===!0)return;c=f(b);var g=n(e,c),i=domUtils.findParentByTagName(e,"table",!0);if(j(i,e,b,!0)){if(N.fireEvent("excludetable",i)===!0)return;N.body.style.cursor="url("+N.options.cursorpath+"h.png),pointer"}else if(j(i,e,b)){if(N.fireEvent("excludetable",i)===!0)return;N.body.style.cursor="url("+N.options.cursorpath+"v.png),pointer"}else{N.body.style.cursor="text";/\d/.test(g)&&(g=g.replace(/\d/,""),e=Y(e).getPreviewCell(e,"v"==g)),m(N,!!e&&!!g,e?g:"",c,e)}}else h(!1,i,N)}catch(o){a(o)}}function h(a,b,c){if(a)i(b,c);else{if(fa)return;la=setTimeout(function(){!fa&&ea&&ea.parentNode&&ea.parentNode.removeChild(ea)},2e3)}}function i(a,b){function c(c,d){clearTimeout(g),g=setTimeout(function(){b.fireEvent("tableClicked",a,d)},300)}function d(c){clearTimeout(g);var d=Y(a),e=a.rows[0].cells[0],f=d.getLastCell(),h=d.getCellsRange(e,f);b.selection.getRange().setStart(e,0).setCursor(!1,!0),d.setSelected(h)}var e=domUtils.getXY(a),f=a.ownerDocument;if(ea&&ea.parentNode)return ea;ea=f.createElement("div"),ea.contentEditable=!1,ea.innerHTML="",ea.style.cssText="width:15px;height:15px;background-image:url("+b.options.UEDITOR_HOME_URL+"dialogs/table/dragicon.png);position: absolute;cursor:move;top:"+(e.y-15)+"px;left:"+e.x+"px;",domUtils.unSelectable(ea),ea.onmouseover=function(a){fa=!0},ea.onmouseout=function(a){fa=!1},domUtils.on(ea,"click",function(a,b){c(b,this)}),domUtils.on(ea,"dblclick",function(a,b){d(b)}),domUtils.on(ea,"dragstart",function(a,b){domUtils.preventDefault(b)});var g;f.body.appendChild(ea)}function j(a,b,c,d){var e=f(c),g=n(b,e);if(d){var h=a.getElementsByTagName("caption")[0],i=h?h.offsetHeight:0;return"v1"==g&&e.y-domUtils.getXY(a).y-i<8}return"h1"==g&&e.x-domUtils.getXY(a).x<8}function k(a,b){var c=Y(a);if(c){var d=c.getSameEndPosCells(a,"x")[0],e=c.getSameStartPosXCells(a)[0],g=f(b).x,h=(d?domUtils.getXY(d).x:domUtils.getXY(c.table).x)+20,i=e?domUtils.getXY(e).x+e.offsetWidth-20:N.body.offsetWidth+5||parseInt(domUtils.getComputedStyle(N.body,"width"),10);return h+=Q,i-=Q,gi?i:g}}function l(b,c){try{var d=domUtils.getXY(b).y,e=f(c).y;return ek[c]?(a=!1,!1):void l.push(d)});var b=a?l:k;utils.each(i,function(a,c){a.width=b[c]-G()})},0)}}}}function q(a){if(_(domUtils.getElementsByTagName(N.body,"td th")),utils.each(N.document.getElementsByTagName("table"),function(a){a.ueTable=null}),aa=M(N,a)){var b=domUtils.findParentByTagName(aa,"table",!0);ut=Y(b),ut&&ut.clearSelected(),da?r(a):(N.document.body.style.webkitUserSelect="",ia=!0,N.addListener("mouseover",x))}}function r(a){browser.ie&&(a=u(a)),t(),R=!0,O=setTimeout(function(){v(a)},W)}function s(a,b){for(var c=[],d=null,e=0,f=a.length;e0&&U--},W),2===U))return U=0,void p(b);if(2!=b.button){var c=this,d=c.selection.getRange(),e=domUtils.findParentByTagName(d.startContainer,"table",!0),f=domUtils.findParentByTagName(d.endContainer,"table",!0);if((e||f)&&(e===f?(e=domUtils.findParentByTagName(d.startContainer,["td","th","caption"],!0),f=domUtils.findParentByTagName(d.endContainer,["td","th","caption"],!0),e!==f&&c.selection.clearRange()):c.selection.clearRange()),ia=!1,c.document.body.style.webkitUserSelect="",ca&&ha&&(c.selection.getNative()[browser.ie9below?"empty":"removeAllRanges"](),U=0,ga=c.document.getElementById("ue_tableDragLine"))){var g=domUtils.getXY(ha),h=domUtils.getXY(ga);switch(ca){case"h":z(ha,h.x-g.x);break;case"v":B(ha,h.y-g.y-ha.offsetHeight)}return ca="",ha=null,I(c),void c.fireEvent("saveScene")}if(aa){var i=Y(aa),j=i?i.selectedTds[0]:null;if(j)d=new dom.Range(c.document),domUtils.isEmptyBlock(j)?d.setStart(j,0).setCursor(!1,!0):d.selectNodeContents(j).shrinkBoundary().setCursor(!1,!0);else if(d=c.selection.getRange().shrinkBoundary(),!d.collapsed){var e=domUtils.findParentByTagName(d.startContainer,["td","th"],!0),f=domUtils.findParentByTagName(d.endContainer,["td","th"],!0);(e&&!f||!e&&f||e&&f&&e!==f)&&d.setCursor(!1,!0)}aa=null,c.removeListener("mouseover",x)}else{var k=domUtils.findParentByTagName(b.target||b.srcElement,"td",!0);if(k||(k=domUtils.findParentByTagName(b.target||b.srcElement,"th",!0)),k&&("TD"==k.tagName||"TH"==k.tagName)){if(c.fireEvent("excludetable",k)===!0)return;d=new dom.Range(c.document),d.setStart(k,0).setCursor(!1,!0)}}c._selectionChange(250,b)}}}function x(a,b){if(!A()){var c=this,d=b.target||b.srcElement;if(ba=domUtils.findParentByTagName(d,"td",!0)||domUtils.findParentByTagName(d,"th",!0),aa&&ba&&("TD"==aa.tagName&&"TD"==ba.tagName||"TH"==aa.tagName&&"TH"==ba.tagName)&&domUtils.findParentByTagName(aa,"table")==domUtils.findParentByTagName(ba,"table")){var e=Y(ba);if(aa!=ba){c.document.body.style.webkitUserSelect="none",c.selection.getNative()[browser.ie9below?"empty":"removeAllRanges"]();var f=e.getCellsRange(aa,ba);e.setSelected(f)}else c.document.body.style.webkitUserSelect="",e.clearSelected()}b.preventDefault?b.preventDefault():b.returnValue=!1}}function y(a,b,c){var d=parseInt(domUtils.getComputedStyle(a,"line-height"),10),e=c+b;b=ef?(c&&g.push({left:a}),!1):void 0})}),g}function D(a,b,c){if(a-=G(),a<0)return 0;a-=E(b);var d=a<0?"left":"right";return a=Math.abs(a),utils.each(c,function(b){var c=b[d];c&&(a=Math.min(a,E(c)-Q))}),a=a<0?0:a,"left"===d?-a:a}function E(a){var b=0,b=a.offsetWidth-G();a.nextSibling||(b-=F(a)),b=b<0?0:b;try{a.width=b}catch(c){}return b}function F(a){if(tab=domUtils.findParentByTagName(a,"table",!1),void 0===tab.offsetVal){var b=a.previousSibling;b?tab.offsetVal=a.offsetWidth-b.offsetWidth===X.borderWidth?X.borderWidth:0:tab.offsetVal=0}return tab.offsetVal}function G(){if(void 0===X.tabcellSpace){var a=N.document.createElement("table"),b=N.document.createElement("tbody"),c=N.document.createElement("tr"),d=N.document.createElement("td"),e=null;d.style.cssText="border: 0;",d.width=1,c.appendChild(d),c.appendChild(e=d.cloneNode(!1)),b.appendChild(c),a.appendChild(b),a.style.cssText="visibility: hidden;",N.body.appendChild(a),X.paddingSpace=d.offsetWidth-1;var f=a.offsetWidth;d.style.cssText="",e.style.cssText="",X.borderWidth=(a.offsetWidth-f)/3,X.tabcellSpace=X.paddingSpace+X.borderWidth,N.body.removeChild(a)}return G=function(){return X.tabcellSpace},X.tabcellSpace}function H(a,b){ia||(ga=a.document.createElement("div"),domUtils.setAttributes(ga,{id:"ue_tableDragLine",unselectable:"on",contenteditable:!1,onresizestart:"return false",ondragstart:"return false",onselectstart:"return false",style:"background-color:blue;position:absolute;padding:0;margin:0;background-image:none;border:0px none;opacity:0;filter:alpha(opacity=0)"}),a.body.appendChild(ga))}function I(a){if(!ia)for(var b;b=a.document.getElementById("ue_tableDragLine");)domUtils.remove(b)}function J(a,b){if(b){var c,d=domUtils.findParentByTagName(b,"table"),e=d.getElementsByTagName("caption"),f=d.offsetWidth,g=d.offsetHeight-(e.length>0?e[0].offsetHeight:0),h=domUtils.getXY(d),i=domUtils.getXY(b);switch(a){case"h":c="height:"+g+"px;top:"+(h.y+(e.length>0?e[0].offsetHeight:0))+"px;left:"+(i.x+b.offsetWidth),ga.style.cssText=c+"px;position: absolute;display:block;background-color:blue;width:1px;border:0; color:blue;opacity:.3;filter:alpha(opacity=30)";break;case"v":c="width:"+f+"px;left:"+h.x+"px;top:"+(i.y+b.offsetHeight),ga.style.cssText=c+"px;overflow:hidden;position: absolute;display:block;background-color:blue;height:1px;border:0;color:blue;opacity:.2;filter:alpha(opacity=20)"}}}function K(a,b){for(var c,d,e=domUtils.getElementsByTagName(a.body,"table"),f=0;d=e[f++];){var g=domUtils.getElementsByTagName(d,"td");g[0]&&(b?(c=g[0].style.borderColor.replace(/\s/g,""),/(#ffffff)|(rgb\(255,255,255\))/gi.test(c)&&domUtils.addClass(d,"noBorderTable")):domUtils.removeClasses(d,"noBorderTable"))}}function L(a,b,c){var d=a.body;return d.offsetWidth-(b?2*parseInt(domUtils.getComputedStyle(d,"margin-left"),10):0)-2*c.tableBorder-(a.options.offsetWidth||0)}function M(a,b){var c=domUtils.findParentByTagName(b.target||b.srcElement,["td","th"],!0),d=null;if(!c)return null;if(d=n(c,f(b)),!c)return null;if("h1"===d&&c.previousSibling){var e=domUtils.getXY(c),g=c.offsetWidth;Math.abs(e.x+g-b.clientX)>g/3&&(c=c.previousSibling)}else if("v1"===d&&c.parentNode.previousSibling){var e=domUtils.getXY(c),h=c.offsetHeight;Math.abs(e.y+h-b.clientY)>h/3&&(c=c.parentNode.previousSibling.firstChild)}return c&&a.fireEvent("excludetable",c)!==!0?c:null}var N=this,O=null,P=null,Q=5,R=!1,S=5,T=10,U=0,V=null,W=360,X=UE.UETable,Y=function(a){return X.getUETable(a)},Z=function(a){return X.getUETableBySelected(a)},$=function(a,b){return X.getDefaultValue(a,b)},_=function(a){return X.removeSelectedClass(a)};N.ready(function(){var a=this,b=a.selection.getText;a.selection.getText=function(){var c=Z(a);if(c){var d="";return utils.each(c.selectedTds,function(a){d+=a[browser.ie?"innerText":"textContent"]}),d}return b.call(a.selection)}});var aa=null,ba=null,ca="",da=!1,ea=null,fa=!1,ga=null,ha=null,ia=!1,ja=!0;N.setOpt({maxColNum:20,maxRowNum:100,defaultCols:5,defaultRows:5,tdvalign:"top",cursorpath:N.options.UEDITOR_HOME_URL+"themes/default/images/cursor_",tableDragable:!1,classList:["ue-table-interlace-color-single","ue-table-interlace-color-double"]}),N.getUETable=Y;var ka={deletetable:1,inserttable:1,cellvalign:1,insertcaption:1,deletecaption:1,inserttitle:1,deletetitle:1,mergeright:1,mergedown:1,mergecells:1,insertrow:1,insertrownext:1,deleterow:1,insertcol:1,insertcolnext:1,deletecol:1,splittocells:1,splittorows:1,splittocols:1,adaptbytext:1,adaptbywindow:1,adaptbycustomer:1,insertparagraph:1,insertparagraphbeforetable:1,averagedistributecol:1,averagedistributerow:1};N.ready(function(){utils.cssRule("table",".selectTdClass{background-color:#edf5fa !important}table.noBorderTable td,table.noBorderTable th,table.noBorderTable caption{border:1px dashed #ddd !important}table{margin-bottom:10px;border-collapse:collapse;display:table;}td,th{padding: 5px 10px;border: 1px solid #DDD;}caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}th{border-top:1px solid #BBB;background-color:#F7F7F7;}table tr.firstRow th{border-top-width:2px;}.ue-table-interlace-color-single{ background-color: #fcfcfc; } .ue-table-interlace-color-double{ background-color: #f7faff; }td p{margin:0;padding:0;}",N.document);var a,c,f;N.addListener("keydown",function(b,d){var g=this,h=d.keyCode||d.which;if(8==h){var i=Z(g);i&&i.selectedTds.length&&(i.isFullCol()?g.execCommand("deletecol"):i.isFullRow()?g.execCommand("deleterow"):g.fireEvent("delcells"),domUtils.preventDefault(d));var j=domUtils.findParentByTagName(g.selection.getStart(),"caption",!0),k=g.selection.getRange();if(k.collapsed&&j&&e(j)){g.fireEvent("saveScene");var l=j.parentNode;domUtils.remove(j),l&&k.setStart(l.rows[0].cells[0],0).setCursor(!1,!0),g.fireEvent("saveScene")}}if(46==h&&(i=Z(g))){g.fireEvent("saveScene");for(var m,n=0;m=i.selectedTds[n++];)domUtils.fillNode(g.document,m);g.fireEvent("saveScene"),domUtils.preventDefault(d)}if(13==h){var o=g.selection.getRange(),j=domUtils.findParentByTagName(o.startContainer,"caption",!0);if(j){var l=domUtils.findParentByTagName(j,"table");return o.collapsed?j&&o.setStart(l.rows[0].cells[0],0).setCursor(!1,!0):(o.deleteContents(),g.fireEvent("saveScene")),void domUtils.preventDefault(d)}if(o.collapsed){var l=domUtils.findParentByTagName(o.startContainer,"table");if(l){var p=l.rows[0].cells[0],q=domUtils.findParentByTagName(g.selection.getStart(),["td","th"],!0),r=l.previousSibling;if(p===q&&(!r||1==r.nodeType&&"TABLE"==r.tagName)&&domUtils.isStartInblock(o)){var s=domUtils.findParent(g.selection.getStart(),function(a){return domUtils.isBlockElm(a)},!0);s&&(/t(h|d)/i.test(s.tagName)||s===q.firstChild)&&(g.execCommand("insertparagraphbeforetable"),domUtils.preventDefault(d))}}}}if((d.ctrlKey||d.metaKey)&&"67"==d.keyCode){a=null;var i=Z(g);if(i){var t=i.selectedTds;c=i.isFullCol(),f=i.isFullRow(),a=[[i.cloneCell(t[0],null,!0)]];for(var m,n=1;m=t[n];n++)m.parentNode!==t[n-1].parentNode?a.push([i.cloneCell(m,null,!0)]):a[a.length-1].push(i.cloneCell(m,null,!0))}}}),N.addListener("tablehasdeleted",function(){m(this,!1,"",null),ea&&domUtils.remove(ea)}),N.addListener("beforepaste",function(d,g){var h=this,i=h.selection.getRange();if(domUtils.findParentByTagName(i.startContainer,"caption",!0)){var j=h.document.createElement("div");return j.innerHTML=g.html,void(g.html=j[browser.ie9below?"innerText":"textContent"])}var k=Z(h);if(a){h.fireEvent("saveScene");var l,m,i=h.selection.getRange(),n=domUtils.findParentByTagName(i.startContainer,["td","th"],!0);if(n){var o=Y(n);if(f){var p=o.getCellInfo(n).rowIndex;"TH"==n.tagName&&p++;for(var q,r=0;q=a[r++];){for(var s,t=o.insertRow(p++,"td"),u=0;s=q[u];u++){var v=t.cells[u];v||(v=t.insertCell(u)),v.innerHTML=s.innerHTML,s.getAttribute("width")&&v.setAttribute("width",s.getAttribute("width")),s.getAttribute("vAlign")&&v.setAttribute("vAlign",s.getAttribute("vAlign")),s.getAttribute("align")&&v.setAttribute("align",s.getAttribute("align")),s.style.cssText&&(v.style.cssText=s.style.cssText)}for(var s,u=0;(s=t.cells[u])&&q[u];u++)s.innerHTML=q[u].innerHTML,q[u].getAttribute("width")&&s.setAttribute("width",q[u].getAttribute("width")),q[u].getAttribute("vAlign")&&s.setAttribute("vAlign",q[u].getAttribute("vAlign")),q[u].getAttribute("align")&&s.setAttribute("align",q[u].getAttribute("align")),q[u].style.cssText&&(s.style.cssText=q[u].style.cssText)}}else{if(c){y=o.getCellInfo(n);for(var s,w=0,u=0,q=a[0];s=q[u++];)w+=s.colSpan||1;for(h.__hasEnterExecCommand=!0,r=0;r1&&(x.rowSpan=1)}var z=$(h),A=h.body.offsetWidth-(ja?2*parseInt(domUtils.getComputedStyle(h.body,"margin-left"),10):0)-2*z.tableBorder-(h.options.offsetWidth||0);h.execCommand("insertHTML",""+k.innerHTML.replace(/>\s*<").replace(/\bth\b/gi,"td")+"
      ")}return h.fireEvent("contentchange"),h.fireEvent("saveScene"),g.html="",!0}var B,j=h.document.createElement("div");j.innerHTML=g.html,B=j.getElementsByTagName("table"),domUtils.findParentByTagName(h.selection.getStart(),"table")?(utils.each(B,function(a){domUtils.remove(a)}),domUtils.findParentByTagName(h.selection.getStart(),"caption",!0)&&(j.innerHTML=j[browser.ie?"innerText":"textContent"])):utils.each(B,function(a){b(a,!0),domUtils.removeAttributes(a,["style","border"]),utils.each(domUtils.getElementsByTagName(a,"td"),function(a){e(a)&&domUtils.fillNode(h.document,a),b(a,!0)})}),g.html=j.innerHTML}),N.addListener("afterpaste",function(){utils.each(domUtils.getElementsByTagName(N.body,"table"),function(a){if(a.offsetWidth>N.body.offsetWidth){var b=$(N,a);a.style.width=N.body.offsetWidth-(ja?2*parseInt(domUtils.getComputedStyle(N.body,"margin-left"),10):0)-2*b.tableBorder-(N.options.offsetWidth||0)+"px"}})}),N.addListener("blur",function(){a=null});var i;N.addListener("keydown",function(){clearTimeout(i),i=setTimeout(function(){var a=N.selection.getRange(),b=domUtils.findParentByTagName(a.startContainer,["th","td"],!0);if(b){var c=b.parentNode.parentNode.parentNode;c.offsetWidth>c.getAttribute("width")&&(b.style.wordBreak="break-all")}},100)}),N.addListener("selectionchange",function(){m(N,!1,"",null)}),N.addListener("contentchange",function(){var a=this;if(I(a),!Z(a)){var b=a.selection.getRange(),c=b.startContainer;c=domUtils.findParentByTagName(c,["td","th"],!0),utils.each(domUtils.getElementsByTagName(a.document,"table"),function(b){a.fireEvent("excludetable",b)!==!0&&(b.ueTable=new X(b),b.onmouseover=function(){a.fireEvent("tablemouseover",b)},b.onmousemove=function(){a.fireEvent("tablemousemove",b),a.options.tableDragable&&h(!0,this,a),utils.defer(function(){a.fireEvent("contentchange",50)},!0)},b.onmouseout=function(){a.fireEvent("tablemouseout",b),m(a,!1,"",null),I(a)},b.onclick=function(b){b=a.window.event||b;var c=d(b.target||b.srcElement);if(c){var e,f=Y(c),g=f.table,h=f.getCellInfo(c),i=a.selection.getRange();if(j(g,c,b,!0)){var k=f.getCell(f.indexTable[f.rowsNum-1][h.colIndex].rowIndex,f.indexTable[f.rowsNum-1][h.colIndex].cellIndex);return void(b.shiftKey&&f.selectedTds.length?f.selectedTds[0]!==k?(e=f.getCellsRange(f.selectedTds[0],k),f.setSelected(e)):i&&i.selectNodeContents(k).select():c!==k?(e=f.getCellsRange(c,k),f.setSelected(e)):i&&i.selectNodeContents(k).select())}if(j(g,c,b)){var l=f.getCell(f.indexTable[h.rowIndex][f.colsNum-1].rowIndex,f.indexTable[h.rowIndex][f.colsNum-1].cellIndex);b.shiftKey&&f.selectedTds.length?f.selectedTds[0]!==l?(e=f.getCellsRange(f.selectedTds[0],l),f.setSelected(e)):i&&i.selectNodeContents(l).select():c!==l?(e=f.getCellsRange(c,l),f.setSelected(e)):i&&i.selectNodeContents(l).select()}}})}),K(a,!0)}}),domUtils.on(N.document,"mousemove",g),domUtils.on(N.document,"mouseout",function(a){var b=a.target||a.srcElement;"TABLE"==b.tagName&&m(N,!1,"",null)}),N.addListener("interlacetable",function(a,b,c){if(b)for(var d=this,e=b.rows,f=e.length,g=function(a,b,c){return a[b]?a[b]:c?a[b%a.length]:""},h=0;h1?k:f.getCellInfo(d).rowIndex;var g=f.getTabNextCell(d,k);g?e(g)?a.setStart(g,0).setCursor(!1,!0):a.selectNodeContents(g).select():(N.fireEvent("saveScene"),N.__hasEnterExecCommand=!0,this.execCommand("insertrownext"),N.__hasEnterExecCommand=!1,a=this.selection.getRange(),a.setStart(c.rows[c.rows.length-1].cells[0],0).setCursor(),N.fireEvent("saveScene"))}return!0}}),browser.ie&&N.addListener("selectionchange",function(){m(this,!1,"",null)}),N.addListener("keydown",function(a,b){var c=this,d=b.keyCode||b.which;if(8!=d&&46!=d){var e=!(b.ctrlKey||b.metaKey||b.shiftKey||b.altKey);e&&_(domUtils.getElementsByTagName(c.body,"td"));var f=Z(c);f&&e&&f.clearSelected()}}),N.addListener("beforegetcontent",function(){K(this,!1),browser.ie&&utils.each(this.document.getElementsByTagName("caption"),function(a){domUtils.isEmptyNode(a)&&(a.innerHTML=" ")})}),N.addListener("aftergetcontent",function(){K(this,!0)}),N.addListener("getAllHtml",function(){_(N.document.getElementsByTagName("td"))}),N.addListener("fullscreenchanged",function(a,b){if(!b){var c=this.body.offsetWidth/document.body.offsetWidth,d=domUtils.getElementsByTagName(this.body,"table");utils.each(d,function(a){if(a.offsetWidth1||c[e].getAttribute("rowspan")>1)return-1;return b?"enablesort"==a^"sortEnabled"!=b.getAttribute("data-sort")?-1:0:-1},execCommand:function(a){var b=d(this).table;b.setAttribute("data-sort","enablesort"==a?"sortEnabled":"sortDisabled"),"enablesort"==a?domUtils.addClass(b,"sortEnabled"):domUtils.removeClasses(b,"sortEnabled")}}},UE.plugins.contextmenu=function(){var a=this;if(a.setOpt("enableContextMenu",!0),a.getOpt("enableContextMenu")!==!1){var b,c=a.getLang("contextMenu"),d=a.options.contextMenu||[{label:c.selectall,cmdName:"selectall"},{label:c.cleardoc,cmdName:"cleardoc",exec:function(){confirm(c.confirmclear)&&this.execCommand("cleardoc")}},"-",{label:c.unlink,cmdName:"unlink"},"-",{group:c.paragraph,icon:"justifyjustify",subMenu:[{label:c.justifyleft,cmdName:"justify",value:"left"},{label:c.justifyright,cmdName:"justify",value:"right"},{label:c.justifycenter,cmdName:"justify",value:"center"},{label:c.justifyjustify,cmdName:"justify",value:"justify"}]},"-",{group:c.table,icon:"table",subMenu:[{label:c.inserttable,cmdName:"inserttable"},{label:c.deletetable,cmdName:"deletetable"},"-",{label:c.deleterow,cmdName:"deleterow"},{label:c.deletecol,cmdName:"deletecol"},{label:c.insertcol,cmdName:"insertcol"},{label:c.insertcolnext,cmdName:"insertcolnext"},{label:c.insertrow,cmdName:"insertrow"},{label:c.insertrownext,cmdName:"insertrownext"},"-",{label:c.insertcaption,cmdName:"insertcaption"},{label:c.deletecaption,cmdName:"deletecaption"},{label:c.inserttitle,cmdName:"inserttitle"},{label:c.deletetitle,cmdName:"deletetitle"},{label:c.inserttitlecol,cmdName:"inserttitlecol"},{label:c.deletetitlecol,cmdName:"deletetitlecol"},"-",{label:c.mergecells,cmdName:"mergecells"},{label:c.mergeright,cmdName:"mergeright"},{label:c.mergedown,cmdName:"mergedown"},"-",{label:c.splittorows,cmdName:"splittorows"},{label:c.splittocols,cmdName:"splittocols"},{label:c.splittocells,cmdName:"splittocells"},"-",{label:c.averageDiseRow,cmdName:"averagedistributerow"},{label:c.averageDisCol,cmdName:"averagedistributecol"},"-",{label:c.edittd,cmdName:"edittd",exec:function(){UE.ui.edittd&&new UE.ui.edittd(this),this.getDialog("edittd").open()}},{label:c.edittable,cmdName:"edittable",exec:function(){UE.ui.edittable&&new UE.ui.edittable(this),this.getDialog("edittable").open()}},{label:c.setbordervisible,cmdName:"setbordervisible"}]},{group:c.tablesort,icon:"tablesort",subMenu:[{label:c.enablesort,cmdName:"enablesort"},{label:c.disablesort,cmdName:"disablesort"},"-",{label:c.reversecurrent,cmdName:"sorttable",value:"reversecurrent"},{label:c.orderbyasc,cmdName:"sorttable",value:"orderbyasc"},{label:c.reversebyasc,cmdName:"sorttable",value:"reversebyasc"},{label:c.orderbynum,cmdName:"sorttable",value:"orderbynum"},{label:c.reversebynum,cmdName:"sorttable",value:"reversebynum"}]},{group:c.borderbk,icon:"borderBack",subMenu:[{label:c.setcolor,cmdName:"interlacetable",exec:function(){this.execCommand("interlacetable")}},{label:c.unsetcolor,cmdName:"uninterlacetable",exec:function(){this.execCommand("uninterlacetable")}},{label:c.setbackground,cmdName:"settablebackground",exec:function(){this.execCommand("settablebackground",{repeat:!0,colorList:["#bbb","#ccc"]})}},{label:c.unsetbackground,cmdName:"cleartablebackground",exec:function(){this.execCommand("cleartablebackground")}},{label:c.redandblue,cmdName:"settablebackground",exec:function(){this.execCommand("settablebackground",{repeat:!0,colorList:["red","blue"]})}},{label:c.threecolorgradient,cmdName:"settablebackground",exec:function(){this.execCommand("settablebackground",{repeat:!0,colorList:["#aaa","#bbb","#ccc"]})}}]},{group:c.aligntd,icon:"aligntd",subMenu:[{cmdName:"cellalignment",value:{align:"left",vAlign:"top"}},{cmdName:"cellalignment",value:{align:"center",vAlign:"top"}},{cmdName:"cellalignment",value:{align:"right",vAlign:"top"}},{cmdName:"cellalignment",value:{align:"left",vAlign:"middle"}},{cmdName:"cellalignment",value:{align:"center",vAlign:"middle"}},{cmdName:"cellalignment",value:{align:"right",vAlign:"middle"}},{cmdName:"cellalignment",value:{align:"left",vAlign:"bottom"}},{cmdName:"cellalignment",value:{align:"center",vAlign:"bottom"}},{cmdName:"cellalignment",value:{align:"right",vAlign:"bottom"}}]},{group:c.aligntable,icon:"aligntable",subMenu:[{cmdName:"tablealignment",className:"left",label:c.tableleft,value:"left"},{cmdName:"tablealignment",className:"center",label:c.tablecenter,value:"center"},{cmdName:"tablealignment",className:"right",label:c.tableright,value:"right"}]},"-",{label:c.insertparagraphbefore,cmdName:"insertparagraph",value:!0},{label:c.insertparagraphafter,cmdName:"insertparagraph"},{label:c.copy,cmdName:"copy"},{label:c.paste,cmdName:"paste"}];if(d.length){var e=UE.ui.uiUtils;a.addListener("contextmenu",function(f,g){var h=e.getViewportOffsetByEvent(g);a.fireEvent("beforeselectionchange"),b&&b.destroy();for(var i,j=0,k=[];i=d[j];j++){var l;!function(b){function d(){switch(b.icon){case"table":return a.getLang("contextMenu.table");case"justifyjustify":return a.getLang("contextMenu.paragraph");case"aligntd":return a.getLang("contextMenu.aligntd");case"aligntable":return a.getLang("contextMenu.aligntable");case"tablesort":return c.tablesort;case"borderBack":return c.borderbk;default:return""}}if("-"==b)(l=k[k.length-1])&&"-"!==l&&k.push("-");else if(b.hasOwnProperty("group")){for(var e,f=0,g=[];e=b.subMenu[f];f++)!function(b){"-"==b?(l=g[g.length-1])&&"-"!==l?g.push("-"):g.splice(g.length-1):(a.commands[b.cmdName]||UE.commands[b.cmdName]||b.query)&&(b.query?b.query():a.queryCommandState(b.cmdName))>-1&&g.push({label:b.label||a.getLang("contextMenu."+b.cmdName+(b.value||""))||"",className:"edui-for-"+b.cmdName+(b.className?" edui-for-"+b.cmdName+"-"+b.className:""),onclick:b.exec?function(){b.exec.call(a)}:function(){a.execCommand(b.cmdName,b.value)}})}(e);g.length&&k.push({label:d(),className:"edui-for-"+b.icon,subMenu:{items:g,editor:a}})}else(a.commands[b.cmdName]||UE.commands[b.cmdName]||b.query)&&(b.query?b.query.call(a):a.queryCommandState(b.cmdName))>-1&&k.push({label:b.label||a.getLang("contextMenu."+b.cmdName),className:"edui-for-"+(b.icon?b.icon:b.cmdName+(b.value||"")),onclick:b.exec?function(){b.exec.call(a)}:function(){a.execCommand(b.cmdName,b.value)}})}(i)}if("-"==k[k.length-1]&&k.pop(),b=new UE.ui.Menu({items:k,className:"edui-contextmenu",editor:a}),b.render(),b.showAt(h),a.fireEvent("aftershowcontextmenu",b),domUtils.preventDefault(g),browser.ie){var m;try{m=a.selection.getNative().createRange()}catch(n){return}if(m.item){var o=new dom.Range(a.document);o.selectNode(m.item(0)).select(!0,!0)}}}),a.addListener("aftershowcontextmenu",function(b,c){if(a.zeroclipboard){var d=c.items;for(var e in d)"edui-for-copy"==d[e].className&&a.zeroclipboard.clip(d[e].getDom())}})}}},UE.plugins.shortcutmenu=function(){var a,b=this,c=b.options.shortcutMenu||[];c.length&&(b.addListener("contextmenu mouseup",function(b,d){var e=this,f={type:b,target:d.target||d.srcElement,screenX:d.screenX,screenY:d.screenY,clientX:d.clientX,clientY:d.clientY};if(setTimeout(function(){var d=e.selection.getRange();d.collapsed!==!1&&"contextmenu"!=b||(a||(a=new baidu.editor.ui.ShortCutMenu({editor:e,items:c,theme:e.options.theme,className:"edui-shortcutmenu"}),a.render(),e.fireEvent("afterrendershortcutmenu",a)),a.show(f,!!UE.plugins.contextmenu))}),"contextmenu"==b&&(domUtils.preventDefault(d),browser.ie9below)){var g;try{g=e.selection.getNative().createRange()}catch(d){return}if(g.item){var h=new dom.Range(e.document);h.selectNode(g.item(0)).select(!0,!0)}}}),b.addListener("keydown",function(b){"keydown"==b&&a&&!a.isHidden&&a.hide()}))},UE.plugins.basestyle=function(){var a={bold:["strong","b"],italic:["em","i"],subscript:["sub"],superscript:["sup"]},b=function(a,b){return domUtils.filterNodeList(a.selection.getStartElementPath(),b)},c=this;c.addshortcutkey({Bold:"ctrl+66",Italic:"ctrl+73",Underline:"ctrl+85"}),c.addInputRule(function(a){utils.each(a.getNodesByTagName("b i"),function(a){switch(a.tagName){case"b":a.tagName="strong";break;case"i":a.tagName="em"}})});for(var d in a)!function(a,d){c.commands[a]={execCommand:function(a){var e=c.selection.getRange(),f=b(this,d);if(e.collapsed){if(f){var g=c.document.createTextNode("");e.insertNode(g).removeInlineStyle(d),e.setStartBefore(g),domUtils.remove(g)}else{var h=e.document.createElement(d[0]);"superscript"!=a&&"subscript"!=a||(g=c.document.createTextNode(""),e.insertNode(g).removeInlineStyle(["sub","sup"]).setStartBefore(g).collapse(!0)),e.insertNode(h).setStart(h,0)}e.collapse(!0)}else"superscript"!=a&&"subscript"!=a||f&&f.tagName.toLowerCase()==a||e.removeInlineStyle(["sub","sup"]),f?e.removeInlineStyle(d):e.applyInlineStyle(d[0]);e.select()},queryCommandState:function(){return b(this,d)?1:0}}}(d,a[d])},UE.plugins.elementpath=function(){var a,b,c=this;c.setOpt("elementPathEnabled",!0),c.options.elementPathEnabled&&(c.commands.elementpath={execCommand:function(d,e){var f=b[e],g=c.selection.getRange();a=1*e,g.selectNode(f).select()},queryCommandValue:function(){var c=[].concat(this.selection.getStartElementPath()).reverse(),d=[];b=c;for(var e,f=0;e=c[f];f++)if(3!=e.nodeType){var g=e.tagName.toLowerCase();if("img"==g&&e.getAttribute("anchorname")&&(g="anchor"),d[f]=g,a==f){a=-1;break}}return d}})},UE.plugins.formatmatch=function(){function a(f,g){function h(a){return m&&a.selectNode(m),a.applyInlineStyle(d[d.length-1].tagName,null,d)}if(browser.webkit)var i="IMG"==g.target.tagName?g.target:null;c.undoManger&&c.undoManger.save();var j=c.selection.getRange(),k=i||j.getClosedNode();if(b&&k&&"IMG"==k.tagName)k.style.cssText+=";float:"+(b.style.cssFloat||b.style.styleFloat||"none")+";display:"+(b.style.display||"inline"),b=null;else if(!b){var l=j.collapsed;if(l){var m=c.document.createTextNode("match");j.insertNode(m).select()}c.__hasEnterExecCommand=!0;var n=c.options.removeFormatAttributes;c.options.removeFormatAttributes="",c.execCommand("removeformat"),c.options.removeFormatAttributes=n,c.__hasEnterExecCommand=!1,j=c.selection.getRange(),d.length&&h(j),m&&j.setStartBefore(m).collapse(!0),j.select(),m&&domUtils.remove(m)}c.undoManger&&c.undoManger.save(),c.removeListener("mouseup",a),e=0}var b,c=this,d=[],e=0;c.addListener("reset",function(){d=[],e=0}),c.commands.formatmatch={execCommand:function(f){if(e)return e=0,d=[],void c.removeListener("mouseup",a);var g=c.selection.getRange();if(b=g.getClosedNode(),!b||"IMG"!=b.tagName){g.collapse(!0).shrinkBoundary();var h=g.startContainer;d=domUtils.findParents(h,!0,function(a){return!domUtils.isBlockElm(a)&&1==a.nodeType});for(var i,j=0;i=d[j];j++)if("A"==i.tagName){d.splice(j,1);break}}c.addListener("mouseup",a),e=1},queryCommandState:function(){return e},notNeedUndo:1}},UE.plugin.register("searchreplace",function(){function a(a,b,c){var d=b.searchStr;b.dir==-1&&(a=a.split("").reverse().join(""),d=d.split("").reverse().join(""),c=a.length-c);for(var e,f=new RegExp(d,"g"+(b.casesensitive?"":"i"));e=f.exec(a);)if(e.index>=c)return b.dir==-1?a.length-e.index-b.searchStr.length:e.index;return-1}function b(b,c,d){var e,f,h=d.all||1==d.dir?"getNextDomNode":"getPreDomNode";domUtils.isBody(b)&&(b=b.firstChild);for(var i=1;b;){if(e=3==b.nodeType?b.nodeValue:b[browser.ie?"innerText":"textContent"],f=a(e,d,c),i=0,f!=-1)return{node:b,index:f};for(b=domUtils[h](b);b&&g[b.nodeName.toLowerCase()];)b=domUtils[h](b,!0);b&&(c=d.dir==-1?(3==b.nodeType?b.nodeValue:b[browser.ie?"innerText":"textContent"]).length:0)}}function c(a,b,d){for(var e,f=0,g=a.firstChild,h=0;g;){if(3==g.nodeType){if(h=g.nodeValue.replace(/(^[\t\r\n]+)|([\t\r\n]+$)/,"").length,f+=h,f>=b)return{node:g,index:h-(f-b)}}else if(!dtd.$empty[g.tagName]&&(h=g[browser.ie?"innerText":"textContent"].replace(/(^[\t\r\n]+)|([\t\r\n]+$)/,"").length,f+=h,f>=b&&(e=c(g,h-(f-b),d))))return e;g=domUtils.getNextDomNode(g)}}function d(a,d){var f,g=a.selection.getRange(),h=d.searchStr,i=a.document.createElement("span");if(i.innerHTML="$$ueditor_searchreplace_key$$",g.shrinkBoundary(!0),!g.collapsed){g.select();var j=a.selection.getText();if(new RegExp("^"+d.searchStr+"$",d.casesensitive?"":"i").test(j)){if(void 0!=d.replaceStr)return e(g,d.replaceStr),g.select(),!0;g.collapse(d.dir==-1)}}g.insertNode(i),g.enlargeToBlockElm(!0),f=g.startContainer;var k=f[browser.ie?"innerText":"textContent"].indexOf("$$ueditor_searchreplace_key$$");g.setStartBefore(i),domUtils.remove(i);var l=b(f,k,d);if(l){var m=c(l.node,l.index,h),n=c(l.node,l.index+h.length,h);return g.setStart(m.node,m.index).setEnd(n.node,n.index),void 0!==d.replaceStr&&e(g,d.replaceStr),g.select(),!0}g.setCursor()}function e(a,b){b=f.document.createTextNode(b),a.deleteContents().insertNode(b)}var f=this,g={table:1,tbody:1,tr:1,ol:1,ul:1};return{commands:{searchreplace:{execCommand:function(a,b){utils.extend(b,{all:!1,casesensitive:!1,dir:1},!0);var c=0;if(b.all){var e=f.selection.getRange(),g=f.body.firstChild;for(g&&1==g.nodeType?(e.setStart(g,0),e.shrinkBoundary(!0)):3==g.nodeType&&e.setStartBefore(g),e.collapse(!0).select(!0),void 0!==b.replaceStr&&f.fireEvent("saveScene");d(this,b);)c++;c&&f.fireEvent("saveScene")}else void 0!==b.replaceStr&&f.fireEvent("saveScene"),d(this,b)&&c++,c&&f.fireEvent("saveScene");return c},notNeedUndo:1}}}}),UE.plugins.customstyle=function(){var a=this;a.setOpt({customstyle:[{tag:"h1",name:"tc",style:"font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;"},{tag:"h1",name:"tl",style:"font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:left;margin:0 0 10px 0;"},{tag:"span",name:"im",style:"font-size:16px;font-style:italic;font-weight:bold;line-height:18px;"},{tag:"span",name:"hi",style:"font-size:16px;font-style:italic;font-weight:bold;color:rgb(51, 153, 204);line-height:18px;"}]}),a.commands.customstyle={execCommand:function(a,b){var c,d,e=this,f=b.tag,g=domUtils.findParent(e.selection.getStart(),function(a){return a.getAttribute("label")},!0),h={};for(var i in b)void 0!==b[i]&&(h[i]=b[i]);if(delete h.tag,g&&g.getAttribute("label")==b.label){if(c=this.selection.getRange(),d=c.createBookmark(),c.collapsed)if(dtd.$block[g.tagName]){var j=e.document.createElement("p");domUtils.moveChild(g,j),g.parentNode.insertBefore(j,g),domUtils.remove(g)}else domUtils.remove(g,!0);else{var k=domUtils.getCommonAncestor(d.start,d.end),l=domUtils.getElementsByTagName(k,f);new RegExp(f,"i").test(k.tagName)&&l.push(k);for(var m,n=0;m=l[n++];)if(m.getAttribute("label")==b.label){var o=domUtils.getPosition(m,d.start),p=domUtils.getPosition(m,d.end);if((o&domUtils.POSITION_FOLLOWING||o&domUtils.POSITION_CONTAINS)&&(p&domUtils.POSITION_PRECEDING||p&domUtils.POSITION_CONTAINS)&&dtd.$block[f]){var j=e.document.createElement("p");domUtils.moveChild(m,j),m.parentNode.insertBefore(j,m)}domUtils.remove(m,!0)}g=domUtils.findParent(k,function(a){return a.getAttribute("label")==b.label},!0),g&&domUtils.remove(g,!0)}c.moveToBookmark(d).select()}else if(dtd.$block[f]){if(this.execCommand("paragraph",f,h,"customstyle"),c=e.selection.getRange(),!c.collapsed){c.collapse(),g=domUtils.findParent(e.selection.getStart(),function(a){return a.getAttribute("label")==b.label},!0);var q=e.document.createElement("p");domUtils.insertAfter(g,q),domUtils.fillNode(e.document,q),c.setStart(q,0).setCursor()}}else{if(c=e.selection.getRange(),c.collapsed)return g=e.document.createElement(f),domUtils.setAttributes(g,h),void c.insertNode(g).setStart(g,0).setCursor();d=c.createBookmark(),c.applyInlineStyle(f,h).moveToBookmark(d).select()}},queryCommandValue:function(){var a=domUtils.filterNodeList(this.selection.getStartElementPath(),function(a){return a.getAttribute("label")});return a?a.getAttribute("label"):""}},a.addListener("keyup",function(b,c){var d=c.keyCode||c.which;if(32==d||13==d){var e=a.selection.getRange();if(e.collapsed){var f=domUtils.findParent(a.selection.getStart(),function(a){return a.getAttribute("label")},!0);if(f&&dtd.$block[f.tagName]&&domUtils.isEmptyNode(f)){var g=a.document.createElement("p");domUtils.insertAfter(f,g),domUtils.fillNode(a.document,g),domUtils.remove(f),e.setStart(g,0).setCursor()}}}})},UE.plugins.catchremoteimage=function(){var me=this,ajax=UE.ajax;me.options.catchRemoteImageEnable!==!1&&(me.setOpt({catchRemoteImageEnable:!1}),me.addListener("afterpaste",function(){me.fireEvent("catchRemoteImage")}),me.addListener("catchRemoteImage",function(){function catchremoteimage(a,b){var c=utils.serializeParam(me.queryCommandValue("serverparam"))||"",d=utils.formatUrl(catcherActionUrl+(catcherActionUrl.indexOf("?")==-1?"?":"&")+c),e=utils.isCrossDomainUrl(d),f={method:"POST",dataType:e?"jsonp":"",timeout:6e4,onsuccess:b.success,onerror:b.error};f[catcherFieldName]=a,ajax.request(d,f)}for(var catcherLocalDomain=me.getOpt("catcherLocalDomain"),catcherActionUrl=me.getActionUrl(me.getOpt("catcherActionName")),catcherUrlPrefix=me.getOpt("catcherUrlPrefix"),catcherFieldName=me.getOpt("catcherFieldName"),remoteImages=[],imgs=domUtils.getElementsByTagName(me.document,"img"),test=function(a,b){if(a.indexOf(location.host)!=-1||/(^\.)|(^\/)/.test(a))return!0;if(b)for(var c,d=0;c=b[d++];)if(a.indexOf(c)!==-1)return!0;return!1},i=0,ci;ci=imgs[i++];)if(!ci.getAttribute("word_img")){var src=ci.getAttribute("_src")||ci.src||"";/^(https?|ftp):/i.test(src)&&!test(src,catcherLocalDomain)&&remoteImages.push(src)}remoteImages.length&&catchremoteimage(remoteImages,{success:function(r){try{var info=void 0!==r.state?r:eval("("+r.responseText+")")}catch(e){return}var i,j,ci,cj,oldSrc,newSrc,list=info.list;for(i=0;ci=imgs[i++];)for(oldSrc=ci.getAttribute("_src")||ci.src||"",j=0;cj=list[j++];)if(oldSrc==cj.source&&"SUCCESS"==cj.state){newSrc=catcherUrlPrefix+cj.url,domUtils.setAttributes(ci,{src:newSrc,_src:newSrc});break}me.fireEvent("catchremotesuccess")},error:function(){me.fireEvent("catchremoteerror")}})}))},UE.plugin.register("snapscreen",function(){function getLocation(a){var b,c=document.createElement("a"),d=utils.serializeParam(me.queryCommandValue("serverparam"))||"";return c.href=a,browser.ie&&(c.href=c.href),b=c.search,d&&(b=b+(b.indexOf("?")==-1?"?":"&")+d,b=b.replace(/[&]+/gi,"&")),{port:c.port,hostname:c.hostname,path:c.pathname+b||+c.hash}}var me=this,snapplugin;return{commands:{snapscreen:{execCommand:function(cmd){function onSuccess(rs){try{if(rs=eval("("+rs+")"),"SUCCESS"==rs.state){var opt=me.options;me.execCommand("insertimage",{src:opt.snapscreenUrlPrefix+rs.url,_src:opt.snapscreenUrlPrefix+rs.url,alt:rs.title||"",floatStyle:opt.snapscreenImgAlign})}else alert(rs.state)}catch(e){alert(lang.callBackErrorMsg)}}var url,local,res,lang=me.getLang("snapScreen_plugin");if(!snapplugin){var container=me.container,doc=me.container.ownerDocument||me.container.document;snapplugin=doc.createElement("object");try{snapplugin.type="application/x-pluginbaidusnap"}catch(e){return}snapplugin.style.cssText="position:absolute;left:-9999px;width:0;height:0;",snapplugin.setAttribute("width","0"),snapplugin.setAttribute("height","0"),container.appendChild(snapplugin)}url=me.getActionUrl(me.getOpt("snapscreenActionName")),local=getLocation(url),setTimeout(function(){try{res=snapplugin.saveSnapshot(local.hostname,local.path,local.port)}catch(a){return void me.ui._dialogs.snapscreenDialog.open()}onSuccess(res)},50)},queryCommandState:function(){return navigator.userAgent.indexOf("Windows",0)!=-1?0:-1}}}}}),UE.commands.insertparagraph={execCommand:function(a,b){for(var c,d=this,e=d.selection.getRange(),f=e.startContainer;f&&!domUtils.isBody(f);)c=f,f=f.parentNode;if(c){var g=d.document.createElement("p");b?c.parentNode.insertBefore(g,c):c.parentNode.insertBefore(g,c.nextSibling),domUtils.fillNode(d.document,g),e.setStart(g,0).setCursor(!1,!0)}}},UE.plugin.register("webapp",function(){function a(a,c){return c?'':'"}var b=this;return{outputRule:function(b){utils.each(b.getNodesByTagName("img"),function(b){var c;if("edui-faked-webapp"==b.getAttr("class")){c=a({title:b.getAttr("title"),width:b.getAttr("width"),height:b.getAttr("height"),align:b.getAttr("align"),cssfloat:b.getStyle("float"),url:b.getAttr("_url"),logo:b.getAttr("_logo_url")},!0);var d=UE.uNode.createElement(c);b.parentNode.replaceChild(d,b)}})},inputRule:function(b){utils.each(b.getNodesByTagName("iframe"),function(b){if("edui-faked-webapp"==b.getAttr("class")){var c=UE.uNode.createElement(a({title:b.getAttr("title"),width:b.getAttr("width"),height:b.getAttr("height"),align:b.getAttr("align"),cssfloat:b.getStyle("float"),url:b.getAttr("src"),logo:b.getAttr("logo_url")}));b.parentNode.replaceChild(c,b)}})},commands:{webapp:{execCommand:function(b,c){var d=this,e=a(utils.extend(c,{align:"none"}),!1);d.execCommand("inserthtml",e)},queryCommandState:function(){var a=this,b=a.selection.getRange().getClosedNode(),c=b&&"edui-faked-webapp"==b.className;return c?1:0}}}}}),UE.plugins.template=function(){UE.commands.template={execCommand:function(a,b){b.html&&this.execCommand("inserthtml",b.html)}},this.addListener("click",function(a,b){var c=b.target||b.srcElement,d=this.selection.getRange(),e=domUtils.findParent(c,function(a){if(a.className&&domUtils.hasClass(a,"ue_t"))return a},!0);e&&d.selectNode(e).shrinkBoundary().select()}),this.addListener("keydown",function(a,b){var c=this.selection.getRange();if(!c.collapsed&&!(b.ctrlKey||b.metaKey||b.shiftKey||b.altKey)){var d=domUtils.findParent(c.startContainer,function(a){if(a.className&&domUtils.hasClass(a,"ue_t"))return a},!0);d&&domUtils.removeClasses(d,["ue_t"])}})},UE.plugin.register("music",function(){function a(a,c,d,e,f,g){return g?'':"'}var b=this;return{outputRule:function(b){utils.each(b.getNodesByTagName("img"),function(b){var c;if("edui-faked-music"==b.getAttr("class")){var d=b.getStyle("float"),e=b.getAttr("align");c=a(b.getAttr("_url"),b.getAttr("width"),b.getAttr("height"),e,d,!0);var f=UE.uNode.createElement(c);b.parentNode.replaceChild(f,b)}})},inputRule:function(b){utils.each(b.getNodesByTagName("embed"),function(b){if("edui-faked-music"==b.getAttr("class")){var c=b.getStyle("float"),d=b.getAttr("align");html=a(b.getAttr("src"),b.getAttr("width"),b.getAttr("height"),d,c,!1);var e=UE.uNode.createElement(html);b.parentNode.replaceChild(e,b)}})},commands:{music:{execCommand:function(b,c){var d=this,e=a(c.url,c.width||400,c.height||95,"none",!1);d.execCommand("inserthtml",e)},queryCommandState:function(){var a=this,b=a.selection.getRange().getClosedNode(),c=b&&"edui-faked-music"==b.className;return c?1:0}}}}}),UE.plugin.register("autoupload",function(){function a(a,b){var c,d,e,f,g,h,i,j,k=b,l=/image\/\w+/i.test(a.type)?"image":"file",m="loading_"+(+new Date).toString(36);if(c=k.getOpt(l+"FieldName"),d=k.getOpt(l+"UrlPrefix"),e=k.getOpt(l+"MaxSize"),f=k.getOpt(l+"AllowFiles"),g=k.getActionUrl(k.getOpt(l+"ActionName")),i=function(a){var b=k.document.getElementById(m);b&&domUtils.remove(b),k.fireEvent("showmessage",{id:m,content:a,type:"error",timeout:4e3})},"image"==l?(h='',j=function(a){var b=d+a.url,c=k.document.getElementById(m);c&&(c.setAttribute("src",b),c.setAttribute("_src",b),c.setAttribute("title",a.title||""),c.setAttribute("alt",a.original||""),c.removeAttribute("id"),domUtils.removeClasses(c,"loadingclass"))}):(h='

      ',j=function(a){var b=d+a.url,c=k.document.getElementById(m),e=k.selection.getRange(),f=e.createBookmark();e.selectNode(c).select(),k.execCommand("insertfile",{url:b}),e.moveToBookmark(f).select()}),k.execCommand("inserthtml",h),!k.getOpt(l+"ActionName"))return void i(k.getLang("autoupload.errorLoadConfig"));if(a.size>e)return void i(k.getLang("autoupload.exceedSizeError"));var n=a.name?a.name.substr(a.name.lastIndexOf(".")):"";if(n&&"image"!=l||f&&(f.join("")+".").indexOf(n.toLowerCase()+".")==-1)return void i(k.getLang("autoupload.exceedTypeError"));var o=new XMLHttpRequest,p=new FormData,q=utils.serializeParam(k.queryCommandValue("serverparam"))||"",r=utils.formatUrl(g+(g.indexOf("?")==-1?"?":"&")+q);p.append(c,a,a.name||"blob."+a.type.substr("image/".length)),p.append("type","ajax"),o.open("post",r,!0),o.setRequestHeader("X-Requested-With","XMLHttpRequest"),o.addEventListener("load",function(a){try{var b=new Function("return "+utils.trim(a.target.response))();"SUCCESS"==b.state&&b.url?j(b):i(b.state)}catch(c){i(k.getLang("autoupload.loadError"))}}),o.send(p)}function b(a){return a.clipboardData&&a.clipboardData.items&&1==a.clipboardData.items.length&&/^image\//.test(a.clipboardData.items[0].type)?a.clipboardData.items:null}function c(a){return a.dataTransfer&&a.dataTransfer.files?a.dataTransfer.files:null}return{outputRule:function(a){utils.each(a.getNodesByTagName("img"),function(a){/\b(loaderrorclass)|(bloaderrorclass)\b/.test(a.getAttr("class"))&&a.parentNode.removeChild(a)}),utils.each(a.getNodesByTagName("p"),function(a){/\bloadpara\b/.test(a.getAttr("class"))&&a.parentNode.removeChild(a)})},bindEvents:{ready:function(d){var e=this;window.FormData&&window.FileReader&&(domUtils.on(e.body,"paste drop",function(d){var f,g=!1;if(f="paste"==d.type?b(d):c(d)){for(var h,i=f.length;i--;)h=f[i],h.getAsFile&&(h=h.getAsFile()),h&&h.size>0&&(a(h,e),g=!0);g&&d.preventDefault()}}),domUtils.on(e.body,"dragover",function(a){"Files"==a.dataTransfer.types[0]&&a.preventDefault()}),utils.cssRule("loading",".loadingclass{display:inline-block;cursor:default;background: url('"+this.options.themePath+this.options.theme+"/images/loading.gif') no-repeat center center transparent;border:1px solid #cccccc;margin-left:1px;height: 22px;width: 22px;}\n.loaderrorclass{display:inline-block;cursor:default;background: url('"+this.options.themePath+this.options.theme+"/images/loaderror.png') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}",this.document))}}}}),UE.plugin.register("autosave",function(){function a(a){var f;if(!(new Date-c0?b._saveFlag=window.setTimeout(function(){a(b)},b.options.saveInterval):a(b))}},commands:{clearlocaldata:{execCommand:function(a,c){e&&b.getPreferences(e)&&b.removePreferences(e)},notNeedUndo:!0,ignoreContentChange:!0},getlocaldata:{execCommand:function(a,c){return e?b.getPreferences(e)||"":""},notNeedUndo:!0,ignoreContentChange:!0},drafts:{execCommand:function(a,c){e&&(b.body.innerHTML=b.getPreferences(e)||"

      "+domUtils.fillHtml+"

      ",b.focus(!0))},queryCommandState:function(){return e?null===b.getPreferences(e)?-1:0:-1},notNeedUndo:!0,ignoreContentChange:!0}}}}),UE.plugin.register("charts",function(){function a(a){var b=null,c=0;if(a.rows.length<2)return!1;if(a.rows[0].cells.length<2)return!1;b=a.rows[0].cells,c=b.length;for(var d,e=0;d=b[e];e++)if("th"!==d.tagName.toLowerCase())return!1;for(var f,e=1;f=a.rows[e];e++){if(f.cells.length!=c)return!1;if("th"!==f.cells[0].tagName.toLowerCase())return!1;for(var d,g=1;d=f.cells[g];g++){var h=utils.trim(d.innerText||d.textContent||"");if(h=h.replace(new RegExp(UE.dom.domUtils.fillChar,"g"),"").replace(/^\s+|\s+$/g,""),!/^\d*\.?\d+$/.test(h))return!1}}return!0}var b=this;return{bindEvents:{chartserror:function(){}},commands:{charts:{execCommand:function(c,d){var e=domUtils.findParentByTagName(this.selection.getRange().startContainer,"table",!0),f=[],g={};if(!e)return!1;if(!a(e))return b.fireEvent("chartserror"),!1;g.title=d.title||"",g.subTitle=d.subTitle||"",g.xTitle=d.xTitle||"",g.yTitle=d.yTitle||"",g.suffix=d.suffix||"",g.tip=d.tip||"",g.dataFormat=d.tableDataFormat||"",g.chartType=d.chartType||0;for(var h in g)g.hasOwnProperty(h)&&f.push(h+":"+g[h]);e.setAttribute("data-chart",f.join(";")),domUtils.addClass(e,"edui-charts-table")},queryCommandState:function(b,c){ +var d=domUtils.findParentByTagName(this.selection.getRange().startContainer,"table",!0);return d&&a(d)?0:-1}}},inputRule:function(a){utils.each(a.getNodesByTagName("table"),function(a){void 0!==a.getAttr("data-chart")&&a.setAttr("style")})},outputRule:function(a){utils.each(a.getNodesByTagName("table"),function(a){void 0!==a.getAttr("data-chart")&&a.setAttr("style","display: none;")})}}}),UE.plugin.register("section",function(){function a(a){this.tag="",this.level=-1,this.dom=null,this.nextSection=null,this.previousSection=null,this.parentSection=null,this.startAddress=[],this.endAddress=[],this.children=[]}function b(b){var c=new a;return utils.extend(c,b)}function c(a,b){for(var c=b,d=0;d=0){var o=h.selection.getRange().selectNode(i).createAddress(!0).startAddress,p=b({tag:i.tagName,title:i.innerText||i.textContent||"",level:f,dom:i,startAddress:utils.clone(o,[]),endAddress:utils.clone(o,[]),children:[]});for(j.nextSection=p,p.previousSection=j,g=j;f<=g.level;)g=g.parentSection;p.parentSection=g,g.children.push(p),k=j=p}else 1===i.nodeType&&e(i,c),k&&k.endAddress[k.endAddress.length-1]++}for(var f=c||["h1","h2","h3","h4","h5","h6"],g=0;g=c.length);f++){if(c[f]>a[f]){d=!0;break}if(c[f]=c.length);f++){if(c[f]a[f])break}return d&&e}var g,h,i=this;if(b&&d&&d.level!=-1&&(g=e?d.endAddress:d.startAddress,h=c(g,i.body),g&&h&&!f(b.startAddress,b.endAddress,g))){var j,k,l=c(b.startAddress,i.body),m=c(b.endAddress,i.body);if(e)for(j=m;j&&!(domUtils.getPosition(l,j)&domUtils.POSITION_FOLLOWING)&&(k=j.previousSibling,domUtils.insertAfter(h,j),j!=l);)j=k;else for(j=l;j&&!(domUtils.getPosition(j,m)&domUtils.POSITION_FOLLOWING)&&(k=j.nextSibling,h.parentNode.insertBefore(j,h),j!=m);)j=k;i.fireEvent("updateSections")}}},deletesection:{execCommand:function(a,b,c){function d(a){for(var b=e.body,c=0;c',b.className="edui-"+c.options.theme,b.id=c.ui.id+"_iframeupload",i.style.cssText=g,i.style.width=a+"px",i.style.height=e+"px",i.appendChild(b),i.parentNode&&(i.parentNode.style.width=a+"px",i.parentNode.style.height=a+"px");var k=h.getElementById("edui_form_"+j),l=h.getElementById("edui_input_"+j),m=h.getElementById("edui_iframe_"+j);domUtils.on(l,"change",function(){function a(){try{var e,f,g,h=(m.contentDocument||m.contentWindow.document).body,i=h.innerText||h.textContent||"";f=new Function("return "+i)(),e=c.options.imageUrlPrefix+f.url,"SUCCESS"==f.state&&f.url?(g=c.document.getElementById(d),g.setAttribute("src",e),g.setAttribute("_src",e),g.setAttribute("title",f.title||""),g.setAttribute("alt",f.original||""),g.removeAttribute("id"),domUtils.removeClasses(g,"loadingclass")):b&&b(f.state)}catch(j){b&&b(c.getLang("simpleupload.loadError"))}k.reset(),domUtils.un(m,"load",a)}function b(a){if(d){var b=c.document.getElementById(d);b&&domUtils.remove(b),c.fireEvent("showmessage",{id:d,content:a,type:"error",timeout:4e3})}}if(l.value){var d="loading_"+(+new Date).toString(36),e=utils.serializeParam(c.queryCommandValue("serverparam"))||"",f=c.getActionUrl(c.getOpt("imageActionName")),g=c.getOpt("imageAllowFiles");if(c.focus(),c.execCommand("inserthtml",''),!c.getOpt("imageActionName"))return void errorHandler(c.getLang("autoupload.errorLoadConfig"));var h=l.value,i=h?h.substr(h.lastIndexOf(".")):"";if(!i||g&&(g.join("")+".").indexOf(i.toLowerCase()+".")==-1)return void b(c.getLang("simpleupload.exceedTypeError"));domUtils.on(m,"load",a),k.action=utils.formatUrl(f+(f.indexOf("?")==-1?"?":"&")+e),k.submit()}});var n;c.addListener("selectionchange",function(){clearTimeout(n),n=setTimeout(function(){var a=c.queryCommandState("simpleupload");a==-1?l.disabled="disabled":l.disabled=!1},400)}),d=!0}),f.style.cssText=g,b.appendChild(f)}var b,c=this,d=!1;return{bindEvents:{ready:function(){utils.cssRule("loading",".loadingclass{display:inline-block;cursor:default;background: url('"+this.options.themePath+this.options.theme+"/images/loading.gif') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}\n.loaderrorclass{display:inline-block;cursor:default;background: url('"+this.options.themePath+this.options.theme+"/images/loaderror.png') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}",this.document)},simpleuploadbtnready:function(d,e){b=e,c.afterConfigReady(a)}},outputRule:function(a){utils.each(a.getNodesByTagName("img"),function(a){/\b(loaderrorclass)|(bloaderrorclass)\b/.test(a.getAttr("class"))&&a.parentNode.removeChild(a)})},commands:{simpleupload:{queryCommandState:function(){return d?0:-1}}}}}),UE.plugin.register("serverparam",function(){var a={};return{commands:{serverparam:{execCommand:function(b,c,d){void 0===c||null===c?a={}:utils.isString(c)?void 0===d||null===d?delete a[c]:a[c]=d:utils.isObject(c)?utils.extend(a,c,!0):utils.isFunction(c)&&utils.extend(a,c(),!0)},queryCommandValue:function(){return a||{}}}}}}),UE.plugin.register("insertfile",function(){function a(a){var b=a.substr(a.lastIndexOf(".")+1).toLowerCase(),c={rar:"icon_rar.gif",zip:"icon_rar.gif",tar:"icon_rar.gif",gz:"icon_rar.gif",bz2:"icon_rar.gif",doc:"icon_doc.gif",docx:"icon_doc.gif",pdf:"icon_pdf.gif",mp3:"icon_mp3.gif",xls:"icon_xls.gif",chm:"icon_chm.gif",ppt:"icon_ppt.gif",pptx:"icon_ppt.gif",avi:"icon_mv.gif",rmvb:"icon_mv.gif",wmv:"icon_mv.gif",flv:"icon_mv.gif",swf:"icon_mv.gif",rm:"icon_mv.gif",exe:"icon_exe.gif",psd:"icon_psd.gif",txt:"icon_txt.gif",jpg:"icon_jpg.gif",png:"icon_jpg.gif",jpeg:"icon_jpg.gif",gif:"icon_jpg.gif",ico:"icon_jpg.gif",bmp:"icon_jpg.gif"};return c[b]?c[b]:c.txt}var b=this;return{commands:{insertfile:{execCommand:function(c,d){d=utils.isArray(d)?d:[d];var e,f,g,h,i="",j=b.getOpt("UEDITOR_HOME_URL"),k=j+("/"==j.substr(j.length-1)?"":"/")+"dialogs/attachment/fileTypeImages/";for(e=0;e'+h+"

      ";b.execCommand("insertHtml",i)}}}}}),UE.plugins.xssFilter=function(){function a(a){var b=a.tagName,d=a.attrs;return c.hasOwnProperty(b)?void UE.utils.each(d,function(d,e){c[b].indexOf(e)===-1&&a.setAttr(e)}):(a.parentNode.removeChild(a),!1)}var b=UEDITOR_CONFIG,c=b.whitList;c&&b.xssFilterRules&&(this.options.filterRules=function(){var b={};return UE.utils.each(c,function(c,d){b[d]=function(b){return a(b)}}),b}());var d=[];UE.utils.each(c,function(a,b){d.push(b)}),c&&b.inputXssFilter&&this.addInputRule(function(b){b.traversal(function(b){return"element"===b.type&&void a(b)})}),c&&b.outputXssFilter&&this.addOutputRule(function(b){b.traversal(function(b){return"element"===b.type&&void a(b)})})};var baidu=baidu||{};baidu.editor=baidu.editor||{},UE.ui=baidu.editor.ui={},function(){function a(){var a=document.getElementById("edui_fixedlayer");i.setViewportOffset(a,{left:0,top:0})}function b(b){d.on(window,"scroll",a),d.on(window,"resize",baidu.editor.utils.defer(a,0,!0))}var c=baidu.editor.browser,d=baidu.editor.dom.domUtils,e="$EDITORUI",f=window[e]={},g="ID"+e,h=0,i=baidu.editor.ui.uiUtils={uid:function(a){return a?a[g]||(a[g]=++h):++h},hook:function(a,b){var c;return a&&a._callbacks?c=a:(c=function(){var b;a&&(b=a.apply(this,arguments));for(var d=c._callbacks,e=d.length;e--;){var f=d[e].apply(this,arguments);void 0===b&&(b=f)}return b},c._callbacks=[]),c._callbacks.push(b),c},createElementByHtml:function(a){var b=document.createElement("div");return b.innerHTML=a,b=b.firstChild,b.parentNode.removeChild(b),b},getViewportElement:function(){return c.ie&&c.quirks?document.body:document.documentElement},getClientRect:function(a){var b;try{b=a.getBoundingClientRect()}catch(c){b={left:0,top:0,height:0,width:0}}for(var e,f={left:Math.round(b.left),top:Math.round(b.top),height:Math.round(b.bottom-b.top),width:Math.round(b.right-b.left)};(e=a.ownerDocument)!==document&&(a=d.getWindow(e).frameElement);)b=a.getBoundingClientRect(),f.left+=b.left,f.top+=b.top;return f.bottom=f.top+f.height,f.right=f.left+f.width,f},getViewportRect:function(){var a=i.getViewportElement(),b=0|(window.innerWidth||a.clientWidth),c=0|(window.innerHeight||a.clientHeight);return{left:0,top:0,height:c,width:b,bottom:c,right:b}},setViewportOffset:function(a,b){var c=i.getFixedLayer();a.parentNode===c?(a.style.left=b.left+"px",a.style.top=b.top+"px"):d.setViewportOffset(a,b)},getEventOffset:function(a){var b=a.target||a.srcElement,c=i.getClientRect(b),d=i.getViewportOffsetByEvent(a);return{left:d.left-c.left,top:d.top-c.top}},getViewportOffsetByEvent:function(a){var b=a.target||a.srcElement,c=d.getWindow(b).frameElement,e={left:a.clientX,top:a.clientY};if(c&&b.ownerDocument!==document){var f=i.getClientRect(c);e.left+=f.left,e.top+=f.top}return e},setGlobal:function(a,b){return f[a]=b,e+'["'+a+'"]'},unsetGlobal:function(a){delete f[a]},copyAttributes:function(a,b){for(var e=b.attributes,f=e.length;f--;){var g=e[f];"style"==g.nodeName||"class"==g.nodeName||c.ie&&!g.specified||a.setAttribute(g.nodeName,g.nodeValue)}b.className&&d.addClass(a,b.className),b.style.cssText&&(a.style.cssText+=";"+b.style.cssText)},removeStyle:function(a,b){if(a.style.removeProperty)a.style.removeProperty(b);else{if(!a.style.removeAttribute)throw"";a.style.removeAttribute(b)}},contains:function(a,b){return a&&b&&a!==b&&(a.contains?a.contains(b):16&a.compareDocumentPosition(b))},startDrag:function(a,b,c){function d(a){var c=a.clientX-g,d=a.clientY-h;b.ondragmove(c,d,a),a.stopPropagation?a.stopPropagation():a.cancelBubble=!0}function e(a){c.removeEventListener("mousemove",d,!0),c.removeEventListener("mouseup",e,!0),window.removeEventListener("mouseup",e,!0),b.ondragstop()}function f(){i.releaseCapture(),i.detachEvent("onmousemove",d),i.detachEvent("onmouseup",f),i.detachEvent("onlosecaptrue",f),b.ondragstop()}var c=c||document,g=a.clientX,h=a.clientY;if(c.addEventListener)c.addEventListener("mousemove",d,!0),c.addEventListener("mouseup",e,!0),window.addEventListener("mouseup",e,!0),a.preventDefault();else{var i=a.srcElement;i.setCapture(),i.attachEvent("onmousemove",d),i.attachEvent("onmouseup",f),i.attachEvent("onlosecaptrue",f),a.returnValue=!1}b.ondragstart()},getFixedLayer:function(){var d=document.getElementById("edui_fixedlayer");return null==d&&(d=document.createElement("div"),d.id="edui_fixedlayer",document.body.appendChild(d),c.ie&&c.version<=8?(d.style.position="absolute",b(),setTimeout(a)):d.style.position="fixed",d.style.left="0",d.style.top="0",d.style.width="0",d.style.height="0"),d},makeUnselectable:function(a){if(c.opera||c.ie&&c.version<9){if(a.unselectable="on",a.hasChildNodes())for(var b=0;b
      '}},a.inherits(c,b)}(),function(){var a=baidu.editor.utils,b=baidu.editor.dom.domUtils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.uiUtils,e=baidu.editor.ui.Mask=function(a){this.initOptions(a),this.initUIBase()};e.prototype={getHtmlTpl:function(){return'
      '},postRender:function(){var a=this;b.on(window,"resize",function(){setTimeout(function(){a.isHidden()||a._fill()})})},show:function(a){this._fill(),this.getDom().style.display="",this.getDom().style.zIndex=a},hide:function(){this.getDom().style.display="none",this.getDom().style.zIndex=""},isHidden:function(){return"none"==this.getDom().style.display},_onMouseDown:function(){return!1},_onClick:function(a,b){this.fireEvent("click",a,b)},_fill:function(){var a=this.getDom(),b=d.getViewportRect();a.style.width=b.width+"px",a.style.height=b.height+"px"}},a.inherits(e,c)}(),function(){function a(a,b){for(var c=0;c
      '+this.getContentHtmlTpl()+"
      "},getContentHtmlTpl:function(){return this.content?"string"==typeof this.content?this.content:this.content.renderHtml():""},_UIBase_postRender:e.prototype.postRender,postRender:function(){if(this.content instanceof e&&this.content.postRender(),this.captureWheel&&!this.captured){this.captured=!0;var a=(document.documentElement.clientHeight||document.body.clientHeight)-80,b=this.getDom().offsetHeight,f=c.getClientRect(this.combox.getDom()).top,g=this.getDom("content"),h=this.getDom("body").getElementsByTagName("iframe"),i=this;for(h.length&&(h=h[0]);f+b>a;)b-=30;g.style.height=b+"px",h&&(h.style.height=b+"px"),window.XMLHttpRequest?d.on(g,"onmousewheel"in document.body?"mousewheel":"DOMMouseScroll",function(a){a.preventDefault?a.preventDefault():a.returnValue=!1,a.wheelDelta?g.scrollTop-=a.wheelDelta/120*60:g.scrollTop-=a.detail/-3*60}):d.on(this.getDom(),"mousewheel",function(a){a.returnValue=!1,i.getDom("content").scrollTop-=a.wheelDelta/120*60})}this.fireEvent("postRenderAfter"),this.hide(!0),this._UIBase_postRender()},_doAutoRender:function(){!this.getDom()&&this.autoRender&&this.render()},mesureSize:function(){var a=this.getDom("content");return c.getClientRect(a)},fitSize:function(){if(this.captureWheel&&this.sized)return this.__size;this.sized=!0;var a=this.getDom("body");a.style.width="",a.style.height="";var b=this.mesureSize();if(this.captureWheel){a.style.width=-(-20-b.width)+"px";var c=parseInt(this.getDom("content").style.height,10);!window.isNaN(c)&&(b.height=c)}else a.style.width=b.width+"px";return a.style.height=b.height+"px",this.__size=b,this.captureWheel&&(this.getDom("content").style.overflow="auto"),b},showAnchor:function(a,b){this.showAnchorRect(c.getClientRect(a),b)},showAnchorRect:function(a,b,e){this._doAutoRender();var f=c.getViewportRect();this.getDom().style.visibility="hidden",this._show();var g,i,j,k,l=this.fitSize();b?(g=this.canSideLeft&&a.right+l.width>f.right&&a.left>l.width,i=this.canSideUp&&a.top+l.height>f.bottom&&a.bottom>l.height,j=g?a.left-l.width:a.right,k=i?a.bottom-l.height:a.top):(g=this.canSideLeft&&a.right+l.width>f.right&&a.left>l.width,i=this.canSideUp&&a.top+l.height>f.bottom&&a.bottom>l.height,j=g?a.right-l.width:a.left,k=i?a.top-l.height:a.bottom);var m=this.getDom();c.setViewportOffset(m,{left:j,top:k}),d.removeClasses(m,h),m.className+=" "+h[2*(i?1:0)+(g?1:0)],this.editor&&(m.style.zIndex=1*this.editor.container.style.zIndex+10,baidu.editor.ui.uiUtils.getFixedLayer().style.zIndex=m.style.zIndex-1),this.getDom().style.visibility="visible"},showAt:function(a){var b=a.left,c=a.top,d={left:b,top:c,right:b,bottom:c,height:0,width:0};this.showAnchorRect(d,!1,!0)},_show:function(){if(this._hidden){var a=this.getDom();a.style.display="",this._hidden=!1,this.fireEvent("show")}},isHidden:function(){return this._hidden},show:function(){this._doAutoRender(),this._show()},hide:function(a){!this._hidden&&this.getDom()&&(this.getDom().style.display="none",this._hidden=!0,a||this.fireEvent("hide"))},queryAutoHide:function(a){return!a||!c.contains(this.getDom(),a)}},b.inherits(f,e),d.on(document,"mousedown",function(b){var c=b.target||b.srcElement;a(b,c)}),d.on(window,"scroll",function(b,c){a(b,c)})}(),function(){function a(a,b){for(var c='
      '+a+'
      ',d=0;d"+(60==d?'":"")+""),c+=d<70?'':"";return c+="
      '+b.getLang("themeColor")+'
      '+b.getLang("standardColor")+"
      =60?"border-width:1px;":d>=10&&d<20?"border-width:1px 1px 0 1px;":"border-width:0 1px 0 1px;")+'">
      "}var b=baidu.editor.utils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.ColorPicker=function(a){this.initOptions(a),this.noColorText=this.noColorText||this.editor.getLang("clearColor"),this.initUIBase()};d.prototype={getHtmlTpl:function(){return a(this.noColorText,this.editor)},_onTableClick:function(a){var b=a.target||a.srcElement,c=b.getAttribute("data-color");c&&this.fireEvent("pickcolor",c)},_onTableOver:function(a){var b=a.target||a.srcElement,c=b.getAttribute("data-color");c&&(this.getDom("preview").style.backgroundColor=c)},_onTableOut:function(){this.getDom("preview").style.backgroundColor=""},_onPickNoColor:function(){this.fireEvent("picknocolor")}},b.inherits(d,c);var e="ffffff,000000,eeece1,1f497d,4f81bd,c0504d,9bbb59,8064a2,4bacc6,f79646,f2f2f2,7f7f7f,ddd9c3,c6d9f0,dbe5f1,f2dcdb,ebf1dd,e5e0ec,dbeef3,fdeada,d8d8d8,595959,c4bd97,8db3e2,b8cce4,e5b9b7,d7e3bc,ccc1d9,b7dde8,fbd5b5,bfbfbf,3f3f3f,938953,548dd4,95b3d7,d99694,c3d69b,b2a2c7,92cddc,fac08f,a5a5a5,262626,494429,17365d,366092,953734,76923c,5f497a,31859b,e36c09,7f7f7f,0c0c0c,1d1b10,0f243e,244061,632423,4f6128,3f3151,205867,974806,c00000,ff0000,ffc000,ffff00,92d050,00b050,00b0f0,0070c0,002060,7030a0,".split(",")}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.TablePicker=function(a){this.initOptions(a),this.initTablePicker()};d.prototype={defaultNumRows:10,defaultNumCols:10,maxNumRows:20,maxNumCols:20,numRows:10,numCols:10,lengthOfCellSide:22,initTablePicker:function(){this.initUIBase()},getHtmlTpl:function(){return'
      '},_UIBase_render:c.prototype.render,render:function(a){this._UIBase_render(a),this.getDom("label").innerHTML="0"+this.editor.getLang("t_row")+" x 0"+this.editor.getLang("t_col")},_track:function(a,b){var c=this.getDom("overlay").style,d=this.lengthOfCellSide;c.width=a*d+"px",c.height=b*d+"px";var e=this.getDom("label");e.innerHTML=a+this.editor.getLang("t_col")+" x "+b+this.editor.getLang("t_row"),this.numCols=a,this.numRows=b},_onMouseOver:function(a,c){var d=a.relatedTarget||a.fromElement;b.contains(c,d)||c===d||(this.getDom("label").innerHTML="0"+this.editor.getLang("t_col")+" x 0"+this.editor.getLang("t_row"),this.getDom("overlay").style.visibility="")},_onMouseOut:function(a,c){var d=a.relatedTarget||a.toElement;b.contains(c,d)||c===d||(this.getDom("label").innerHTML="0"+this.editor.getLang("t_col")+" x 0"+this.editor.getLang("t_row"),this.getDom("overlay").style.visibility="hidden")},_onMouseMove:function(a,c){var d=(this.getDom("overlay").style,b.getEventOffset(a)),e=this.lengthOfCellSide,f=Math.ceil(d.left/e),g=Math.ceil(d.top/e);this._track(f,g)},_onClick:function(){this.fireEvent("picktable",this.numCols,this.numRows)}},a.inherits(d,c)}(),function(){var a=baidu.editor.browser,b=baidu.editor.dom.domUtils,c=baidu.editor.ui.uiUtils,d='onmousedown="$$.Stateful_onMouseDown(event, this);" onmouseup="$$.Stateful_onMouseUp(event, this);"'+(a.ie?' onmouseenter="$$.Stateful_onMouseEnter(event, this);" onmouseleave="$$.Stateful_onMouseLeave(event, this);"':' onmouseover="$$.Stateful_onMouseOver(event, this);" onmouseout="$$.Stateful_onMouseOut(event, this);"');baidu.editor.ui.Stateful={alwalysHoverable:!1,target:null,Stateful_init:function(){this._Stateful_dGetHtmlTpl=this.getHtmlTpl,this.getHtmlTpl=this.Stateful_getHtmlTpl},Stateful_getHtmlTpl:function(){var a=this._Stateful_dGetHtmlTpl();return a.replace(/stateful/g,function(){return d})},Stateful_onMouseEnter:function(a,b){this.target=b,this.isDisabled()&&!this.alwalysHoverable||(this.addState("hover"),this.fireEvent("over"))},Stateful_onMouseLeave:function(a,b){this.isDisabled()&&!this.alwalysHoverable||(this.removeState("hover"),this.removeState("active"),this.fireEvent("out"))},Stateful_onMouseOver:function(a,b){var d=a.relatedTarget;c.contains(b,d)||b===d||this.Stateful_onMouseEnter(a,b)},Stateful_onMouseOut:function(a,b){var d=a.relatedTarget;c.contains(b,d)||b===d||this.Stateful_onMouseLeave(a,b)},Stateful_onMouseDown:function(a,b){this.isDisabled()||this.addState("active")},Stateful_onMouseUp:function(a,b){this.isDisabled()||this.removeState("active")},Stateful_postRender:function(){this.disabled&&!this.hasState("disabled")&&this.addState("disabled")},hasState:function(a){return b.hasClass(this.getStateDom(),"edui-state-"+a)},addState:function(a){this.hasState(a)||(this.getStateDom().className+=" edui-state-"+a)},removeState:function(a){this.hasState(a)&&b.removeClasses(this.getStateDom(),["edui-state-"+a])},getStateDom:function(){return this.getDom("state")},isChecked:function(){return this.hasState("checked")},setChecked:function(a){!this.isDisabled()&&a?this.addState("checked"):this.removeState("checked")},isDisabled:function(){return this.hasState("disabled")},setDisabled:function(a){a?(this.removeState("hover"),this.removeState("checked"),this.removeState("active"),this.addState("disabled")):this.removeState("disabled")}}}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.UIBase,c=baidu.editor.ui.Stateful,d=baidu.editor.ui.Button=function(a){if(a.name){var b=a.name,c=a.cssRules;a.className||(a.className="edui-for-"+b),a.cssRules=".edui-default .edui-for-"+b+" .edui-icon {"+c+"}"}this.initOptions(a),this.initButton()};d.prototype={uiName:"button",label:"",title:"",showIcon:!0,showText:!0,cssRules:"",initButton:function(){this.initUIBase(),this.Stateful_init(),this.cssRules&&a.cssRule("edui-customize-"+this.name+"-style",this.cssRules)},getHtmlTpl:function(){return'
      '+(this.showIcon?'
      ':"")+(this.showText?'
      '+this.label+"
      ":"")+"
      "},postRender:function(){this.Stateful_postRender(),this.setDisabled(this.disabled)},_onMouseDown:function(a){var b=a.target||a.srcElement,c=b&&b.tagName&&b.tagName.toLowerCase();if("input"==c||"object"==c||"object"==c)return!1},_onClick:function(){this.isDisabled()||this.fireEvent("click")},setTitle:function(a){var b=this.getDom("label");b.innerHTML=a}},a.inherits(d,b),a.extend(d.prototype,c)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=(baidu.editor.dom.domUtils,baidu.editor.ui.UIBase),d=baidu.editor.ui.Stateful,e=baidu.editor.ui.SplitButton=function(a){this.initOptions(a),this.initSplitButton()};e.prototype={popup:null,uiName:"splitbutton",title:"",initSplitButton:function(){this.initUIBase(),this.Stateful_init();if(null!=this.popup){var a=this.popup;this.popup=null,this.setPopup(a)}},_UIBase_postRender:c.prototype.postRender,postRender:function(){this.Stateful_postRender(),this._UIBase_postRender()},setPopup:function(c){this.popup!==c&&(null!=this.popup&&this.popup.dispose(),c.addListener("show",a.bind(this._onPopupShow,this)),c.addListener("hide",a.bind(this._onPopupHide,this)),c.addListener("postrender",a.bind(function(){c.getDom("body").appendChild(b.createElementByHtml('
      ')),c.getDom().className+=" "+this.className},this)),this.popup=c)},_onPopupShow:function(){this.addState("opened")},_onPopupHide:function(){this.removeState("opened")},getHtmlTpl:function(){return'
      '},showPopup:function(){var a=b.getClientRect(this.getDom());a.top-=this.popup.SHADOW_RADIUS,a.height+=this.popup.SHADOW_RADIUS,this.popup.showAnchorRect(a)},_onArrowClick:function(a,b){this.isDisabled()||this.showPopup()},_onButtonClick:function(){this.isDisabled()||this.fireEvent("buttonclick")}},a.inherits(e,c),a.extend(e.prototype,d,!0)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=baidu.editor.ui.ColorPicker,d=baidu.editor.ui.Popup,e=baidu.editor.ui.SplitButton,f=baidu.editor.ui.ColorButton=function(a){this.initOptions(a),this.initColorButton()};f.prototype={initColorButton:function(){var a=this;this.popup=new d({content:new c({noColorText:a.editor.getLang("clearColor"),editor:a.editor,onpickcolor:function(b,c){a._onPickColor(c)},onpicknocolor:function(b,c){a._onPickNoColor(c)}}),editor:a.editor}),this.initSplitButton()},_SplitButton_postRender:e.prototype.postRender,postRender:function(){this._SplitButton_postRender(),this.getDom("button_body").appendChild(b.createElementByHtml('
      ')),this.getDom().className+=" edui-colorbutton"; +},setColor:function(a){this.getDom("colorlump").style.backgroundColor=a,this.color=a},_onPickColor:function(a){this.fireEvent("pickcolor",a)!==!1&&(this.setColor(a),this.popup.hide())},_onPickNoColor:function(a){this.fireEvent("picknocolor")!==!1&&this.popup.hide()}},a.inherits(f,e)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.Popup,c=baidu.editor.ui.TablePicker,d=baidu.editor.ui.SplitButton,e=baidu.editor.ui.TableButton=function(a){this.initOptions(a),this.initTableButton()};e.prototype={initTableButton:function(){var a=this;this.popup=new b({content:new c({editor:a.editor,onpicktable:function(b,c,d){a._onPickTable(c,d)}}),editor:a.editor}),this.initSplitButton()},_onPickTable:function(a,b){this.fireEvent("picktable",a,b)!==!1&&this.popup.hide()}},a.inherits(e,d)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.UIBase,c=baidu.editor.ui.AutoTypeSetPicker=function(a){this.initOptions(a),this.initAutoTypeSetPicker()};c.prototype={initAutoTypeSetPicker:function(){this.initUIBase()},getHtmlTpl:function(){var a=this.editor,b=a.options.autotypeset,c=a.getLang("autoTypeSet"),d="textAlignValue"+a.uid,e="imageBlockLineValue"+a.uid,f="symbolConverValue"+a.uid;return'
      "+c.mergeLine+'"+c.delLine+'
      "+c.removeFormat+'"+c.indent+'
      "+c.alignment+'"+a.getLang("justifyleft")+'"+a.getLang("justifycenter")+'"+a.getLang("justifyright")+'
      "+c.imageFloat+'"+a.getLang("default")+'"+a.getLang("justifyleft")+'"+a.getLang("justifycenter")+'"+a.getLang("justifyright")+'
      "+c.removeFontsize+'"+c.removeFontFamily+'
      "+c.removeHtml+'
      "+c.pasteFilter+'
      "+c.symbol+'"+c.bdc2sb+'"+c.tobdc+'
      "},_UIBase_render:b.prototype.render},a.inherits(c,b)}(),function(){function a(a){for(var c,d={},e=a.getDom(),f=a.editor.uid,g=null,h=null,i=domUtils.getElementsByTagName(e,"input"),j=i.length-1;c=i[j--];)if(g=c.getAttribute("type"),"checkbox"==g)if(h=c.getAttribute("name"),d[h]&&delete d[h],c.checked){var k=document.getElementById(h+"Value"+f);if(k){if(/input/gi.test(k.tagName))d[h]=k.value;else for(var l,m=k.getElementsByTagName("input"),n=m.length-1;l=m[n--];)if(l.checked){d[h]=l.value;break}}else d[h]=!0}else d[h]=!1;else d[c.getAttribute("value")]=c.checked;for(var o,p=domUtils.getElementsByTagName(e,"select"),j=0;o=p[j++];){var q=o.getAttribute("name");d[q]=d[q]?o.value:""}b.extend(a.editor.options.autotypeset,d),a.editor.setPreferences("autotypeset",d)}var b=baidu.editor.utils,c=baidu.editor.ui.Popup,d=baidu.editor.ui.AutoTypeSetPicker,e=baidu.editor.ui.SplitButton,f=baidu.editor.ui.AutoTypeSetButton=function(a){this.initOptions(a),this.initAutoTypeSetButton()};f.prototype={initAutoTypeSetButton:function(){var b=this;this.popup=new c({content:new d({editor:b.editor}),editor:b.editor,hide:function(){!this._hidden&&this.getDom()&&(a(this),this.getDom().style.display="none",this._hidden=!0,this.fireEvent("hide"))}});var e=0;this.popup.addListener("postRenderAfter",function(){var c=this;if(!e){var d=this.getDom(),f=d.getElementsByTagName("button")[0];f.onclick=function(){a(c),b.editor.execCommand("autotypeset"),c.hide()},domUtils.on(d,"click",function(d){var e=d.target||d.srcElement,f=b.editor.uid;if(e&&"INPUT"==e.tagName){if("imageBlockLine"==e.name||"textAlign"==e.name||"symbolConver"==e.name)for(var g=e.checked,h=document.getElementById(e.name+"Value"+f),i=h.getElementsByTagName("input"),j={imageBlockLine:"none",textAlign:"left",symbolConver:"tobdc"},k=0;k"),e.push('
      '),2===d&&e.push("");return'
      '+e.join("")+"
      "},getStateDom:function(){return this.target},_onClick:function(a){var c=a.target||a.srcElement;/icon/.test(c.className)&&(this.items[c.parentNode.getAttribute("index")].onclick(),b.postHide(a))},_UIBase_render:d.prototype.render},a.inherits(e,d),a.extend(e.prototype,c,!0)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.Stateful,c=baidu.editor.ui.uiUtils,d=baidu.editor.ui.UIBase,e=baidu.editor.ui.PastePicker=function(a){this.initOptions(a),this.initPastePicker()};e.prototype={initPastePicker:function(){this.initUIBase(),this.Stateful_init()},getHtmlTpl:function(){return'
      '+this.editor.getLang("pasteOpt")+'
      '},getStateDom:function(){return this.target},format:function(a){this.editor.ui._isTransfer=!0,this.editor.fireEvent("pasteTransfer",a)},_onClick:function(a){var b=domUtils.getNextDomNode(a),d=c.getViewportRect().height,e=c.getClientRect(b);e.top+e.height>d?b.style.top=-e.height-a.offsetHeight+"px":b.style.top="",/hidden/gi.test(domUtils.getComputedStyle(b,"visibility"))?(b.style.visibility="visible",domUtils.addClass(a,"edui-state-opened")):(b.style.visibility="hidden",domUtils.removeClasses(a,"edui-state-opened"))},_UIBase_render:d.prototype.render},a.inherits(e,d),a.extend(e.prototype,b,!0)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.Toolbar=function(a){this.initOptions(a),this.initToolbar()};d.prototype={items:null,initToolbar:function(){this.items=this.items||[],this.initUIBase()},add:function(a,b){void 0===b?this.items.push(a):this.items.splice(b,0,a)},getHtmlTpl:function(){for(var a=[],b=0;b'+a.join("")+"
      '},postRender:function(){},queryAutoHide:function(){return!0}};h.prototype={items:null,uiName:"menu",initMenu:function(){this.items=this.items||[],this.initPopup(),this.initItems()},initItems:function(){for(var a=0;a'+a.join("")+"
      "},_Popup_postRender:e.prototype.postRender,postRender:function(){for(var a=this,d=0;d
      '+this.renderLabelHtml()+"
      "},postRender:function(){var a=this;this.addListener("over",function(){a.ownerMenu.fireEvent("submenuover",a),a.subMenu&&a.delayShowSubMenu()}),this.subMenu&&(this.getDom().className+=" edui-hassubmenu",this.subMenu.render(),this.addListener("out",function(){a.delayHideSubMenu()}),this.subMenu.addListener("over",function(){clearTimeout(a._closingTimer),a._closingTimer=null,a.addState("opened")}),this.ownerMenu.addListener("hide",function(){a.hideSubMenu()}),this.ownerMenu.addListener("submenuover",function(b,c){c!==a&&a.delayHideSubMenu()}),this.subMenu._bakQueryAutoHide=this.subMenu.queryAutoHide,this.subMenu.queryAutoHide=function(b){return(!b||!c.contains(a.getDom(),b))&&this._bakQueryAutoHide(b)}),this.getDom().style.tabIndex="-1",c.makeUnselectable(this.getDom()),this.Stateful_postRender()},delayShowSubMenu:function(){var a=this;a.isDisabled()||(a.addState("opened"),clearTimeout(a._showingTimer),clearTimeout(a._closingTimer),a._closingTimer=null,a._showingTimer=setTimeout(function(){a.showSubMenu()},250))},delayHideSubMenu:function(){var a=this;a.isDisabled()||(a.removeState("opened"),clearTimeout(a._showingTimer),a._closingTimer||(a._closingTimer=setTimeout(function(){a.hasState("opened")||a.hideSubMenu(),a._closingTimer=null},400)))},renderLabelHtml:function(){return'
      '+(this.label||"")+"
      "},getStateDom:function(){return this.getDom()},queryAutoHide:function(a){if(this.subMenu&&this.hasState("opened"))return this.subMenu.queryAutoHide(a)},_onClick:function(a,b){this.hasState("disabled")||this.fireEvent("click",a,b)!==!1&&(this.subMenu?this.showSubMenu():e.postHide(a))},showSubMenu:function(){var a=c.getClientRect(this.getDom());a.right-=5,a.left+=2,a.width-=7,a.top-=4,a.bottom+=4,a.height+=8,this.subMenu.showAnchorRect(a,!0,!0)},hideSubMenu:function(){this.subMenu.hide()}},a.inherits(j,d),a.extend(j.prototype,f,!0)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=baidu.editor.ui.Menu,d=baidu.editor.ui.SplitButton,e=baidu.editor.ui.Combox=function(a){this.initOptions(a),this.initCombox()};e.prototype={uiName:"combox",onbuttonclick:function(){this.showPopup()},initCombox:function(){var a=this;this.items=this.items||[];for(var b=0;bd.right&&(g=d.right-e.width);var h=a.top;h+e.height>d.bottom&&(h=d.bottom-e.height),c.style.left=Math.max(g,0)+"px",c.style.top=Math.max(h,0)+"px"},showAtCenter:function(){var a=f.getViewportRect();if(this.fullscreen){var b=this.getDom(),c=this.getDom("content");b.style.display="block";var d=UE.ui.uiUtils.getClientRect(b),g=UE.ui.uiUtils.getClientRect(c);b.style.left="-100000px",c.style.width=a.width-d.width+g.width+"px",c.style.height=a.height-d.height+g.height+"px",b.style.width=a.width+"px",b.style.height=a.height+"px",b.style.left=0,this._originalContext={html:{overflowX:document.documentElement.style.overflowX,overflowY:document.documentElement.style.overflowY},body:{overflowX:document.body.style.overflowX,overflowY:document.body.style.overflowY}},document.documentElement.style.overflowX="hidden",document.documentElement.style.overflowY="hidden",document.body.style.overflowX="hidden",document.body.style.overflowY="hidden"}else{this.getDom().style.display="";var h=this.fitSize(),i=0|this.getDom("titlebar").offsetHeight,j=a.width/2-h.width/2,k=a.height/2-(h.height-i)/2-i,l=this.getDom();this.safeSetOffset({left:Math.max(0|j,0),top:Math.max(0|k,0)}),e.hasClass(l,"edui-state-centered")||(l.className+=" edui-state-centered")}this._show()},getContentHtml:function(){var a="";return"string"==typeof this.content?a=this.content:this.iframeUrl&&(a=''),a},getHtmlTpl:function(){var a="";if(this.buttons){for(var b=[],c=0;c
      '+b.join("")+"
      "}return'
      '+(this.title||"")+"
      "+this.closeButton.renderHtml()+'
      '+(this.autoReset?"":this.getContentHtml())+"
      "+a+"
      "},postRender:function(){this.modalMask.getDom()||(this.modalMask.render(),this.modalMask.hide()),this.dragMask.getDom()||(this.dragMask.render(),this.dragMask.hide());var a=this;if(this.addListener("show",function(){a.modalMask.show(this.getDom().style.zIndex-2)}),this.addListener("hide",function(){a.modalMask.hide()}),this.buttons)for(var b=0;b',a.editor.container.style.zIndex&&(this.getDom().style.zIndex=1*a.editor.container.style.zIndex+1))}}),this.onbuttonclick=function(){this.showPopup()},this.initSplitButton()}},a.inherits(d,c)}(),function(){function a(a){var b=a.target||a.srcElement,c=g.findParent(b,function(a){return g.hasClass(a,"edui-shortcutmenu")||g.hasClass(a,"edui-popup")},!0);if(!c)for(var d,e=0;d=h[e++];)d.hide()}var b,c=baidu.editor.ui,d=c.UIBase,e=c.uiUtils,f=baidu.editor.utils,g=baidu.editor.dom.domUtils,h=[],i=!1,j=c.ShortCutMenu=function(a){this.initOptions(a),this.initShortCutMenu()};j.postHide=a,j.prototype={isHidden:!0,SPACE:5,initShortCutMenu:function(){this.items=this.items||[],this.initUIBase(),this.initItems(),this.initEvent(),h.push(this)},initEvent:function(){var a=this,c=a.editor.document;g.on(c,"mousemove",function(c){if(a.isHidden===!1){if(a.getSubMenuMark()||"contextmenu"==a.eventType)return;var d=!0,e=a.getDom(),f=e.offsetWidth,g=e.offsetHeight,h=f/2+a.SPACE,i=g/2,j=Math.abs(c.screenX-a.left),k=Math.abs(c.screenY-a.top);clearTimeout(b),b=setTimeout(function(){k>0&&ki&&ki+70&&k0&&jh&&jh+70&&j'+a+""}},f.inherits(j,d),g.on(document,"mousedown",function(b){a(b)}),g.on(window,"scroll",function(b){a(b)})}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.UIBase,c=baidu.editor.ui.Breakline=function(a){this.initOptions(a),this.initSeparator()};c.prototype={uiName:"Breakline",initSeparator:function(){this.initUIBase()},getHtmlTpl:function(){return"
      "}},a.inherits(c,b)}(),function(){var a=baidu.editor.utils,b=baidu.editor.dom.domUtils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.Message=function(a){this.initOptions(a),this.initMessage()};d.prototype={initMessage:function(){this.initUIBase()},getHtmlTpl:function(){return'
      ×
      '},reset:function(a){var b=this;a.keepshow||(clearTimeout(this.timer),b.timer=setTimeout(function(){b.hide()},a.timeout||4e3)),void 0!==a.content&&b.setContent(a.content),void 0!==a.type&&b.setType(a.type),b.show()},postRender:function(){var a=this,c=this.getDom("closer");c&&b.on(c,"click",function(){a.hide()})},setContent:function(a){this.getDom("content").innerHTML=a},setType:function(a){a=a||"info";var b=this.getDom("body");b.className=b.className.replace(/edui-message-type-[\w-]+/,"edui-message-type-"+a)},getContent:function(){return this.getDom("content").innerHTML},getType:function(){var a=this.getDom("body").match(/edui-message-type-([\w-]+)/);return a?a[1]:""},show:function(){this.getDom().style.display="block"},hide:function(){var a=this.getDom();a&&(a.style.display="none",a.parentNode&&a.parentNode.removeChild(a))}},a.inherits(d,c)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui,c=b.Dialog;b.buttons={},b.Dialog=function(a){var b=new c(a);return b.addListener("hide",function(){if(b.editor){var a=b.editor;try{if(browser.gecko){var c=a.window.scrollY,d=a.window.scrollX;a.body.focus(),a.window.scrollTo(d,c)}else a.focus()}catch(e){}}}),b};for(var d,e={anchor:"~/dialogs/anchor/anchor.html",insertimage:"~/dialogs/image/image.html",link:"~/dialogs/link/link.html",spechars:"~/dialogs/spechars/spechars.html",searchreplace:"~/dialogs/searchreplace/searchreplace.html",map:"~/dialogs/map/map.html",gmap:"~/dialogs/gmap/gmap.html",insertvideo:"~/dialogs/video/video.html",help:"~/dialogs/help/help.html",preview:"~/dialogs/preview/preview.html",emotion:"~/dialogs/emotion/emotion.html",wordimage:"~/dialogs/wordimage/wordimage.html",attachment:"~/dialogs/attachment/attachment.html",insertframe:"~/dialogs/insertframe/insertframe.html",edittip:"~/dialogs/table/edittip.html",edittable:"~/dialogs/table/edittable.html",edittd:"~/dialogs/table/edittd.html",webapp:"~/dialogs/webapp/webapp.html",snapscreen:"~/dialogs/snapscreen/snapscreen.html",scrawl:"~/dialogs/scrawl/scrawl.html",music:"~/dialogs/music/music.html",template:"~/dialogs/template/template.html",background:"~/dialogs/background/background.html",charts:"~/dialogs/charts/charts.html"},f=["undo","redo","formatmatch","bold","italic","underline","fontborder","touppercase","tolowercase","strikethrough","subscript","superscript","source","indent","outdent","blockquote","pasteplain","pagebreak","selectall","print","horizontal","removeformat","time","date","unlink","insertparagraphbeforetable","insertrow","insertcol","mergeright","mergedown","deleterow","deletecol","splittorows","splittocols","splittocells","mergecells","deletetable","drafts"],g=0;d=f[g++];)d=d.toLowerCase(),b[d]=function(a){return function(c){var d=new b.Button({className:"edui-for-"+a,title:c.options.labelMap[a]||c.getLang("labelMap."+a)||"",onclick:function(){c.execCommand(a)},theme:c.options.theme,showText:!1});return b.buttons[a]=d,c.addListener("selectionchange",function(b,e,f){var g=c.queryCommandState(a);g==-1?(d.setDisabled(!0),d.setChecked(!1)):f||(d.setDisabled(!1),d.setChecked(g))}),d}}(d);b.cleardoc=function(a){var c=new b.Button({className:"edui-for-cleardoc",title:a.options.labelMap.cleardoc||a.getLang("labelMap.cleardoc")||"",theme:a.options.theme,onclick:function(){confirm(a.getLang("confirmClear"))&&a.execCommand("cleardoc")}});return b.buttons.cleardoc=c,a.addListener("selectionchange",function(){c.setDisabled(a.queryCommandState("cleardoc")==-1)}),c};var h={justify:["left","right","center","justify"],imagefloat:["none","left","center","right"],directionality:["ltr","rtl"]};for(var i in h)!function(a,c){for(var d,e=0;d=c[e++];)!function(c){b[a.replace("float","")+c]=function(d){var e=new b.Button({ +className:"edui-for-"+a.replace("float","")+c,title:d.options.labelMap[a.replace("float","")+c]||d.getLang("labelMap."+a.replace("float","")+c)||"",theme:d.options.theme,onclick:function(){d.execCommand(a,c)}});return b.buttons[a]=e,d.addListener("selectionchange",function(b,f,g){e.setDisabled(d.queryCommandState(a)==-1),e.setChecked(d.queryCommandValue(a)==c&&!g)}),e}}(d)}(i,h[i]);for(var d,g=0;d=["backcolor","forecolor"][g++];)b[d]=function(a){return function(c){var d=new b.ColorButton({className:"edui-for-"+a,color:"default",title:c.options.labelMap[a]||c.getLang("labelMap."+a)||"",editor:c,onpickcolor:function(b,d){c.execCommand(a,d)},onpicknocolor:function(){c.execCommand(a,"default"),this.setColor("transparent"),this.color="default"},onbuttonclick:function(){c.execCommand(a,this.color)}});return b.buttons[a]=d,c.addListener("selectionchange",function(){d.setDisabled(c.queryCommandState(a)==-1)}),d}}(d);var j={noOk:["searchreplace","help","spechars","webapp","preview"],ok:["attachment","anchor","link","insertimage","map","gmap","insertframe","wordimage","insertvideo","insertframe","edittip","edittable","edittd","scrawl","template","music","background","charts"]};for(var i in j)!function(c,d){for(var f,g=0;f=d[g++];)browser.opera&&"searchreplace"===f||!function(d){b[d]=function(f,g,h){g=g||(f.options.iframeUrlMap||{})[d]||e[d],h=f.options.labelMap[d]||f.getLang("labelMap."+d)||"";var i;g&&(i=new b.Dialog(a.extend({iframeUrl:f.ui.mapUrl(g),editor:f,className:"edui-for-"+d,title:h,holdScroll:"insertimage"===d,fullscreen:/charts|preview/.test(d),closeDialog:f.getLang("closeDialog")},"ok"==c?{buttons:[{className:"edui-okbutton",label:f.getLang("ok"),editor:f,onclick:function(){i.close(!0)}},{className:"edui-cancelbutton",label:f.getLang("cancel"),editor:f,onclick:function(){i.close(!1)}}]}:{})),f.ui._dialogs[d+"Dialog"]=i);var j=new b.Button({className:"edui-for-"+d,title:h,onclick:function(){if(i)switch(d){case"wordimage":var a=f.execCommand("wordimage");a&&a.length&&(i.render(),i.open());break;case"scrawl":f.queryCommandState("scrawl")!=-1&&(i.render(),i.open());break;default:i.render(),i.open()}},theme:f.options.theme,disabled:"scrawl"==d&&f.queryCommandState("scrawl")==-1||"charts"==d});return b.buttons[d]=j,f.addListener("selectionchange",function(){var a={edittable:1};if(!(d in a)){var b=f.queryCommandState(d);j.getDom()&&(j.setDisabled(b==-1),j.setChecked(b))}}),j}}(f.toLowerCase())}(i,j[i]);b.snapscreen=function(a,c,d){d=a.options.labelMap.snapscreen||a.getLang("labelMap.snapscreen")||"";var f=new b.Button({className:"edui-for-snapscreen",title:d,onclick:function(){a.execCommand("snapscreen")},theme:a.options.theme});if(b.buttons.snapscreen=f,c=c||(a.options.iframeUrlMap||{}).snapscreen||e.snapscreen){var g=new b.Dialog({iframeUrl:a.ui.mapUrl(c),editor:a,className:"edui-for-snapscreen",title:d,buttons:[{className:"edui-okbutton",label:a.getLang("ok"),editor:a,onclick:function(){g.close(!0)}},{className:"edui-cancelbutton",label:a.getLang("cancel"),editor:a,onclick:function(){g.close(!1)}}]});g.render(),a.ui._dialogs.snapscreenDialog=g}return a.addListener("selectionchange",function(){f.setDisabled(a.queryCommandState("snapscreen")==-1)}),f},b.insertcode=function(c,d,e){d=c.options.insertcode||[],e=c.options.labelMap.insertcode||c.getLang("labelMap.insertcode")||"";var f=[];a.each(d,function(a,b){f.push({label:a,value:b,theme:c.options.theme,renderLabelHtml:function(){return'
      '+(this.label||"")+"
      "}})});var g=new b.Combox({editor:c,items:f,onselect:function(a,b){c.execCommand("insertcode",this.items[b].value)},onbuttonclick:function(){this.showPopup()},title:e,initValue:e,className:"edui-for-insertcode",indexByValue:function(a){if(a)for(var b,c=0;b=this.items[c];c++)if(b.value.indexOf(a)!=-1)return c;return-1}});return b.buttons.insertcode=g,c.addListener("selectionchange",function(a,b,d){if(!d){var f=c.queryCommandState("insertcode");if(f==-1)g.setDisabled(!0);else{g.setDisabled(!1);var h=c.queryCommandValue("insertcode");if(!h)return void g.setValue(e);h&&(h=h.replace(/['"]/g,"").split(",")[0]),g.setValue(h)}}}),g},b.fontfamily=function(c,d,e){if(d=c.options.fontfamily||[],e=c.options.labelMap.fontfamily||c.getLang("labelMap.fontfamily")||"",d.length){for(var f,g=0,h=[];f=d[g];g++){var i=c.getLang("fontfamily")[f.name]||"";!function(b,d){h.push({label:b,value:d,theme:c.options.theme,renderLabelHtml:function(){return'
      '+(this.label||"")+"
      "}})}(f.label||i,f.val)}var j=new b.Combox({editor:c,items:h,onselect:function(a,b){c.execCommand("FontFamily",this.items[b].value)},onbuttonclick:function(){this.showPopup()},title:e,initValue:e,className:"edui-for-fontfamily",indexByValue:function(a){if(a)for(var b,c=0;b=this.items[c];c++)if(b.value.indexOf(a)!=-1)return c;return-1}});return b.buttons.fontfamily=j,c.addListener("selectionchange",function(a,b,d){if(!d){var e=c.queryCommandState("FontFamily");if(e==-1)j.setDisabled(!0);else{j.setDisabled(!1);var f=c.queryCommandValue("FontFamily");f&&(f=f.replace(/['"]/g,"").split(",")[0]),j.setValue(f)}}}),j}},b.fontsize=function(a,c,d){if(d=a.options.labelMap.fontsize||a.getLang("labelMap.fontsize")||"",c=c||a.options.fontsize||[],c.length){for(var e=[],f=0;f'+(this.label||"")+""}})}var h=new b.Combox({editor:a,items:e,title:d,initValue:d,onselect:function(b,c){a.execCommand("FontSize",this.items[c].value)},onbuttonclick:function(){this.showPopup()},className:"edui-for-fontsize"});return b.buttons.fontsize=h,a.addListener("selectionchange",function(b,c,d){if(!d){var e=a.queryCommandState("FontSize");e==-1?h.setDisabled(!0):(h.setDisabled(!1),h.setValue(a.queryCommandValue("FontSize")))}}),h}},b.paragraph=function(c,d,e){if(e=c.options.labelMap.paragraph||c.getLang("labelMap.paragraph")||"",d=c.options.paragraph||[],!a.isEmptyObject(d)){var f=[];for(var g in d)f.push({value:g,label:d[g]||c.getLang("paragraph")[g],theme:c.options.theme,renderLabelHtml:function(){return'
      '+(this.label||"")+"
      "}});var h=new b.Combox({editor:c,items:f,title:e,initValue:e,className:"edui-for-paragraph",onselect:function(a,b){c.execCommand("Paragraph",this.items[b].value)},onbuttonclick:function(){this.showPopup()}});return b.buttons.paragraph=h,c.addListener("selectionchange",function(a,b,d){if(!d){var e=c.queryCommandState("Paragraph");if(e==-1)h.setDisabled(!0);else{h.setDisabled(!1);var f=c.queryCommandValue("Paragraph"),g=h.indexByValue(f);g!=-1?h.setValue(f):h.setValue(h.initValue)}}}),h}},b.customstyle=function(a){var c=a.options.customstyle||[],d=a.options.labelMap.customstyle||a.getLang("labelMap.customstyle")||"";if(c.length){for(var e,f=a.getLang("customstyle"),g=0,h=[];e=c[g++];)!function(b){var c={};c.label=b.label?b.label:f[b.name],c.style=b.style,c.className=b.className,c.tag=b.tag,h.push({label:c.label,value:c,theme:a.options.theme,renderLabelHtml:function(){return'
      <'+c.tag+" "+(c.className?' class="'+c.className+'"':"")+(c.style?' style="'+c.style+'"':"")+">"+c.label+"
      "}})}(e);var i=new b.Combox({editor:a,items:h,title:d,initValue:d,className:"edui-for-customstyle",onselect:function(b,c){a.execCommand("customstyle",this.items[c].value)},onbuttonclick:function(){this.showPopup()},indexByValue:function(a){for(var b,c=0;b=this.items[c++];)if(b.label==a)return c-1;return-1}});return b.buttons.customstyle=i,a.addListener("selectionchange",function(b,c,d){if(!d){var e=a.queryCommandState("customstyle");if(e==-1)i.setDisabled(!0);else{i.setDisabled(!1);var f=a.queryCommandValue("customstyle"),g=i.indexByValue(f);g!=-1?i.setValue(f):i.setValue(i.initValue)}}}),i}},b.inserttable=function(a,c,d){d=a.options.labelMap.inserttable||a.getLang("labelMap.inserttable")||"";var e=new b.TableButton({editor:a,title:d,className:"edui-for-inserttable",onpicktable:function(b,c,d){a.execCommand("InsertTable",{numRows:d,numCols:c,border:1})},onbuttonclick:function(){this.showPopup()}});return b.buttons.inserttable=e,a.addListener("selectionchange",function(){e.setDisabled(a.queryCommandState("inserttable")==-1)}),e},b.lineheight=function(a){var c=a.options.lineheight||[];if(c.length){for(var d,e=0,f=[];d=c[e++];)f.push({label:d,value:d,theme:a.options.theme,onclick:function(){a.execCommand("lineheight",this.value)}});var g=new b.MenuButton({editor:a,className:"edui-for-lineheight",title:a.options.labelMap.lineheight||a.getLang("labelMap.lineheight")||"",items:f,onbuttonclick:function(){var b=a.queryCommandValue("LineHeight")||this.value;a.execCommand("LineHeight",b)}});return b.buttons.lineheight=g,a.addListener("selectionchange",function(){var b=a.queryCommandState("LineHeight");if(b==-1)g.setDisabled(!0);else{g.setDisabled(!1);var c=a.queryCommandValue("LineHeight");c&&g.setValue((c+"").replace(/cm/,"")),g.setChecked(b)}}),g}};for(var k,l=["top","bottom"],m=0;k=l[m++];)!function(a){b["rowspacing"+a]=function(c){var d=c.options["rowspacing"+a]||[];if(!d.length)return null;for(var e,f=0,g=[];e=d[f++];)g.push({label:e,value:e,theme:c.options.theme,onclick:function(){c.execCommand("rowspacing",this.value,a)}});var h=new b.MenuButton({editor:c,className:"edui-for-rowspacing"+a,title:c.options.labelMap["rowspacing"+a]||c.getLang("labelMap.rowspacing"+a)||"",items:g,onbuttonclick:function(){var b=c.queryCommandValue("rowspacing",a)||this.value;c.execCommand("rowspacing",b,a)}});return b.buttons[a]=h,c.addListener("selectionchange",function(){var b=c.queryCommandState("rowspacing",a);if(b==-1)h.setDisabled(!0);else{h.setDisabled(!1);var d=c.queryCommandValue("rowspacing",a);d&&h.setValue((d+"").replace(/%/,"")),h.setChecked(b)}}),h}}(k);for(var n,o=["insertorderedlist","insertunorderedlist"],p=0;n=o[p++];)!function(a){b[a]=function(c){var d=c.options[a],e=function(){c.execCommand(a,this.value)},f=[];for(var g in d)f.push({label:d[g]||c.getLang()[a][g]||"",value:g,theme:c.options.theme,onclick:e});var h=new b.MenuButton({editor:c,className:"edui-for-"+a,title:c.getLang("labelMap."+a)||"",items:f,onbuttonclick:function(){var b=c.queryCommandValue(a)||this.value;c.execCommand(a,b)}});return b.buttons[a]=h,c.addListener("selectionchange",function(){var b=c.queryCommandState(a);if(b==-1)h.setDisabled(!0);else{h.setDisabled(!1);var d=c.queryCommandValue(a);h.setValue(d),h.setChecked(b)}}),h}}(n);b.fullscreen=function(a,c){c=a.options.labelMap.fullscreen||a.getLang("labelMap.fullscreen")||"";var d=new b.Button({className:"edui-for-fullscreen",title:c,theme:a.options.theme,onclick:function(){a.ui&&a.ui.setFullScreen(!a.ui.isFullScreen()),this.setChecked(a.ui.isFullScreen())}});return b.buttons.fullscreen=d,a.addListener("selectionchange",function(){var b=a.queryCommandState("fullscreen");d.setDisabled(b==-1),d.setChecked(a.ui.isFullScreen())}),d},b.emotion=function(a,c){var d="emotion",f=new b.MultiMenuPop({title:a.options.labelMap[d]||a.getLang("labelMap."+d)||"",editor:a,className:"edui-for-"+d,iframeUrl:a.ui.mapUrl(c||(a.options.iframeUrlMap||{})[d]||e[d])});return b.buttons[d]=f,a.addListener("selectionchange",function(){f.setDisabled(a.queryCommandState(d)==-1)}),f},b.autotypeset=function(a){var c=new b.AutoTypeSetButton({editor:a,title:a.options.labelMap.autotypeset||a.getLang("labelMap.autotypeset")||"",className:"edui-for-autotypeset",onbuttonclick:function(){a.execCommand("autotypeset")}});return b.buttons.autotypeset=c,a.addListener("selectionchange",function(){c.setDisabled(a.queryCommandState("autotypeset")==-1)}),c},b.simpleupload=function(a){var c="simpleupload",d=new b.Button({className:"edui-for-"+c,title:a.options.labelMap[c]||a.getLang("labelMap."+c)||"",onclick:function(){},theme:a.options.theme,showText:!1});return b.buttons[c]=d,a.addListener("ready",function(){var b=d.getDom("body"),c=b.children[0];a.fireEvent("simpleuploadbtnready",c)}),a.addListener("selectionchange",function(b,e,f){var g=a.queryCommandState(c);g==-1?(d.setDisabled(!0),d.setChecked(!1)):f||(d.setDisabled(!1),d.setChecked(g))}),d}}(),function(){function a(a){this.initOptions(a),this.initEditorUI()}var b=baidu.editor.utils,c=baidu.editor.ui.uiUtils,d=baidu.editor.ui.UIBase,e=baidu.editor.dom.domUtils,f=[];a.prototype={uiName:"editor",initEditorUI:function(){function a(a,b){a.setOpt({wordCount:!0,maximumWords:1e4,wordCountMsg:a.options.wordCountMsg||a.getLang("wordCountMsg"),wordOverFlowMsg:a.options.wordOverFlowMsg||a.getLang("wordOverFlowMsg")});var c=a.options,d=c.maximumWords,e=c.wordCountMsg,f=c.wordOverFlowMsg,g=b.getDom("wordcount");if(c.wordCount){var h=a.getContentLength(!0);h>d?(g.innerHTML=f,a.fireEvent("wordcountoverflow")):g.innerHTML=e.replace("{#leave}",d-h).replace("{#count}",h)}}this.editor.ui=this,this._dialogs={},this.initUIBase(),this._initToolbars();var b=this.editor,c=this;b.addListener("ready",function(){function d(){a(b,c),e.un(b.document,"click",arguments.callee)}b.getDialog=function(a){return b.ui._dialogs[a+"Dialog"]},e.on(b.window,"scroll",function(a){baidu.editor.ui.Popup.postHide(a)}),b.ui._actualFrameWidth=b.options.initialFrameWidth,UE.browser.ie&&6===UE.browser.version&&b.container.ownerDocument.execCommand("BackgroundImageCache",!1,!0),b.options.elementPathEnabled&&(b.ui.getDom("elementpath").innerHTML='
      '+b.getLang("elementPathTip")+":
      "),b.options.wordCount&&(e.on(b.document,"click",d),b.ui.getDom("wordcount").innerHTML=b.getLang("wordCountTip")),b.ui._scale(),b.options.scaleEnabled?(b.autoHeightEnabled&&b.disableAutoHeight(),c.enableScale()):c.disableScale(),b.options.elementPathEnabled||b.options.wordCount||b.options.scaleEnabled||(b.ui.getDom("elementpath").style.display="none",b.ui.getDom("wordcount").style.display="none",b.ui.getDom("scale").style.display="none"),b.selection.isFocus()&&b.fireEvent("selectionchange",!1,!0)}),b.addListener("mousedown",function(a,b){var c=b.target||b.srcElement;baidu.editor.ui.Popup.postHide(b,c),baidu.editor.ui.ShortCutMenu.postHide(b)}),b.addListener("delcells",function(){UE.ui.edittip&&new UE.ui.edittip(b),b.getDialog("edittip").open()});var d,f,g=!1;b.addListener("afterpaste",function(){b.queryCommandState("pasteplain")||(baidu.editor.ui.PastePicker&&(d=new baidu.editor.ui.Popup({content:new baidu.editor.ui.PastePicker({editor:b}),editor:b,className:"edui-wordpastepop"}),d.render()),g=!0)}),b.addListener("afterinserthtml",function(){clearTimeout(f),f=setTimeout(function(){if(d&&(g||b.ui._isTransfer)){if(d.isHidden()){var a=e.createElement(b.document,"span",{style:"line-height:0px;",innerHTML:"\ufeff"}),c=b.selection.getRange();c.insertNode(a);var f=getDomNode(a,"firstChild","previousSibling");f&&d.showAnchor(3==f.nodeType?f.parentNode:f),e.remove(a)}else d.show();delete b.ui._isTransfer,g=!1}},200)}),b.addListener("contextmenu",function(a,b){baidu.editor.ui.Popup.postHide(b)}),b.addListener("keydown",function(a,b){d&&d.dispose(b);var c=b.keyCode||b.which;b.altKey&&90==c&&UE.ui.buttons.fullscreen.onclick()}),b.addListener("wordcount",function(b){a(this,c)}),b.addListener("selectionchange",function(){b.options.elementPathEnabled&&c[(b.queryCommandState("elementpath")==-1?"dis":"en")+"ableElementPath"](),b.options.scaleEnabled&&c[(b.queryCommandState("scale")==-1?"dis":"en")+"ableScale"]()});var h=new baidu.editor.ui.Popup({editor:b,content:"",className:"edui-bubble",_onEditButtonClick:function(){this.hide(),b.ui._dialogs.linkDialog.open()},_onImgEditButtonClick:function(a){this.hide(),b.ui._dialogs[a]&&b.ui._dialogs[a].open()},_onImgSetFloat:function(a){this.hide(),b.execCommand("imagefloat",a)},_setIframeAlign:function(a){var b=h.anchorEl,c=b.cloneNode(!0);switch(a){case-2:c.setAttribute("align","");break;case-1:c.setAttribute("align","left");break;case 1:c.setAttribute("align","right")}b.parentNode.insertBefore(c,b),e.remove(b),h.anchorEl=c,h.showAnchor(h.anchorEl)},_updateIframe:function(){var a=b._iframe=h.anchorEl;e.hasClass(a,"ueditor_baidumap")?(b.selection.getRange().selectNode(a).select(),b.ui._dialogs.mapDialog.open(),h.hide()):(b.ui._dialogs.insertframeDialog.open(),h.hide())},_onRemoveButtonClick:function(a){b.execCommand(a),this.hide()},queryAutoHide:function(a){return a&&a.ownerDocument==b.document&&("img"==a.tagName.toLowerCase()||e.findParentByTagName(a,"a",!0))?a!==h.anchorEl:baidu.editor.ui.Popup.prototype.queryAutoHide.call(this,a)}});h.render(),b.options.imagePopup&&(b.addListener("mouseover",function(a,c){c=c||window.event;var d=c.target||c.srcElement;if(b.ui._dialogs.insertframeDialog&&/iframe/gi.test(d.tagName)){var e=h.formatHtml(""+b.getLang("property")+': '+b.getLang("default")+'  '+b.getLang("justifyleft")+'  '+b.getLang("justifyright")+'   '+b.getLang("modify")+"");e?(h.getDom("content").innerHTML=e,h.anchorEl=d,h.showAnchor(h.anchorEl)):h.hide()}}),b.addListener("selectionchange",function(a,c){if(c){var d="",f="",g=b.selection.getRange().getClosedNode(),i=b.ui._dialogs;if(g&&"IMG"==g.tagName){var j="insertimageDialog";if(g.className.indexOf("edui-faked-video")==-1&&g.className.indexOf("edui-upload-video")==-1||(j="insertvideoDialog"),g.className.indexOf("edui-faked-webapp")!=-1&&(j="webappDialog"),g.src.indexOf("http://api.map.baidu.com")!=-1&&(j="mapDialog"),g.className.indexOf("edui-faked-music")!=-1&&(j="musicDialog"),g.src.indexOf("http://maps.google.com/maps/api/staticmap")!=-1&&(j="gmapDialog"),g.getAttribute("anchorname")&&(j="anchorDialog",d=h.formatHtml(""+b.getLang("property")+': '+b.getLang("modify")+"  "+b.getLang("delete")+"")),g.getAttribute("word_img")&&(b.word_img=[g.getAttribute("word_img")],j="wordimageDialog"),(e.hasClass(g,"loadingclass")||e.hasClass(g,"loaderrorclass"))&&(j=""),!i[j])return;f=""+b.getLang("property")+': '+b.getLang("default")+'  '+b.getLang("justifyleft")+'  '+b.getLang("justifyright")+'  '+b.getLang("justifycenter")+"  '+b.getLang("modify")+"",!d&&(d=h.formatHtml(f))}if(b.ui._dialogs.linkDialog){var k,l=b.queryCommandValue("link");if(l&&(k=l.getAttribute("_href")||l.getAttribute("href",2))){var m=k;k.length>30&&(m=k.substring(0,20)+"..."),d&&(d+='
      '),d+=h.formatHtml(""+b.getLang("anthorMsg")+': '+m+' '+b.getLang("modify")+' '+b.getLang("clear")+""),h.showAnchor(l)}}d?(h.getDom("content").innerHTML=d,h.anchorEl=g||l,h.showAnchor(h.anchorEl)):h.hide()}}))},_initToolbars:function(){for(var a=this.editor,c=this.toolbars||[],d=[],e=0;e
      '+(this.toolbars.length?'
      '+this.renderToolbarBoxHtml()+"
      ":"")+'
      '},showWordImageDialog:function(){this._dialogs.wordimageDialog.open()},renderToolbarBoxHtml:function(){for(var a=[],b=0;b'+c+"");b.innerHTML='
      '+this.editor.getLang("elementPathTip")+": "+d.join(" > ")+"
      "}else b.style.display="none"},disableElementPath:function(){var a=this.getDom("elementpath");a.innerHTML="",a.style.display="none",this.elementPathEnabled=!1},enableElementPath:function(){var a=this.getDom("elementpath");a.style.display="",this.elementPathEnabled=!0,this._updateElementPath()},_scale:function(){function a(){o=e.getXY(h),p||(p=g.options.minFrameHeight+j.offsetHeight+k.offsetHeight),m.style.cssText="position:absolute;left:0;display:;top:0;background-color:#41ABFF;opacity:0.4;filter: Alpha(opacity=40);width:"+h.offsetWidth+"px;height:"+h.offsetHeight+"px;z-index:"+(g.options.zIndex+1),e.on(f,"mousemove",b),e.on(i,"mouseup",c),e.on(f,"mouseup",c)}function b(a){d();var b=a||window.event;r=b.pageX||f.documentElement.scrollLeft+b.clientX,s=b.pageY||f.documentElement.scrollTop+b.clientY,t=r-o.x,u=s-o.y,t>=q&&(n=!0,m.style.width=t+"px"),u>=p&&(n=!0,m.style.height=u+"px")}function c(){n&&(n=!1,g.ui._actualFrameWidth=m.offsetWidth-2,h.style.width=g.ui._actualFrameWidth+"px",g.setHeight(m.offsetHeight-k.offsetHeight-j.offsetHeight-2,!0)),m&&(m.style.display="none"),d(),e.un(f,"mousemove",b),e.un(i,"mouseup",c),e.un(f,"mouseup",c)}function d(){browser.ie?f.selection.clear():window.getSelection().removeAllRanges()}var f=document,g=this.editor,h=g.container,i=g.document,j=this.getDom("toolbarbox"),k=this.getDom("bottombar"),l=this.getDom("scale"),m=this.getDom("scalelayer"),n=!1,o=null,p=0,q=g.options.minFrameWidth,r=0,s=0,t=0,u=0,v=this;this.editor.addListener("fullscreenchanged",function(a,b){if(b)v.disableScale();else if(v.editor.options.scaleEnabled){v.enableScale();var c=v.editor.document.createElement("span");v.editor.body.appendChild(c),v.editor.body.style.height=Math.max(e.getXY(c).y,v.editor.iframe.offsetHeight-20)+"px",e.remove(c)}}),this.enableScale=function(){1!=g.queryCommandState("source")&&(l.style.display="",this.scaleEnabled=!0,e.on(l,"mousedown",a))},this.disableScale=function(){l.style.display="none",this.scaleEnabled=!1,e.un(l,"mousedown",a)}},isFullScreen:function(){return this._fullscreen},postRender:function(){d.prototype.postRender.call(this);for(var a=0;a[\n\r\t]+([ ]{4})+/g,">").replace(/[\n\r\t]+([ ]{4})+[\n\r\t]+<"),c.className&&(b.className=c.className),c.style.cssText&&(b.style.cssText=c.style.cssText),/textarea/i.test(c.tagName)?(d.textarea=c,d.textarea.style.display="none"):c.parentNode.removeChild(c),c.id&&(b.id=c.id,e.removeAttributes(c,"id")),c=b,c.innerHTML=""}e.addClass(c,"edui-"+d.options.theme),d.ui.render(c);var h=d.options;d.container=d.ui.getDom();for(var i,j=e.findParents(c,!0),k=[],l=0;i=j[l];l++)k[l]=i.style.display,i.style.display="block";if(h.initialFrameWidth)h.minFrameWidth=h.initialFrameWidth;else{h.minFrameWidth=h.initialFrameWidth=c.offsetWidth;var m=c.style.width;/%$/.test(m)&&(h.initialFrameWidth=m)}h.initialFrameHeight?h.minFrameHeight=h.initialFrameHeight:h.initialFrameHeight=h.minFrameHeight=c.offsetHeight;for(var i,l=0;i=j[l];l++)i.style.display=k[l];c.style.height&&(c.style.height=""),d.container.style.width=h.initialFrameWidth+(/%$/.test(h.initialFrameWidth)?"":"px"),d.container.style.zIndex=h.zIndex,f.call(d,d.ui.getDom("iframeholder")),d.fireEvent("afteruiready")}d.langIsReady?b():d.addListener("langReady",b)})},d},UE.getEditor=function(a,b){var c=g[a];return c||(c=g[a]=new UE.ui.Editor(b),c.render(a)),c},UE.delEditor=function(a){var b;(b=g[a])&&(b.key&&b.destroy(),delete g[a])},UE.registerUI=function(a,c,d,e){b.each(a.split(/\s+/),function(a){UE._customizeUI[a]={id:e,execFn:c,index:d}})}}(),UE.registerUI("message",function(a){function b(){var a=g.ui.getDom("toolbarbox");a&&(c.style.top=a.offsetHeight+3+"px"),c.style.zIndex=Math.max(g.options.zIndex,g.iframe.style.zIndex)+1}var c,d=baidu.editor.ui,e=d.Message,f=[],g=a;g.addListener("ready",function(){c=document.getElementById(g.ui.id+"_message_holder"),b(),setTimeout(function(){b()},500)}),g.addListener("showmessage",function(a,d){d=utils.isString(d)?{content:d}:d;var h=new e({timeout:d.timeout,type:d.type,content:d.content,keepshow:d.keepshow,editor:g}),i=d.id||"msg_"+(+new Date).toString(36);return h.render(c),f[i]=h,h.reset(d),b(),i}),g.addListener("updatemessage",function(a,b,d){d=utils.isString(d)?{content:d}:d;var e=f[b];e.render(c),e&&e.reset(d)}),g.addListener("hidemessage",function(a,b){var c=f[b];c&&c.hide()})}),UE.registerUI("autosave",function(a){var b=null,c=null;a.on("afterautosave",function(){clearTimeout(b),b=setTimeout(function(){c&&a.trigger("hidemessage",c),c=a.trigger("showmessage",{content:a.getLang("autosave.success"),timeout:2e3})},2e3)})})}(); \ No newline at end of file diff --git a/admin/ueditor.config.js b/admin/ueditor.config.js new file mode 100644 index 0000000..ee61ac4 --- /dev/null +++ b/admin/ueditor.config.js @@ -0,0 +1,496 @@ +/** + * ueditor完整配置项 + * 可以在这里配置整个编辑器的特性 + */ +/**************************提示******************************** + * 所有被注释的配置项均为UEditor默认值。 + * 修改默认配置请首先确保已经完全明确该参数的真实用途。 + * 主要有两种修改方案,一种是取消此处注释,然后修改成对应参数;另一种是在实例化编辑器时传入对应参数。 + * 当升级编辑器时,可直接使用旧版配置文件替换新版配置文件,不用担心旧版配置文件中因缺少新功能所需的参数而导致脚本报错。 + **************************提示********************************/ + +(function () { + + /** + * 编辑器资源文件根路径。它所表示的含义是:以编辑器实例化页面为当前路径,指向编辑器资源文件(即dialog等文件夹)的路径。 + * 鉴于很多同学在使用编辑器的时候出现的种种路径问题,此处强烈建议大家使用"相对于网站根目录的相对路径"进行配置。 + * "相对于网站根目录的相对路径"也就是以斜杠开头的形如"/myProject/ueditor/"这样的路径。 + * 如果站点中有多个不在同一层级的页面需要实例化编辑器,且引用了同一UEditor的时候,此处的URL可能不适用于每个页面的编辑器。 + * 因此,UEditor提供了针对不同页面的编辑器可单独配置的根路径,具体来说,在需要实例化编辑器的页面最顶部写上如下代码即可。当然,需要令此处的URL等于对应的配置。 + * window.UEDITOR_HOME_URL = "/xxxx/xxxx/"; + */ + var URL = window.UEDITOR_HOME_URL || getUEBasePath(); + + /** + * 配置项主体。注意,此处所有涉及到路径的配置别遗漏URL变量。 + */ + window.UEDITOR_CONFIG = { + + //为编辑器实例添加一个路径,这个不能被注释 + UEDITOR_HOME_URL: URL + + // 服务器统一请求接口路径 + , serverUrl: URL + "php/controller.php" + + //工具栏上的所有的功能按钮和下拉框,可以在new编辑器的实例时选择自己需要的重新定义 + , toolbars: [[ + 'fullscreen', 'source', '|', 'undo', 'redo', '|', + 'bold', 'italic', 'underline', 'fontborder', 'strikethrough', 'superscript', 'subscript', 'removeformat', 'formatmatch', 'autotypeset', 'blockquote', 'pasteplain', '|', 'forecolor', 'backcolor', 'insertorderedlist', 'insertunorderedlist', 'selectall', 'cleardoc', '|', + 'rowspacingtop', 'rowspacingbottom', 'lineheight', '|', + 'customstyle', 'paragraph', 'fontfamily', 'fontsize', '|', + 'directionalityltr', 'directionalityrtl', 'indent', '|', + 'justifyleft', 'justifycenter', 'justifyright', 'justifyjustify', '|', 'touppercase', 'tolowercase', '|', + 'link', 'unlink', 'anchor', '|', 'imagenone', 'imageleft', 'imageright', 'imagecenter', '|', + 'simpleupload', 'insertimage', 'emotion', 'scrawl', 'insertvideo', 'music', 'attachment', 'map', 'gmap', 'insertframe', 'insertcode', 'webapp', 'pagebreak', 'template', 'background', '|', + 'horizontal', 'date', 'time', 'spechars', 'snapscreen', 'wordimage', '|', + 'inserttable', 'deletetable', 'insertparagraphbeforetable', 'insertrow', 'deleterow', 'insertcol', 'deletecol', 'mergecells', 'mergeright', 'mergedown', 'splittocells', 'splittorows', 'splittocols', 'charts', '|', + 'print', 'preview', 'searchreplace', 'drafts', 'help' + ]] + //当鼠标放在工具栏上时显示的tooltip提示,留空支持自动多语言配置,否则以配置值为准 + //,labelMap:{ + // 'anchor':'', 'undo':'' + //} + + //语言配置项,默认是zh-cn。有需要的话也可以使用如下这样的方式来自动多语言切换,当然,前提条件是lang文件夹下存在对应的语言文件: + //lang值也可以通过自动获取 (navigator.language||navigator.browserLanguage ||navigator.userLanguage).toLowerCase() + //,lang:"zh-cn" + //,langPath:URL +"lang/" + + //主题配置项,默认是default。有需要的话也可以使用如下这样的方式来自动多主题切换,当然,前提条件是themes文件夹下存在对应的主题文件: + //现有如下皮肤:default + //,theme:'default' + //,themePath:URL +"themes/" + + //,zIndex : 900 //编辑器层级的基数,默认是900 + + //针对getAllHtml方法,会在对应的head标签中增加该编码设置。 + //,charset:"utf-8" + + //若实例化编辑器的页面手动修改的domain,此处需要设置为true + //,customDomain:false + + //常用配置项目 + //,isShow : true //默认显示编辑器 + + //,textarea:'editorValue' // 提交表单时,服务器获取编辑器提交内容的所用的参数,多实例时可以给容器name属性,会将name给定的值最为每个实例的键值,不用每次实例化的时候都设置这个值 + + //,initialContent:'欢迎使用ueditor!' //初始化编辑器的内容,也可以通过textarea/script给值,看官网例子 + + //,autoClearinitialContent:true //是否自动清除编辑器初始内容,注意:如果focus属性设置为true,这个也为真,那么编辑器一上来就会触发导致初始化的内容看不到了 + + //,focus:false //初始化时,是否让编辑器获得焦点true或false + + //如果自定义,最好给p标签如下的行高,要不输入中文时,会有跳动感 + //,initialStyle:'p{line-height:1em}'//编辑器层级的基数,可以用来改变字体等 + + //,iframeCssUrl: URL + '/themes/iframe.css' //给编辑区域的iframe引入一个css文件 + + //indentValue + //首行缩进距离,默认是2em + //,indentValue:'2em' + + //,initialFrameWidth:1000 //初始化编辑器宽度,默认1000 + //,initialFrameHeight:320 //初始化编辑器高度,默认320 + + //,readonly : false //编辑器初始化结束后,编辑区域是否是只读的,默认是false + + //,autoClearEmptyNode : true //getContent时,是否删除空的inlineElement节点(包括嵌套的情况) + + //启用自动保存 + , enableAutoSave: true + //自动保存间隔时间, 单位ms + , saveInterval: 500 + + //,fullscreen : false //是否开启初始化时即全屏,默认关闭 + + //,imagePopup:true //图片操作的浮层开关,默认打开 + + //,autoSyncData:true //自动同步编辑器要提交的数据 + //,emotionLocalization:false //是否开启表情本地化,默认关闭。若要开启请确保emotion文件夹下包含官网提供的images表情文件夹 + + //粘贴只保留标签,去除标签所有属性 + //,retainOnlyLabelPasted: false + + //,pasteplain:false //是否默认为纯文本粘贴。false为不使用纯文本粘贴,true为使用纯文本粘贴 + //纯文本粘贴模式下的过滤规则 + //'filterTxtRules' : function(){ + // function transP(node){ + // node.tagName = 'p'; + // node.setStyle(); + // } + // return { + // //直接删除及其字节点内容 + // '-' : 'script style object iframe embed input select', + // 'p': {$:{}}, + // 'br':{$:{}}, + // 'div':{'$':{}}, + // 'li':{'$':{}}, + // 'caption':transP, + // 'th':transP, + // 'tr':transP, + // 'h1':transP,'h2':transP,'h3':transP,'h4':transP,'h5':transP,'h6':transP, + // 'td':function(node){ + // //没有内容的td直接删掉 + // var txt = !!node.innerText(); + // if(txt){ + // node.parentNode.insertAfter(UE.uNode.createText('    '),node); + // } + // node.parentNode.removeChild(node,node.innerText()) + // } + // } + //}() + + //,allHtmlEnabled:false //提交到后台的数据是否包含整个html字符串 + + //insertorderedlist + //有序列表的下拉配置,值留空时支持多语言自动识别,若配置值,则以此值为准 + //,'insertorderedlist':{ + // //自定的样式 + // 'num':'1,2,3...', + // 'num1':'1),2),3)...', + // 'num2':'(1),(2),(3)...', + // 'cn':'一,二,三....', + // 'cn1':'一),二),三)....', + // 'cn2':'(一),(二),(三)....', + // //系统自带 + // 'decimal' : '' , //'1,2,3...' + // 'lower-alpha' : '' , // 'a,b,c...' + // 'lower-roman' : '' , //'i,ii,iii...' + // 'upper-alpha' : '' , lang //'A,B,C' + // 'upper-roman' : '' //'I,II,III...' + //} + + //insertunorderedlist + //无序列表的下拉配置,值留空时支持多语言自动识别,若配置值,则以此值为准 + //,insertunorderedlist : { //自定的样式 + // 'dash' :'— 破折号', //-破折号 + // 'dot':' 。 小圆圈', //系统自带 + // 'circle' : '', // '○ 小圆圈' + // 'disc' : '', // '● 小圆点' + // 'square' : '' //'■ 小方块' + //} + //,listDefaultPaddingLeft : '30'//默认的左边缩进的基数倍 + //,listiconpath : 'http://bs.baidu.com/listicon/'//自定义标号的路径 + //,maxListLevel : 3 //限制可以tab的级数, 设置-1为不限制 + + //,autoTransWordToList:false //禁止word中粘贴进来的列表自动变成列表标签 + + //fontfamily + //字体设置 label留空支持多语言自动切换,若配置,则以配置值为准 + //,'fontfamily':[ + // { label:'',name:'songti',val:'宋体,SimSun'}, + // { label:'',name:'kaiti',val:'楷体,楷体_GB2312, SimKai'}, + // { label:'',name:'yahei',val:'微软雅黑,Microsoft YaHei'}, + // { label:'',name:'heiti',val:'黑体, SimHei'}, + // { label:'',name:'lishu',val:'隶书, SimLi'}, + // { label:'',name:'andaleMono',val:'andale mono'}, + // { label:'',name:'arial',val:'arial, helvetica,sans-serif'}, + // { label:'',name:'arialBlack',val:'arial black,avant garde'}, + // { label:'',name:'comicSansMs',val:'comic sans ms'}, + // { label:'',name:'impact',val:'impact,chicago'}, + // { label:'',name:'timesNewRoman',val:'times new roman'} + //] + + //fontsize + //字号 + //,'fontsize':[10, 11, 12, 14, 16, 18, 20, 24, 36] + + //paragraph + //段落格式 值留空时支持多语言自动识别,若配置,则以配置值为准 + //,'paragraph':{'p':'', 'h1':'', 'h2':'', 'h3':'', 'h4':'', 'h5':'', 'h6':''} + + //rowspacingtop + //段间距 值和显示的名字相同 + //,'rowspacingtop':['5', '10', '15', '20', '25'] + + //rowspacingBottom + //段间距 值和显示的名字相同 + //,'rowspacingbottom':['5', '10', '15', '20', '25'] + + //lineheight + //行内间距 值和显示的名字相同 + //,'lineheight':['1', '1.5','1.75','2', '3', '4', '5'] + + //customstyle + //自定义样式,不支持国际化,此处配置值即可最后显示值 + //block的元素是依据设置段落的逻辑设置的,inline的元素依据BIU的逻辑设置 + //尽量使用一些常用的标签 + //参数说明 + //tag 使用的标签名字 + //label 显示的名字也是用来标识不同类型的标识符,注意这个值每个要不同, + //style 添加的样式 + //每一个对象就是一个自定义的样式 + //,'customstyle':[ + // {tag:'h1', name:'tc', label:'', style:'border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;'}, + // {tag:'h1', name:'tl',label:'', style:'border-bottom:#ccc 2px solid;padding:0 4px 0 0;margin:0 0 10px 0;'}, + // {tag:'span',name:'im', label:'', style:'font-style:italic;font-weight:bold'}, + // {tag:'span',name:'hi', label:'', style:'font-style:italic;font-weight:bold;color:rgb(51, 153, 204)'} + //] + + //打开右键菜单功能 + //,enableContextMenu: true + //右键菜单的内容,可以参考plugins/contextmenu.js里边的默认菜单的例子,label留空支持国际化,否则以此配置为准 + //,contextMenu:[ + // { + // label:'', //显示的名称 + // cmdName:'selectall',//执行的command命令,当点击这个右键菜单时 + // //exec可选,有了exec就会在点击时执行这个function,优先级高于cmdName + // exec:function () { + // //this是当前编辑器的实例 + // //this.ui._dialogs['inserttableDialog'].open(); + // } + // } + //] + + //快捷菜单 + //,shortcutMenu:["fontfamily", "fontsize", "bold", "italic", "underline", "forecolor", "backcolor", "insertorderedlist", "insertunorderedlist"] + + //elementPathEnabled + //是否启用元素路径,默认是显示 + , elementPathEnabled: false + + //wordCount + //,wordCount:true //是否开启字数统计 + //,maximumWords:10000 //允许的最大字符数 + //字数统计提示,{#count}代表当前字数,{#leave}代表还可以输入多少字符数,留空支持多语言自动切换,否则按此配置显示 + //,wordCountMsg:'' //当前已输入 {#count} 个字符,您还可以输入{#leave} 个字符 + //超出字数限制提示 留空支持多语言自动切换,否则按此配置显示 + //,wordOverFlowMsg:'' //你输入的字符个数已经超出最大允许值,服务器可能会拒绝保存! + + //tab + //点击tab键时移动的距离,tabSize倍数,tabNode什么字符做为单位 + //,tabSize:4 + //,tabNode:' ' + + //removeFormat + //清除格式时可以删除的标签和属性 + //removeForamtTags标签 + //,removeFormatTags:'b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var' + //removeFormatAttributes属性 + //,removeFormatAttributes:'class,style,lang,width,height,align,hspace,valign' + + //undo + //可以最多回退的次数,默认20 + //,maxUndoCount:20 + //当输入的字符数超过该值时,保存一次现场 + //,maxInputCount:1 + + //autoHeightEnabled + // 是否自动长高,默认true + //,autoHeightEnabled:true + + //scaleEnabled + //是否可以拉伸长高,默认true(当开启时,自动长高失效) + //,scaleEnabled:false + //,minFrameWidth:800 //编辑器拖动时最小宽度,默认800 + //,minFrameHeight:220 //编辑器拖动时最小高度,默认220 + + //autoFloatEnabled + //是否保持toolbar的位置不动,默认true + //,autoFloatEnabled:true + //浮动时工具栏距离浏览器顶部的高度,用于某些具有固定头部的页面 + //,topOffset:30 + //编辑器底部距离工具栏高度(如果参数大于等于编辑器高度,则设置无效) + //,toolbarTopOffset:400 + + //设置远程图片是否抓取到本地保存 + //,catchRemoteImageEnable: true //设置是否抓取远程图片 + + //pageBreakTag + //分页标识符,默认是_ueditor_page_break_tag_ + //,pageBreakTag:'_ueditor_page_break_tag_' + + //autotypeset + //自动排版参数 + //,autotypeset: { + // mergeEmptyline: true, //合并空行 + // removeClass: true, //去掉冗余的class + // removeEmptyline: false, //去掉空行 + // textAlign:"left", //段落的排版方式,可以是 left,right,center,justify 去掉这个属性表示不执行排版 + // imageBlockLine: 'center', //图片的浮动方式,独占一行剧中,左右浮动,默认: center,left,right,none 去掉这个属性表示不执行排版 + // pasteFilter: false, //根据规则过滤没事粘贴进来的内容 + // clearFontSize: false, //去掉所有的内嵌字号,使用编辑器默认的字号 + // clearFontFamily: false, //去掉所有的内嵌字体,使用编辑器默认的字体 + // removeEmptyNode: false, // 去掉空节点 + // //可以去掉的标签 + // removeTagNames: {标签名字:1}, + // indent: false, // 行首缩进 + // indentValue : '2em', //行首缩进的大小 + // bdc2sb: false, + // tobdc: false + //} + + //tableDragable + //表格是否可以拖拽 + //,tableDragable: true + + + //sourceEditor + //源码的查看方式,codemirror 是代码高亮,textarea是文本框,默认是codemirror + //注意默认codemirror只能在ie8+和非ie中使用 + //,sourceEditor:"codemirror" + //如果sourceEditor是codemirror,还用配置一下两个参数 + //codeMirrorJsUrl js加载的路径,默认是 URL + "third-party/codemirror/codemirror.js" + //,codeMirrorJsUrl:URL + "third-party/codemirror/codemirror.js" + //codeMirrorCssUrl css加载的路径,默认是 URL + "third-party/codemirror/codemirror.css" + //,codeMirrorCssUrl:URL + "third-party/codemirror/codemirror.css" + //编辑器初始化完成后是否进入源码模式,默认为否。 + //,sourceEditorFirst:false + + //iframeUrlMap + //dialog内容的路径 ~会被替换成URL,垓属性一旦打开,将覆盖所有的dialog的默认路径 + //,iframeUrlMap:{ + // 'anchor':'~/dialogs/anchor/anchor.html', + //} + + //allowLinkProtocol 允许的链接地址,有这些前缀的链接地址不会自动添加http + //, allowLinkProtocols: ['http:', 'https:', '#', '/', 'ftp:', 'mailto:', 'tel:', 'git:', 'svn:'] + + //webAppKey 百度应用的APIkey,每个站长必须首先去百度官网注册一个key后方能正常使用app功能,注册介绍,http://app.baidu.com/static/cms/getapikey.html + //, webAppKey: "" + + //默认过滤规则相关配置项目 + //,disabledTableInTable:true //禁止表格嵌套 + //,allowDivTransToP:true //允许进入编辑器的div标签自动变成p标签 + //,rgb2Hex:true //默认产出的数据中的color自动从rgb格式变成16进制格式 + + // xss 过滤是否开启,inserthtml等操作 + , xssFilterRules: true + //input xss过滤 + , inputXssFilter: true + //output xss过滤 + , outputXssFilter: true + // xss过滤白名单 名单来源: https://raw.githubusercontent.com/leizongmin/js-xss/master/lib/default.js + , whitList: { + a: ['target', 'href', 'title', 'class', 'style'], + abbr: ['title', 'class', 'style'], + address: ['class', 'style'], + area: ['shape', 'coords', 'href', 'alt'], + article: [], + aside: [], + audio: ['autoplay', 'controls', 'loop', 'preload', 'src', 'class', 'style'], + b: ['class', 'style'], + bdi: ['dir'], + bdo: ['dir'], + big: [], + blockquote: ['cite', 'class', 'style'], + br: [], + caption: ['class', 'style'], + center: [], + cite: [], + code: ['class', 'style'], + col: ['align', 'valign', 'span', 'width', 'class', 'style'], + colgroup: ['align', 'valign', 'span', 'width', 'class', 'style'], + dd: ['class', 'style'], + del: ['datetime'], + details: ['open'], + div: ['class', 'style'], + dl: ['class', 'style'], + dt: ['class', 'style'], + em: ['class', 'style'], + font: ['color', 'size', 'face'], + footer: [], + h1: ['class', 'style'], + h2: ['class', 'style'], + h3: ['class', 'style'], + h4: ['class', 'style'], + h5: ['class', 'style'], + h6: ['class', 'style'], + header: [], + hr: [], + i: ['class', 'style'], + img: ['src', 'alt', 'title', 'width', 'height', 'id', '_src', 'loadingclass', 'class', 'data-latex'], + ins: ['datetime'], + li: ['class', 'style'], + mark: [], + nav: [], + ol: ['class', 'style'], + p: ['class', 'style'], + pre: ['class', 'style'], + s: [], + section: [], + small: [], + span: ['class', 'style'], + sub: ['class', 'style'], + sup: ['class', 'style'], + strong: ['class', 'style'], + table: ['width', 'border', 'align', 'valign', 'class', 'style'], + tbody: ['align', 'valign', 'class', 'style'], + td: ['width', 'rowspan', 'colspan', 'align', 'valign', 'class', 'style'], + tfoot: ['align', 'valign', 'class', 'style'], + th: ['width', 'rowspan', 'colspan', 'align', 'valign', 'class', 'style'], + thead: ['align', 'valign', 'class', 'style'], + tr: ['rowspan', 'align', 'valign', 'class', 'style'], + tt: [], + u: [], + ul: ['class', 'style'], + video: ['autoplay', 'controls', 'loop', 'preload', 'src', 'height', 'width', 'class', 'style'] + } + }; + + function getUEBasePath(docUrl, confUrl) { + + return getBasePath(docUrl || self.document.URL || self.location.href, confUrl || getConfigFilePath()); + + } + + function getConfigFilePath() { + + var configPath = document.getElementsByTagName('script'); + + return configPath[configPath.length - 1].src; + + } + + function getBasePath(docUrl, confUrl) { + + var basePath = confUrl; + + + if (/^(\/|\\\\)/.test(confUrl)) { + + basePath = /^.+?\w(\/|\\\\)/.exec(docUrl)[0] + confUrl.replace(/^(\/|\\\\)/, ''); + + } else if (!/^[a-z]+:/i.test(confUrl)) { + + docUrl = docUrl.split("#")[0].split("?")[0].replace(/[^\\\/]+$/, ''); + + basePath = docUrl + "" + confUrl; + + } + + return optimizationPath(basePath); + + } + + function optimizationPath(path) { + + var protocol = /^[a-z]+:\/\//.exec(path)[0], + tmp = null, + res = []; + + path = path.replace(protocol, "").split("?")[0].split("#")[0]; + + path = path.replace(/\\/g, '/').split(/\//); + + path[path.length - 1] = ""; + + while (path.length) { + + if ((tmp = path.shift()) === "..") { + res.pop(); + } else if (tmp !== ".") { + res.push(tmp); + } + + } + + return protocol + res.join("/"); + + } + + window.UE = { + getUEBasePath: getUEBasePath + }; + +})(); diff --git a/admin/ueditor.parse.js b/admin/ueditor.parse.js new file mode 100644 index 0000000..50d8391 --- /dev/null +++ b/admin/ueditor.parse.js @@ -0,0 +1,1034 @@ +/*! + * UEditor + * version: ueditor + * build: Wed Aug 10 2016 11:06:03 GMT+0800 (CST) + */ + +(function () { + + (function () { + UE = window.UE || {}; + var isIE = !!window.ActiveXObject; + //定义utils工具 + var utils = { + removeLastbs: function (url) { + return url.replace(/\/$/, '') + }, + extend: function (t, s) { + var a = arguments, + notCover = this.isBoolean(a[a.length - 1]) ? a[a.length - 1] : false, + len = this.isBoolean(a[a.length - 1]) ? a.length - 1 : a.length; + for (var i = 1; i < len; i++) { + var x = a[i]; + for (var k in x) { + if (!notCover || !t.hasOwnProperty(k)) { + t[k] = x[k]; + } + } + } + return t; + }, + isIE: isIE, + cssRule: isIE ? function (key, style, doc) { + var indexList, index; + doc = doc || document; + if (doc.indexList) { + indexList = doc.indexList; + } else { + indexList = doc.indexList = {}; + } + var sheetStyle; + if (!indexList[key]) { + if (style === undefined) { + return '' + } + sheetStyle = doc.createStyleSheet('', index = doc.styleSheets.length); + indexList[key] = index; + } else { + sheetStyle = doc.styleSheets[indexList[key]]; + } + if (style === undefined) { + return sheetStyle.cssText + } + sheetStyle.cssText = sheetStyle.cssText + '\n' + (style || '') + } : function (key, style, doc) { + doc = doc || document; + var head = doc.getElementsByTagName('head')[0], node; + if (!(node = doc.getElementById(key))) { + if (style === undefined) { + return '' + } + node = doc.createElement('style'); + node.id = key; + head.appendChild(node) + } + if (style === undefined) { + return node.innerHTML + } + if (style !== '') { + node.innerHTML = node.innerHTML + '\n' + style; + } else { + head.removeChild(node) + } + }, + domReady: function (onready) { + var doc = window.document; + if (doc.readyState === "complete") { + onready(); + } else { + if (isIE) { + (function () { + if (doc.isReady) return; + try { + doc.documentElement.doScroll("left"); + } catch (error) { + setTimeout(arguments.callee, 0); + return; + } + onready(); + })(); + window.attachEvent('onload', function () { + onready() + }); + } else { + doc.addEventListener("DOMContentLoaded", function () { + doc.removeEventListener("DOMContentLoaded", arguments.callee, false); + onready(); + }, false); + window.addEventListener('load', function () { + onready() + }, false); + } + } + + }, + each: function (obj, iterator, context) { + if (obj == null) return; + if (obj.length === +obj.length) { + for (var i = 0, l = obj.length; i < l; i++) { + if (iterator.call(context, obj[i], i, obj) === false) + return false; + } + } else { + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + if (iterator.call(context, obj[key], key, obj) === false) + return false; + } + } + } + }, + inArray: function (arr, item) { + var index = -1; + this.each(arr, function (v, i) { + if (v === item) { + index = i; + return false; + } + }); + return index; + }, + pushItem: function (arr, item) { + if (this.inArray(arr, item) == -1) { + arr.push(item) + } + }, + trim: function (str) { + return str.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, ''); + }, + indexOf: function (array, item, start) { + var index = -1; + start = this.isNumber(start) ? start : 0; + this.each(array, function (v, i) { + if (i >= start && v === item) { + index = i; + return false; + } + }); + return index; + }, + hasClass: function (element, className) { + className = className.replace(/(^[ ]+)|([ ]+$)/g, '').replace(/[ ]{2,}/g, ' ').split(' '); + for (var i = 0, ci, cls = element.className; ci = className[i++];) { + if (!new RegExp('\\b' + ci + '\\b', 'i').test(cls)) { + return false; + } + } + return i - 1 == className.length; + }, + addClass: function (elm, classNames) { + if (!elm) return; + classNames = this.trim(classNames).replace(/[ ]{2,}/g, ' ').split(' '); + for (var i = 0, ci, cls = elm.className; ci = classNames[i++];) { + if (!new RegExp('\\b' + ci + '\\b').test(cls)) { + cls += ' ' + ci; + } + } + elm.className = utils.trim(cls); + }, + removeClass: function (elm, classNames) { + classNames = this.isArray(classNames) ? classNames : + this.trim(classNames).replace(/[ ]{2,}/g, ' ').split(' '); + for (var i = 0, ci, cls = elm.className; ci = classNames[i++];) { + cls = cls.replace(new RegExp('\\b' + ci + '\\b'), '') + } + cls = this.trim(cls).replace(/[ ]{2,}/g, ' '); + elm.className = cls; + !cls && elm.removeAttribute('className'); + }, + on: function (element, type, handler) { + var types = this.isArray(type) ? type : type.split(/\s+/), + k = types.length; + if (k) while (k--) { + type = types[k]; + if (element.addEventListener) { + element.addEventListener(type, handler, false); + } else { + if (!handler._d) { + handler._d = { + els: [] + }; + } + var key = type + handler.toString(), index = utils.indexOf(handler._d.els, element); + if (!handler._d[key] || index == -1) { + if (index == -1) { + handler._d.els.push(element); + } + if (!handler._d[key]) { + handler._d[key] = function (evt) { + return handler.call(evt.srcElement, evt || window.event); + }; + } + + + element.attachEvent('on' + type, handler._d[key]); + } + } + } + element = null; + }, + off: function (element, type, handler) { + var types = this.isArray(type) ? type : type.split(/\s+/), + k = types.length; + if (k) while (k--) { + type = types[k]; + if (element.removeEventListener) { + element.removeEventListener(type, handler, false); + } else { + var key = type + handler.toString(); + try { + element.detachEvent('on' + type, handler._d ? handler._d[key] : handler); + } catch (e) { + } + if (handler._d && handler._d[key]) { + var index = utils.indexOf(handler._d.els, element); + if (index != -1) { + handler._d.els.splice(index, 1); + } + handler._d.els.length == 0 && delete handler._d[key]; + } + } + } + }, + loadFile: function () { + var tmpList = []; + + function getItem(doc, obj) { + try { + for (var i = 0, ci; ci = tmpList[i++];) { + if (ci.doc === doc && ci.url == (obj.src || obj.href)) { + return ci; + } + } + } catch (e) { + return null; + } + + } + + return function (doc, obj, fn) { + var item = getItem(doc, obj); + if (item) { + if (item.ready) { + fn && fn(); + } else { + item.funs.push(fn) + } + return; + } + tmpList.push({ + doc: doc, + url: obj.src || obj.href, + funs: [fn] + }); + if (!doc.body) { + var html = []; + for (var p in obj) { + if (p == 'tag') continue; + html.push(p + '="' + obj[p] + '"') + } + doc.write('<' + obj.tag + ' ' + html.join(' ') + ' >'); + return; + } + if (obj.id && doc.getElementById(obj.id)) { + return; + } + var element = doc.createElement(obj.tag); + delete obj.tag; + for (var p in obj) { + element.setAttribute(p, obj[p]); + } + element.onload = element.onreadystatechange = function () { + if (!this.readyState || /loaded|complete/.test(this.readyState)) { + item = getItem(doc, obj); + if (item.funs.length > 0) { + item.ready = 1; + for (var fi; fi = item.funs.pop();) { + fi(); + } + } + element.onload = element.onreadystatechange = null; + } + }; + element.onerror = function () { + throw Error('The load ' + (obj.href || obj.src) + ' fails,check the url') + }; + doc.getElementsByTagName("head")[0].appendChild(element); + } + }() + }; + utils.each(['String', 'Function', 'Array', 'Number', 'RegExp', 'Object', 'Boolean'], function (v) { + utils['is' + v] = function (obj) { + return Object.prototype.toString.apply(obj) == '[object ' + v + ']'; + } + }); + var parselist = {}; + UE.parse = { + register: function (parseName, fn) { + parselist[parseName] = fn; + }, + load: function (opt) { + utils.each(parselist, function (v) { + v.call(opt, utils); + }) + } + }; + uParse = function (selector, opt) { + utils.domReady(function () { + var contents; + if (document.querySelectorAll) { + contents = document.querySelectorAll(selector) + } else { + if (/^#/.test(selector)) { + contents = [document.getElementById(selector.replace(/^#/, ''))] + } else if (/^\./.test(selector)) { + var contents = []; + utils.each(document.getElementsByTagName('*'), function (node) { + if (node.className && new RegExp('\\b' + selector.replace(/^\./, '') + '\\b', 'i').test(node.className)) { + contents.push(node) + } + }) + } else { + contents = document.getElementsByTagName(selector) + } + } + utils.each(contents, function (v) { + UE.parse.load(utils.extend({root: v, selector: selector}, opt)) + }) + }) + } + })(); + + UE.parse.register('insertcode', function (utils) { + var pres = this.root.getElementsByTagName('pre'); + if (pres.length) { + if (typeof XRegExp == "undefined") { + var jsurl, cssurl; + if (this.rootPath !== undefined) { + jsurl = utils.removeLastbs(this.rootPath) + '/third-party/SyntaxHighlighter/shCore.js'; + cssurl = utils.removeLastbs(this.rootPath) + '/third-party/SyntaxHighlighter/shCoreDefault.css'; + } else { + jsurl = this.highlightJsUrl; + cssurl = this.highlightCssUrl; + } + utils.loadFile(document, { + id: "syntaxhighlighter_css", + tag: "link", + rel: "stylesheet", + type: "text/css", + href: cssurl + }); + utils.loadFile(document, { + id: "syntaxhighlighter_js", + src: jsurl, + tag: "script", + type: "text/javascript", + defer: "defer" + }, function () { + utils.each(pres, function (pi) { + if (pi && /brush/i.test(pi.className)) { + SyntaxHighlighter.highlight(pi); + } + }); + }); + } else { + utils.each(pres, function (pi) { + if (pi && /brush/i.test(pi.className)) { + SyntaxHighlighter.highlight(pi); + } + }); + } + } + + }); + UE.parse.register('table', function (utils) { + var me = this, + root = this.root, + tables = root.getElementsByTagName('table'); + if (tables.length) { + var selector = this.selector; + //追加默认的表格样式 + utils.cssRule('table', + selector + ' table.noBorderTable td,' + + selector + ' table.noBorderTable th,' + + selector + ' table.noBorderTable caption{border:1px dashed #ddd !important}' + + selector + ' table.sortEnabled tr.firstRow th,' + selector + ' table.sortEnabled tr.firstRow td{padding-right:20px; background-repeat: no-repeat;' + + 'background-position: center right; background-image:url(' + this.rootPath + 'themes/default/images/sortable.png);}' + + selector + ' table.sortEnabled tr.firstRow th:hover,' + selector + ' table.sortEnabled tr.firstRow td:hover{background-color: #EEE;}' + + selector + ' table{margin-bottom:10px;border-collapse:collapse;display:table;}' + + selector + ' td,' + selector + ' th{ background:white; padding: 5px 10px;border: 1px solid #DDD;}' + + selector + ' caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}' + + selector + ' th{border-top:1px solid #BBB;background:#F7F7F7;}' + + selector + ' table tr.firstRow th{border-top:2px solid #BBB;background:#F7F7F7;}' + + selector + ' tr.ue-table-interlace-color-single td{ background: #fcfcfc; }' + + selector + ' tr.ue-table-interlace-color-double td{ background: #f7faff; }' + + selector + ' td p{margin:0;padding:0;}', + document); + //填充空的单元格 + + utils.each('td th caption'.split(' '), function (tag) { + var cells = root.getElementsByTagName(tag); + cells.length && utils.each(cells, function (node) { + if (!node.firstChild) { + node.innerHTML = ' '; + + } + }) + }); + + //表格可排序 + var tables = root.getElementsByTagName('table'); + utils.each(tables, function (table) { + if (/\bsortEnabled\b/.test(table.className)) { + utils.on(table, 'click', function (e) { + var target = e.target || e.srcElement, + cell = findParentByTagName(target, ['td', 'th']); + var table = findParentByTagName(target, 'table'), + colIndex = utils.indexOf(table.rows[0].cells, cell), + sortType = table.getAttribute('data-sort-type'); + if (colIndex != -1) { + sortTable(table, colIndex, me.tableSortCompareFn || sortType); + updateTable(table); + } + }); + } + }); + + //按照标签名查找父节点 + function findParentByTagName(target, tagNames) { + var i, current = target; + tagNames = utils.isArray(tagNames) ? tagNames : [tagNames]; + while (current) { + for (i = 0; i < tagNames.length; i++) { + if (current.tagName == tagNames[i].toUpperCase()) return current; + } + current = current.parentNode; + } + return null; + } + + //表格排序 + function sortTable(table, sortByCellIndex, compareFn) { + var rows = table.rows, + trArray = [], + flag = rows[0].cells[0].tagName === "TH", + lastRowIndex = 0; + + for (var i = 0, len = rows.length; i < len; i++) { + trArray[i] = rows[i]; + } + + var Fn = { + 'reversecurrent': function (td1, td2) { + return 1; + }, + 'orderbyasc': function (td1, td2) { + var value1 = td1.innerText || td1.textContent, + value2 = td2.innerText || td2.textContent; + return value1.localeCompare(value2); + }, + 'reversebyasc': function (td1, td2) { + var value1 = td1.innerHTML, + value2 = td2.innerHTML; + return value2.localeCompare(value1); + }, + 'orderbynum': function (td1, td2) { + var value1 = td1[utils.isIE ? 'innerText' : 'textContent'].match(/\d+/), + value2 = td2[utils.isIE ? 'innerText' : 'textContent'].match(/\d+/); + if (value1) value1 = +value1[0]; + if (value2) value2 = +value2[0]; + return (value1 || 0) - (value2 || 0); + }, + 'reversebynum': function (td1, td2) { + var value1 = td1[utils.isIE ? 'innerText' : 'textContent'].match(/\d+/), + value2 = td2[utils.isIE ? 'innerText' : 'textContent'].match(/\d+/); + if (value1) value1 = +value1[0]; + if (value2) value2 = +value2[0]; + return (value2 || 0) - (value1 || 0); + } + }; + + //对表格设置排序的标记data-sort-type + table.setAttribute('data-sort-type', compareFn && typeof compareFn === "string" && Fn[compareFn] ? compareFn : ''); + + //th不参与排序 + flag && trArray.splice(0, 1); + trArray = sort(trArray, function (tr1, tr2) { + var result; + if (compareFn && typeof compareFn === "function") { + result = compareFn.call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]); + } else if (compareFn && typeof compareFn === "number") { + result = 1; + } else if (compareFn && typeof compareFn === "string" && Fn[compareFn]) { + result = Fn[compareFn].call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]); + } else { + result = Fn['orderbyasc'].call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]); + } + return result; + }); + var fragment = table.ownerDocument.createDocumentFragment(); + for (var j = 0, len = trArray.length; j < len; j++) { + fragment.appendChild(trArray[j]); + } + var tbody = table.getElementsByTagName("tbody")[0]; + if (!lastRowIndex) { + tbody.appendChild(fragment); + } else { + tbody.insertBefore(fragment, rows[lastRowIndex - range.endRowIndex + range.beginRowIndex - 1]) + } + } + + //冒泡排序 + function sort(array, compareFn) { + compareFn = compareFn || function (item1, item2) { + return item1.localeCompare(item2); + }; + for (var i = 0, len = array.length; i < len; i++) { + for (var j = i, length = array.length; j < length; j++) { + if (compareFn(array[i], array[j]) > 0) { + var t = array[i]; + array[i] = array[j]; + array[j] = t; + } + } + } + return array; + } + + //更新表格 + function updateTable(table) { + //给第一行设置firstRow的样式名称,在排序图标的样式上使用到 + if (!utils.hasClass(table.rows[0], "firstRow")) { + for (var i = 1; i < table.rows.length; i++) { + utils.removeClass(table.rows[i], "firstRow"); + } + utils.addClass(table.rows[0], "firstRow"); + } + } + } + }); + UE.parse.register('charts', function (utils) { + + utils.cssRule('chartsContainerHeight', '.edui-chart-container { height:' + (this.chartContainerHeight || 300) + 'px}'); + var resourceRoot = this.rootPath, + containers = this.root, + sources = null; + + //不存在指定的根路径, 则直接退出 + if (!resourceRoot) { + return; + } + + if (sources = parseSources()) { + + loadResources(); + + } + + + function parseSources() { + + if (!containers) { + return null; + } + + return extractChartData(containers); + + } + + /** + * 提取数据 + */ + function extractChartData(rootNode) { + + var data = [], + tables = rootNode.getElementsByTagName("table"); + + for (var i = 0, tableNode; tableNode = tables[i]; i++) { + + if (tableNode.getAttribute("data-chart") !== null) { + + data.push(formatData(tableNode)); + + } + + } + + return data.length ? data : null; + + } + + function formatData(tableNode) { + + var meta = tableNode.getAttribute("data-chart"), + metaConfig = {}, + data = []; + + //提取table数据 + for (var i = 0, row; row = tableNode.rows[i]; i++) { + + var rowData = []; + + for (var j = 0, cell; cell = row.cells[j]; j++) { + + var value = (cell.innerText || cell.textContent || ''); + rowData.push(cell.tagName == 'TH' ? value : (value | 0)); + + } + + data.push(rowData); + + } + + //解析元信息 + meta = meta.split(";"); + for (var i = 0, metaData; metaData = meta[i]; i++) { + + metaData = metaData.split(":"); + metaConfig[metaData[0]] = metaData[1]; + + } + + + return { + table: tableNode, + meta: metaConfig, + data: data + }; + + } + + //加载资源 + function loadResources() { + + loadJQuery(); + + } + + function loadJQuery() { + + //不存在jquery, 则加载jquery + if (!window.jQuery) { + + utils.loadFile(document, { + src: resourceRoot + "/third-party/jquery-1.10.2.min.js", + tag: "script", + type: "text/javascript", + defer: "defer" + }, function () { + + loadHighcharts(); + + }); + + } else { + + loadHighcharts(); + + } + + } + + function loadHighcharts() { + + //不存在Highcharts, 则加载Highcharts + if (!window.Highcharts) { + + utils.loadFile(document, { + src: resourceRoot + "/third-party/highcharts/highcharts.js", + tag: "script", + type: "text/javascript", + defer: "defer" + }, function () { + + loadTypeConfig(); + + }); + + } else { + + loadTypeConfig(); + + } + + } + + //加载图表差异化配置文件 + function loadTypeConfig() { + + utils.loadFile(document, { + src: resourceRoot + "/dialogs/charts/chart.config.js", + tag: "script", + type: "text/javascript", + defer: "defer" + }, function () { + + render(); + + }); + + } + + //渲染图表 + function render() { + + var config = null, + chartConfig = null, + container = null; + + for (var i = 0, len = sources.length; i < len; i++) { + + config = sources[i]; + + chartConfig = analysisConfig(config); + + container = createContainer(config.table); + + renderChart(container, typeConfig[config.meta.chartType], chartConfig); + + } + + + } + + /** + * 渲染图表 + * @param container 图表容器节点对象 + * @param typeConfig 图表类型配置 + * @param config 图表通用配置 + * */ + function renderChart(container, typeConfig, config) { + + + $(container).highcharts($.extend({}, typeConfig, { + + credits: { + enabled: false + }, + exporting: { + enabled: false + }, + title: { + text: config.title, + x: -20 //center + }, + subtitle: { + text: config.subTitle, + x: -20 + }, + xAxis: { + title: { + text: config.xTitle + }, + categories: config.categories + }, + yAxis: { + title: { + text: config.yTitle + }, + plotLines: [{ + value: 0, + width: 1, + color: '#808080' + }] + }, + tooltip: { + enabled: true, + valueSuffix: config.suffix + }, + legend: { + layout: 'vertical', + align: 'right', + verticalAlign: 'middle', + borderWidth: 1 + }, + series: config.series + + })); + + } + + /** + * 创建图表的容器 + * 新创建的容器会替换掉对应的table对象 + * */ + function createContainer(tableNode) { + + var container = document.createElement("div"); + container.className = "edui-chart-container"; + + tableNode.parentNode.replaceChild(container, tableNode); + + return container; + + } + + //根据config解析出正确的类别和图表数据信息 + function analysisConfig(config) { + + var series = [], + //数据类别 + categories = [], + result = [], + data = config.data, + meta = config.meta; + + //数据对齐方式为相反的方式, 需要反转数据 + if (meta.dataFormat != "1") { + + for (var i = 0, len = data.length; i < len; i++) { + + for (var j = 0, jlen = data[i].length; j < jlen; j++) { + + if (!result[j]) { + result[j] = []; + } + + result[j][i] = data[i][j]; + + } + + } + + data = result; + + } + + result = {}; + + //普通图表 + if (meta.chartType != typeConfig.length - 1) { + + categories = data[0].slice(1); + + for (var i = 1, curData; curData = data[i]; i++) { + series.push({ + name: curData[0], + data: curData.slice(1) + }); + } + + result.series = series; + result.categories = categories; + result.title = meta.title; + result.subTitle = meta.subTitle; + result.xTitle = meta.xTitle; + result.yTitle = meta.yTitle; + result.suffix = meta.suffix; + + } else { + + var curData = []; + + for (var i = 1, len = data[0].length; i < len; i++) { + + curData.push([data[0][i], data[1][i] | 0]); + + } + + //饼图 + series[0] = { + type: 'pie', + name: meta.tip, + data: curData + }; + + result.series = series; + result.title = meta.title; + result.suffix = meta.suffix; + + } + + return result; + + } + + }); + UE.parse.register('background', function (utils) { + var me = this, + root = me.root, + p = root.getElementsByTagName('p'), + styles; + + for (var i = 0, ci; ci = p[i++];) { + styles = ci.getAttribute('data-background'); + if (styles) { + ci.parentNode.removeChild(ci); + } + } + + //追加默认的表格样式 + styles && utils.cssRule('ueditor_background', me.selector + '{' + styles + '}', document); + }); + UE.parse.register('list', function (utils) { + var customCss = [], + customStyle = { + 'cn': 'cn-1-', + 'cn1': 'cn-2-', + 'cn2': 'cn-3-', + 'num': 'num-1-', + 'num1': 'num-2-', + 'num2': 'num-3-', + 'dash': 'dash', + 'dot': 'dot' + }; + + + utils.extend(this, { + liiconpath: 'http://bs.baidu.com/listicon/', + listDefaultPaddingLeft: '20' + }); + + var root = this.root, + ols = root.getElementsByTagName('ol'), + uls = root.getElementsByTagName('ul'), + selector = this.selector; + + if (ols.length) { + applyStyle.call(this, ols); + } + + if (uls.length) { + applyStyle.call(this, uls); + } + + if (ols.length || uls.length) { + customCss.push(selector + ' .list-paddingleft-1{padding-left:0}'); + customCss.push(selector + ' .list-paddingleft-2{padding-left:' + this.listDefaultPaddingLeft + 'px}'); + customCss.push(selector + ' .list-paddingleft-3{padding-left:' + this.listDefaultPaddingLeft * 2 + 'px}'); + + utils.cssRule('list', selector + ' ol,' + selector + ' ul{margin:0;padding:0;}li{clear:both;}' + customCss.join('\n'), document); + } + + function applyStyle(nodes) { + var T = this; + utils.each(nodes, function (list) { + if (list.className && /custom_/i.test(list.className)) { + var listStyle = list.className.match(/custom_(\w+)/)[1]; + if (listStyle == 'dash' || listStyle == 'dot') { + utils.pushItem(customCss, selector + ' li.list-' + customStyle[listStyle] + '{background-image:url(' + T.liiconpath + customStyle[listStyle] + '.gif)}'); + utils.pushItem(customCss, selector + ' ul.custom_' + listStyle + '{list-style:none;} ' + selector + ' ul.custom_' + listStyle + ' li{background-position:0 3px;background-repeat:no-repeat}'); + + } else { + var index = 1; + utils.each(list.childNodes, function (li) { + if (li.tagName == 'LI') { + utils.pushItem(customCss, selector + ' li.list-' + customStyle[listStyle] + index + '{background-image:url(' + T.liiconpath + 'list-' + customStyle[listStyle] + index + '.gif)}'); + index++; + } + }); + utils.pushItem(customCss, selector + ' ol.custom_' + listStyle + '{list-style:none;}' + selector + ' ol.custom_' + listStyle + ' li{background-position:0 3px;background-repeat:no-repeat}'); + } + switch (listStyle) { + case 'cn': + utils.pushItem(customCss, selector + ' li.list-' + listStyle + '-paddingleft-1{padding-left:25px}'); + utils.pushItem(customCss, selector + ' li.list-' + listStyle + '-paddingleft-2{padding-left:40px}'); + utils.pushItem(customCss, selector + ' li.list-' + listStyle + '-paddingleft-3{padding-left:55px}'); + break; + case 'cn1': + utils.pushItem(customCss, selector + ' li.list-' + listStyle + '-paddingleft-1{padding-left:30px}'); + utils.pushItem(customCss, selector + ' li.list-' + listStyle + '-paddingleft-2{padding-left:40px}'); + utils.pushItem(customCss, selector + ' li.list-' + listStyle + '-paddingleft-3{padding-left:55px}'); + break; + case 'cn2': + utils.pushItem(customCss, selector + ' li.list-' + listStyle + '-paddingleft-1{padding-left:40px}'); + utils.pushItem(customCss, selector + ' li.list-' + listStyle + '-paddingleft-2{padding-left:55px}'); + utils.pushItem(customCss, selector + ' li.list-' + listStyle + '-paddingleft-3{padding-left:68px}'); + break; + case 'num': + case 'num1': + utils.pushItem(customCss, selector + ' li.list-' + listStyle + '-paddingleft-1{padding-left:25px}'); + break; + case 'num2': + utils.pushItem(customCss, selector + ' li.list-' + listStyle + '-paddingleft-1{padding-left:35px}'); + utils.pushItem(customCss, selector + ' li.list-' + listStyle + '-paddingleft-2{padding-left:40px}'); + break; + case 'dash': + utils.pushItem(customCss, selector + ' li.list-' + listStyle + '-paddingleft{padding-left:35px}'); + break; + case 'dot': + utils.pushItem(customCss, selector + ' li.list-' + listStyle + '-paddingleft{padding-left:20px}'); + } + } + }); + } + + + }); + UE.parse.register('vedio', function (utils) { + var video = this.root.getElementsByTagName('video'), + audio = this.root.getElementsByTagName('audio'); + + document.createElement('video'); + document.createElement('audio'); + if (video.length || audio.length) { + var sourcePath = utils.removeLastbs(this.rootPath), + jsurl = sourcePath + '/third-party/video-js/video.js', + cssurl = sourcePath + '/third-party/video-js/video-js.min.css', + swfUrl = sourcePath + '/third-party/video-js/video-js.swf'; + + if (window.videojs) { + videojs.autoSetup(); + } else { + utils.loadFile(document, { + id: "video_css", + tag: "link", + rel: "stylesheet", + type: "text/css", + href: cssurl + }); + utils.loadFile(document, { + id: "video_js", + src: jsurl, + tag: "script", + type: "text/javascript" + }, function () { + videojs.options.flash.swf = swfUrl; + videojs.autoSetup(); + }); + } + + } + }); + +})(); diff --git a/admin/ueditor.parse.min.js b/admin/ueditor.parse.min.js new file mode 100644 index 0000000..af057a1 --- /dev/null +++ b/admin/ueditor.parse.min.js @@ -0,0 +1,7 @@ +/*! + * UEditor + * version: ueditor + * build: Wed Aug 10 2016 11:06:05 GMT+0800 (CST) + */ + +!function(){!function(){UE=window.UE||{};var a=!!window.ActiveXObject,b={removeLastbs:function(a){return a.replace(/\/$/,"")},extend:function(a,b){for(var c=arguments,d=!!this.isBoolean(c[c.length-1])&&c[c.length-1],e=this.isBoolean(c[c.length-1])?c.length-1:c.length,f=1;f=c&&a===b)return d=e,!1}),d},hasClass:function(a,b){b=b.replace(/(^[ ]+)|([ ]+$)/g,"").replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)if(!new RegExp("\\b"+c+"\\b","i").test(e))return!1;return d-1==b.length},addClass:function(a,c){if(a){c=this.trim(c).replace(/[ ]{2,}/g," ").split(" ");for(var d,e=0,f=a.className;d=c[e++];)new RegExp("\\b"+d+"\\b").test(f)||(f+=" "+d);a.className=b.trim(f)}},removeClass:function(a,b){b=this.isArray(b)?b:this.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)e=e.replace(new RegExp("\\b"+c+"\\b"),"");e=this.trim(e).replace(/[ ]{2,}/g," "),a.className=e,!e&&a.removeAttribute("className")},on:function(a,c,d){var e=this.isArray(c)?c:c.split(/\s+/),f=e.length;if(f)for(;f--;)if(c=e[f],a.addEventListener)a.addEventListener(c,d,!1);else{d._d||(d._d={els:[]});var g=c+d.toString(),h=b.indexOf(d._d.els,a);d._d[g]&&h!=-1||(h==-1&&d._d.els.push(a),d._d[g]||(d._d[g]=function(a){return d.call(a.srcElement,a||window.event)}),a.attachEvent("on"+c,d._d[g]))}a=null},off:function(a,c,d){var e=this.isArray(c)?c:c.split(/\s+/),f=e.length;if(f)for(;f--;)if(c=e[f],a.removeEventListener)a.removeEventListener(c,d,!1);else{var g=c+d.toString();try{a.detachEvent("on"+c,d._d?d._d[g]:d)}catch(h){}if(d._d&&d._d[g]){var i=b.indexOf(d._d.els,a);i!=-1&&d._d.els.splice(i,1),0==d._d.els.length&&delete d._d[g]}}},loadFile:function(){function a(a,c){try{for(var d,e=0;d=b[e++];)if(d.doc===a&&d.url==(c.src||c.href))return d}catch(f){return null}}var b=[];return function(c,d,e){var f=a(c,d);if(f)return void(f.ready?e&&e():f.funs.push(e));if(b.push({doc:c,url:d.src||d.href,funs:[e]}),!c.body){var g=[];for(var h in d)"tag"!=h&&g.push(h+'="'+d[h]+'"');return void c.write("<"+d.tag+" "+g.join(" ")+" >")}if(!d.id||!c.getElementById(d.id)){var i=c.createElement(d.tag);delete d.tag;for(var h in d)i.setAttribute(h,d[h]);i.onload=i.onreadystatechange=function(){if(!this.readyState||/loaded|complete/.test(this.readyState)){if(f=a(c,d),f.funs.length>0){f.ready=1;for(var b;b=f.funs.pop();)b()}i.onload=i.onreadystatechange=null}},i.onerror=function(){throw Error("The load "+(d.href||d.src)+" fails,check the url")},c.getElementsByTagName("head")[0].appendChild(i)}}}()};b.each(["String","Function","Array","Number","RegExp","Object","Boolean"],function(a){b["is"+a]=function(b){return Object.prototype.toString.apply(b)=="[object "+a+"]"}});var c={};UE.parse={register:function(a,b){c[a]=b},load:function(a){b.each(c,function(c){c.call(a,b)})}},uParse=function(a,c){b.domReady(function(){var d;if(document.querySelectorAll)d=document.querySelectorAll(a);else if(/^#/.test(a))d=[document.getElementById(a.replace(/^#/,""))];else if(/^\./.test(a)){var d=[];b.each(document.getElementsByTagName("*"),function(b){b.className&&new RegExp("\\b"+a.replace(/^\./,"")+"\\b","i").test(b.className)&&d.push(b)})}else d=document.getElementsByTagName(a);b.each(d,function(d){UE.parse.load(b.extend({root:d,selector:a},c))})})}}(),UE.parse.register("insertcode",function(a){var b=this.root.getElementsByTagName("pre");if(b.length)if("undefined"==typeof XRegExp){var c,d;void 0!==this.rootPath?(c=a.removeLastbs(this.rootPath)+"/third-party/SyntaxHighlighter/shCore.js",d=a.removeLastbs(this.rootPath)+"/third-party/SyntaxHighlighter/shCoreDefault.css"):(c=this.highlightJsUrl,d=this.highlightCssUrl),a.loadFile(document,{id:"syntaxhighlighter_css",tag:"link",rel:"stylesheet",type:"text/css",href:d}),a.loadFile(document,{id:"syntaxhighlighter_js",src:c,tag:"script",type:"text/javascript",defer:"defer"},function(){a.each(b,function(a){a&&/brush/i.test(a.className)&&SyntaxHighlighter.highlight(a)})})}else a.each(b,function(a){a&&/brush/i.test(a.className)&&SyntaxHighlighter.highlight(a)})}),UE.parse.register("table",function(a){function b(b,c){var d,e=b;for(c=a.isArray(c)?c:[c];e;){for(d=0;d0){var g=a[c];a[c]=a[e],a[e]=g}return a}function e(b){if(!a.hasClass(b.rows[0],"firstRow")){for(var c=1;c + + + + + + + 欢迎页 + + + + + + +
      +
      +
      +
      + +
      +
      +

      loading

      +

      应用数量

      +
      +
      +
      +
      +
      +
      + +
      +
      +

      loading

      +

      系统版本

      +
      +
      +
      +
      +
      +
      + +
      +
      +

      loading

      +

      充值卡密

      +
      +
      +
      +
      +
      +
      + +
      +
      +

      loading

      +

      套餐卡密

      +
      +
      +
      +
      +
      +
      + +
      +
      +

      loading

      +

      代理数量

      +
      +
      +
      +
      +
      +
      + +
      +
      +

      loading

      +

      订单数量

      +
      +
      +
      + +
      +
      +
      +

      来自温泉授权服务器的系统公告

      +
      + +
      +
      +
      +
      +
      +
      +
      +

      检查系统更新

      +
      + +
      +
      +
      +
      +
      +
      +
      +

      系统更新日志

      +
      + +
      +
      +
      +
      +
      + + + + + + + \ No newline at end of file diff --git a/agent/agent.html b/agent/agent.html new file mode 100644 index 0000000..0e498c1 --- /dev/null +++ b/agent/agent.html @@ -0,0 +1,167 @@ + + + + + + + + 代理后台中心 + + + + + + +
      +
      + + + +
      + +
      + + +
      + + + +
      +
      +
        +
      • 欢迎页
      • +
      +
      +
      + +
      +
      +
      +
      + + +
      + +
      + + + + + + + + + + +
      ဂ刷新当前标签
      ဆ关闭当前标签
      ဆ关闭所有标签
      +
      + + + + + + \ No newline at end of file diff --git a/agent/ajax.php b/agent/ajax.php new file mode 100644 index 0000000..6eea203 --- /dev/null +++ b/agent/ajax.php @@ -0,0 +1,1231 @@ +select_first_row('sq_agent', '*', array('accesstoken' => $_POST['accesstoken']), 'AND')) { + die(json_encode(array('code' => '-1', 'msg' => '秘钥错误'))); + } else { + $_SESSION['agent_username'] = $_POST['username']; + $_SESSION['agent_password'] = $_POST['password']; + $_SESSION['agent_id'] = $result['ID']; + $_SESSION['agent_qq'] = $result['qq']; + $_SESSION['agent_HTTP_USER_AGENT'] = $_SERVER['HTTP_USER_AGENT']; + $db->update('sq_agent', array('username' => $_SESSION['agent_username']), 'AND', array('loginip' => get_real_ip(), 'logintime' => time())); + die(json_encode(array('code' => '1', 'msg' => '登陆成功'))); + } + } + + + include '../function/VerificationCode.class.php'; + $verification = Verification::check($_POST['token']); + if ($verification !== true) { + die(json_encode(array('code' => '-88', 'msg' => '请先进行人机验证'))); + } + if (empty($_POST['username'])) { + die(json_encode(array('code' => -1, 'msg' => '请输入您的用户名'))); + } + if (empty($_POST['password'])) { + die(json_encode(array('code' => -2, 'msg' => '请输入您的密码'))); + } + + if (!$result = $db->select_first_row('sq_agent', '*', array('username' => $_POST['username'], 'password' => $_POST['password']), 'AND')) { + die(json_encode(array('code' => -3, 'msg' => '输入的账号密码错误!' . $db->geterror()))); + } else { + if ($result['status'] != '1') { + die(json_encode(array('code' => -4, 'msg' => '代理账号已被冻结,请联系管理员或者上级处理'))); + } + $_SESSION['agent_username'] = $_POST['username']; + $_SESSION['agent_password'] = $_POST['password']; + $_SESSION['agent_id'] = $result['ID']; + $_SESSION['agent_qq'] = $result['qq']; + $_SESSION['agent_HTTP_USER_AGENT'] = $_SERVER['HTTP_USER_AGENT']; + $db->update('sq_agent', array('username' => $_SESSION['agent_username']), 'AND', array('loginip' => get_real_ip(), 'logintime' => time())); + die(json_encode(array('code' => '1', 'msg' => '登陆成功,正在跳转!'))); + } + + +} else if ($_GET['mod'] === 'checklogin') { + + if (empty($_SESSION['agent_username']) || empty($_SESSION['agent_password'])) { + die(json_encode(array('code' => -1))); + } + if (!$result = $db->select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username'], 'password' => $_SESSION['agent_password']), 'AND')) { + die(json_encode(array('code' => -2))); + } + if ($_SERVER['HTTP_USER_AGENT'] !== $_SESSION['agent_HTTP_USER_AGENT']) { + die(json_encode(array('code' => -3))); + } + die(json_encode(array('code' => 1, 'username' => $_SESSION['agent_username'], 'qq' => $_SESSION['agent_qq']))); +} else { + if (empty($_SESSION['agent_username']) || empty($_SESSION['agent_password']) || empty($_SESSION['agent_id'])) { + echo '没有登录:code:-1'; + header('Location: login.html'); + die(); + } + if (!$result = $db->select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username'], 'password' => $_SESSION['agent_password']), 'AND')) { + echo '没有登录:code:-2'; + header('Location: login.html'); + + die(); + } + if ($_SERVER['HTTP_USER_AGENT'] !== $_SESSION['agent_HTTP_USER_AGENT']) { + echo '没有登录:code:-3'; + header('Location: login.html'); + die(); + } +} +switch ($_GET['mod']) { + case 'getnotice': + die($G['config']['agentnotice']); + break; + case 'getsysinfo': + if (!$agentinfo = $db->select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username']), 'AND')) { + die(json_encode(array('code' => -2, 'msg' => '代理信息获取失败'))); + } + if (!$levelinfo = $db->select_first_row('sq_level', '*', array('ID' => $agentinfo['levelid']), 'AND')) { + die(json_encode(array('code' => -2, 'msg' => '代理等级信息获取失败!'))); + } + $backinfo = array(); + $backinfo['level'] = $levelinfo['lname']; + $backinfo['allspend'] = $agentinfo['allspend']; + $backinfo['allrecharge'] = $agentinfo['allrecharge']; + $backinfo['usernum'] = $db->select_count_row('sq_user', array('aid' => $_SESSION['agent_id'])); + $backinfo['money'] = $agentinfo['money']; + $backinfo['subordinate'] = $db->select_count_row('sq_agent', array('superior' => $_SESSION['agent_id'])); + die(json_encode($backinfo)); + break; + case 'buy_applist': + if (!$agentinfo = $db->select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username']), 'AND')) { + die(json_encode(array('code' => -2, 'msg' => '代理信息获取失败'))); + } + if (!$levelinfo = $db->select_first_row('sq_level', '*', array('ID' => $agentinfo['levelid']), 'AND')) { + die(json_encode(array('code' => -2, 'msg' => '代理等级信息获取失败!'))); + } + include '../function/function_app.php'; + $where = array(); + $i = ''; + $info = explode(',', $levelinfo['appid']); + foreach ($info as $aid) { + $i .= ''; + } + /* if ($levelinfo['appid']!=0){ + $where['ID'] = $levelinfo['appid']; + }else{ + $i .= ''; + } + $back = $db->select_all_row('sq_apps','ID,appname',$where,'AND'); + if (count($back) === 0){ + die(); + } + foreach ($back as $value){ + $i .= ''; + }*/ + die($i); + break; + case 'buy_fidlist': + include '../function/function_app.php'; + + //$where['agentbuy'] = '1'; + if (!$agentinfo = $db->select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username']), 'AND')) { + die(json_encode(array('code' => -2, 'msg' => '代理信息获取失败'))); + } + if (!$levelinfo = $db->select_first_row('sq_level', '*', array('ID' => $agentinfo['levelid']), 'AND')) { + die(json_encode(array('code' => -3, 'msg' => '代理等级信息获取失败!'))); + } + + $applist = explode(',', $levelinfo['appid']); + + + $backinfo = array(); + $backinfo['code'] = 0; + if (!empty($_GET['appid']) && $_GET['appid'] != '0') { + if (!in_array($_GET['appid'], $applist)) { + die(json_encode(array('code' => -4, 'msg' => '您没有权限查看此应用的商品列表!'))); + } + + $where = array(); + $where['appid'] = $_GET['appid']; + $where['agentbuy'] = '1'; + $backinfo['count'] = $db->select_count_row('sq_fidlist', $where, 'AND'); + if (!$result = $db->select_limit_row('sq_fidlist', '*', ($_GET['page'] - 1) * $_GET['limit'], $_GET['limit'], $where, 'AND')) { + $erro = $db->geterror(); + if (!empty($erro)) { + die(json_encode(array('code' => -1, 'msg' => $erro))); + } + + die(json_encode($backinfo)); + } + } else { + $sqlwhere = ''; + foreach ($applist as $aid) { + if (empty($sqlwhere)) { + $sqlwhere = 'appid=' . $aid; + } else { + $sqlwhere .= ' OR appid=' . $aid; + } + } + $where = 'agentbuy=1 AND (' . $sqlwhere . ')'; + $backinfo['count'] = $db->select_count_row('sq_fidlist', $where, 'AND'); + if (!$result = $db->select_limit_row('sq_fidlist', '*', ($_GET['page'] - 1) * $_GET['limit'], $_GET['limit'], $where, 'AND')) { + $erro = $db->geterror(); + if (!empty($erro)) { + die(json_encode(array('code' => -1, 'msg' => $erro))); + } + die(json_encode($backinfo)); + } + } + + + $backinfo['data'] = array(); + foreach ($result as $item) { + $linshi = array(); + $linshi['id'] = $item['ID']; + $appinfo = app_idgetinfo($item['appid']); + $linshi['fidname'] = $item['fidname']; + $linshi['appname'] = app_idgetname($item['appid']); + if ($item['num'] != '-1') { + if ($appinfo['usetype'] === 'dqsj') { + $numtip = time_last($item['num'] * 60); + } else { + $numtip = $item['num'] . '点'; + } + } else { + if ($appinfo['usetype'] === 'dqsj') { + $numtip = '无期授权'; + } else { + $numtip = '无限使用'; + } + } + $linshi['sqnum'] = $numtip; + $linshi['agentprice'] = $item['agentprice']; + $backinfo['data'][] = $linshi; + } + die(json_encode($backinfo)); + break; + case 'getuserlist': + if (empty($_GET['appid'])) { + die(json_encode(array('code' => '-2', 'msg' => '请先选择一个应用(如果应用过多,可点击上方下拉选择框后,输入关键词可快速查找应用)'))); + } + //$where['appid'] = $_GET['appid']; + if (!empty($_GET['search'])) { + $where['username'] = $where['password'] = $where['mac'] = $where['rip'] = $where['lip'] = $where['uqq'] = $where['mail'] = $where['balance'] = $where['rqq'] = $_GET['search']; + //$where['uqq'] = intval($where['uqq']) + if (!is_numeric($where['uqq'])) { + unset($where['uqq']); + } + if (!is_numeric($where['rqq'])) { + unset($where['rqq']); + } + if (!is_numeric($where['balance'])) { + unset($where['balance']); + } + //echo '11111'; + $whereinfo = 'appid=' . intval($_GET['appid']) . ' AND aid=' . $_SESSION['agent_id'] . ' AND (' . $db->wheretosql($where, 'OR') . ')'; + } else { + //echo '2222'; + $whereinfo = 'appid=' . intval($_GET['appid']) . ' AND aid=' . $_SESSION['agent_id']; + } + //echo $whereinfo; + $backinfo['code'] = 0; + $backinfo['count'] = $db->select_count_row('sq_user', $whereinfo, 'AND'); + include "../function/function_app.php"; + $appinfo = app_idgetinfo($_GET['appid']); + if (!$arr = $db->select_limit_row('sq_user', '*', ($_GET['page'] - 1) * $_GET['limit'], $_GET['limit'], $whereinfo, 'AND')) { + //$backinfo['code'] = -1; + $backinfo['msg'] = $db->geterror(); + die(json_encode($backinfo)); + } + + $backinfo['msg'] = ''; + + foreach ($arr as $value) { + $newinfo = array(); + $newinfo['id'] = $value['ID']; + $newinfo['username'] = $value['username']; + $newinfo['password'] = $value['password']; + $newinfo['mac'] = $value['mac']; + $newinfo['lip'] = $value['lip']; + $newinfo['rip'] = $value['rip']; + $newinfo['uqq'] = $value['uqq']; + $newinfo['mail'] = $value['mail']; + $newinfo['rtime'] = Get_Date($value['rtime']); + $newinfo['ltime'] = Get_Date($value['ltime']); + if ($appinfo['usetype'] === 'dqsj') { + if (!empty($value['balance'])) { + if ($value['balance'] == '-1') { + $value['balance'] = '永久使用'; + } + $value['balance'] = Get_Date($value['balance']); + } else { + $value['balance'] = '-'; + } + } + $newinfo['balance'] = $value['balance']; + $newinfo['rqq'] = htmlspecialchars($value['rqq']); + if ((time() - $value['htime']) < $appinfo['onlinesecond']) { + $online = '在线'; + } else { + $online = '离线'; + } + $newinfo['login'] = $online; + $newinfo['status'] = ''; + + $backinfo['data'][] = $newinfo; + } + + //print_r($backinfo); + die(json_encode($backinfo)); + + break; + case 'changeuser': + if (empty($_POST['mod'])) { + die('模块标识不能为空'); + } + if (empty($_POST['userid'])) { + die('用户ID不能为空'); + } + + if (!in_array($_POST['mod'], array('username', 'password', 'mac', 'rip', 'lip', 'uqq', 'mail', 'rqq', 'status'))) die('不支持修改的字段'); + if ($_POST['mod'] == 'status') { + $_POST['value'] = textbooltonum($_POST['value']); + } + if ($_POST['mod'] == 'balance') { + if ($_POST['value'] == '永久使用') { + $_POST['value'] = -1; + } else { + $value = strtotime($_POST['value']); + if (!empty($value)) { + $_POST['value'] = $value; + } + } + + } + + + if (!$db->update('sq_user', array('ID' => $_POST['userid'], 'aid' => $_SESSION['agent_id']), 'AND', array($_POST['mod'] => $_POST['value']))) { + die('修改失败' . $db->geterror()); + } else { + $db->insert_back_id('sq_log_agent', array('time' => time(), 'aid' => $_SESSION['agent_id'], 'ip' => get_real_ip(), 'msg' => '更改用户ID ' . $_POST['userid'] . ' 的 ' . $_POST['mod'] . ' 值为 ' . $_POST['value'])); + + die('修改成功!'); + } + break; + case 'deluser': + if (empty($_POST['userid'])) { + die('用户ID不能为空'); + } + $userinfo = $db->select_first_row('sq_user', '*', array('ID' => $_POST['userid']), 'AND'); + if (!$db->delete('sq_user', array('ID' => $_POST['userid'], 'aid' => $_SESSION['agent_id']), 'AND')) { + die('删除失败' . $db->geterror()); + } else { + $db->insert_back_id('sq_log_agent', array('time' => time(), 'aid' => $_SESSION['agent_id'], 'ip' => get_real_ip(), 'msg' => '删除用户 ' . json_encode($userinfo))); + + die('删除成功!'); + } + + case 'buy_first': + + include "../function/function_app.php"; + $fidinfo = $db->select_first_row('sq_fidlist', '*', array('ID' => $_GET['fid']), 'AND'); + $appinfo = app_idgetinfo($fidinfo['appid']); + $show_form = ''; + + if ($appinfo['logintype'] == 'zhmm') { + $show_form .= ' +
      + +
      + +
      +
      +
      + +
      + +
      +
      + '; + $type = 1; + } else if ($appinfo['logintype'] == 'kmsq') { + $show_form .= ' +
      + +
      + +
      +
      '; + $type = 2; + } else if ($appinfo['logintype'] == 'jcbd') { + if ($appinfo['bindqq'] == '1') { + $show_form .= ' +
      + +
      + +
      +
      + '; + } + if ($appinfo['bindmac'] == '1') { + $show_form .= '
      + +
      + +
      +
      + '; + } + if ($appinfo['bindip'] == '1') { + $show_form .= '
      + +
      + +
      +
      + '; + } + $type = 3; + } + include './html/buy.page.inc.php'; + die(); + break; + case 'buy_submit': + include '../function/function_app.php'; + + if (!$fidinfo = $db->select_first_row('sq_fidlist', '*', array('ID' => $_POST['id']), 'AND')) { + die(json_encode(array('code' => -2, 'msg' => '无法找到该商品,请刷新页面重试'))); + } + if (!$appinfo = app_idgetinfo($fidinfo['appid'])) { + die(json_encode(array('code' => -2, 'msg' => '无法找到应用,也许是该应用已下架'))); + } + if (!$agentinfo = $db->select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username']), 'AND')) { + die(json_encode(array('code' => -2, 'msg' => '代理信息获取失败'))); + } + $time = time(); + $tradno = $time . rand_str(10, 'num'); + $tips = '交易订单号:' . $tradno . '
      '; + if (!$levelinfo = $db->select_first_row('sq_level', '*', array('ID' => $agentinfo['levelid']), 'AND')) { + die(json_encode(array('code' => -2, 'msg' => '代理对应的等级信息获取失败!'))); + } + $spendmoney = $fidinfo['agentprice'] * $_POST['kt_num'] * $levelinfo['fracture']; + $tips .= '应付金额:' . $spendmoney . '
      '; + if ($spendmoney < 0) { + die(json_encode(array('code' => -7, 'msg' => '错误的支付金额:' . $spendmoney))); + } + + if ($appinfo['logintype'] == 'zhmm') { + if (!$userinfo = $db->select_first_row('sq_user', '*', array('username' => $_POST['kt_user'], 'appid' => $fidinfo['appid']), 'AND')) { + $tips .= '该用户名尚未注册!
      '; + } else { + $tips .= '当前用户名已注册!
      '; + } + $tips .= '用户名:' . $_POST['kt_user'] . '
      '; + $newtrade = array('name' => $fidinfo['fidname'], + 'tradeno' => $tradno, + 'begintime' => $time, + 'user' => $_POST['kt_user'], + 'pass' => $_POST['kt_pass'], + 'fid' => $_POST['id'], + 'num' => $_POST['kt_num'], + 'paymoney' => $spendmoney, + 'mail' => $_POST['kt_mail'], + 'paytype' => $_POST['zffs'], + 'onlinepaytype' => $_POST['zxzffs'], + 'kami' => $_POST['kt_key'], + 'uqq' => $_POST['kt_adminqq'], + 'ip' => get_real_ip(), + 'status' => '1', + 'type' => 2, + 'agentid' => $agentinfo['ID'] + ); + } else if ($appinfo['logintype'] == 'kmsq') { + //卡密方式 + if (empty($_POST['kt_user']) || !$userinfo = $db->select_first_row('sq_user', '*', array('username' => $_POST['kt_user'], 'appid' => $fidinfo['appid']), 'AND')) { + $userkey = $userinfo['username']; + $tips .= '开通方式:新开卡密
      '; + } else { + $userkey = ''; + $tips .= '开通方式:续费卡密(' . $_POST['kt_user'] . ')
      '; + } + $newtrade = array('name' => $fidinfo['fidname'], + 'tradeno' => $tradno, + 'begintime' => $time, + 'user' => $_POST['kt_user'], + 'fid' => $_POST['id'], + 'num' => $_POST['kt_num'], + 'paymoney' => $spendmoney, + 'mail' => $_POST['kt_mail'], + 'paytype' => $_POST['zffs'], + 'onlinepaytype' => $_POST['zxzffs'], + 'kami' => $_POST['kt_key'], + 'uqq' => $_POST['kt_adminqq'], + 'ip' => get_real_ip(), + 'status' => '1', + 'type' => 2, + 'agentid' => $agentinfo['ID'] + ); + + } else if ($appinfo['logintype'] == 'jcbd') { + //检查绑定 + $tips_ = ''; + if ($appinfo['bindip'] == '1') { + $check['lip'] = $_POST['kt_ip']; + if (empty($_POST['kt_ip']) || $_POST['kt_ip'] == 'undefined') { + die(json_encode(array('code' => -10, 'msg' => '绑定的IP不能为空'))); + } + $tips_ .= '绑定IP:' . $check['lip'] . '
      '; + } + if ($appinfo['bindmac'] == '1') { + $check['mac'] = $_POST['kt_mac']; + if (empty($_POST['kt_mac']) || $_POST['kt_mac'] == 'undefined') { + die(json_encode(array('code' => -10, 'msg' => '绑定的机器不能为空'))); + } + $tips_ .= '绑定机器:' . $check['mac'] . '
      '; + + } + if ($appinfo['bindqq'] == '1') { + $check['rqq'] = $_POST['kt_robotqq']; + if (empty($_POST['kt_robotqq']) || $_POST['kt_robotqq'] == 'undefined') { + die(json_encode(array('code' => -10, 'msg' => '绑定的机器人QQ不能为空'))); + } + $tips_ .= '绑定QQ:' . $check['rqq'] . '
      '; + + } + if (empty($check)) { + die(json_encode(array('code' => -10, 'msg' => '系统内部错误(应用绑定信息配置异常),请联系管理员解决'))); + } + $check['appid'] = $appinfo['ID']; + $newtrade = array('name' => $fidinfo['fidname'], + 'tradeno' => $tradno, + 'begintime' => $time, + 'user' => json_encode($check), + 'fid' => $_POST['id'], + 'num' => $_POST['kt_num'], + 'paymoney' => $spendmoney, + 'mail' => $_POST['kt_mail'], + 'paytype' => $_POST['zffs'], + 'onlinepaytype' => $_POST['zxzffs'], + 'kami' => $_POST['kt_key'], + 'uqq' => $_POST['kt_adminqq'], + 'ip' => get_real_ip(), + 'status' => '1', + 'type' => 2, + 'agentid' => $agentinfo['ID'] + ); + + if (!$userinfo = $db->select_first_row('sq_user', '*', $check, 'AND')) { + $tips .= '开通方式:新开授权
      绑定信息如下:
      ' . $tips_ . '

      '; + } else { + $tips .= '开通方式:续费授权
      绑定信息如下:
      ' . $tips_ . '

      '; + } + } + if (empty($userinfo['balance'])) { + $userinfo['balance'] = 0; + } + $tips .= '正在开通套餐:' . $fidinfo['fidname'] . '
      '; + if (empty($userinfo['balance']) && $userinfo['balance'] == '-1') { + die(json_encode(array('code' => 3, 'msg' => '已是永久授权,无法再次开通和续费!'))); + } + if ($appinfo['usetype'] === 'dqsj') { + if (empty($userinfo['balance']) || $userinfo['balance'] == 0) { + $tips .= '当前到期时间:没有授权
      '; + $userinfo['balance'] = time(); + } else { + $tips .= '当前到期时间:' . Get_Date($userinfo['balance']) . '
      '; + } + if ($fidinfo['num'] != '-1') { + $tips .= '新增时长:' . time_last($fidinfo['num'] * $_POST['kt_num'] * 60) . '
      '; + } else { + $tips .= '购买后您可以无限使用
      '; + } + + } else { + $tips .= '用户剩余点数:' . $userinfo['balance'] . '点
      '; + if ($fidinfo['num'] != '-1') { + $tips .= '购买后点数:' . ($userinfo['balance'] + $fidinfo['num'] * $_POST['kt_num']) . '点
      '; + } else { + $tips .= '购买后点数:无限制
      '; + } + + } + + if ($_POST['zffs'] == 'zxzf') { + $tips .= '付款方式:在线支付
      '; + switch ($_POST['zxzffs']) { + case 'zfb': + $tips .= '支付方式:支付宝
      '; + break; + case 'wx': + $tips .= '支付方式:微信
      '; + break; + case 'qq': + $tips .= '支付方式:QQ钱包
      '; + break; + default: + die(json_encode(array('code' => -5, 'msg' => '错误的付款方式'))); + } + } else if ($_POST['zffs'] == 'czkm') { + if ($fidinfo['allrechargecard'] != 1) { + die(json_encode(array('code' => -5, 'msg' => '本套餐不支持使用卡密支付'))); + } + $tips .= '付款方式:余额卡密
      '; + $tips .= '正在使用的卡密:' . $_POST['kt_key'] . '
      '; + } else if ($_POST['zffs'] == 'yezf') { + $tips .= '付款方式:余额支付
      '; + if ($agentinfo['money'] < $spendmoney) { + die(json_encode(array('code' => -5, 'msg' => '您的代理余额不足,请先充值或者选择其他付款方式!'))); + } + } else { + die(json_encode(array('code' => -5, 'msg' => '错误的支付方式'))); + } + $tips .= '注意:请认真核对信息,付款后一律不支持退款!
      '; + if (!$db->insert_back_id('sq_trade', $newtrade)) { + die(json_encode(array('code' => -3, 'msg' => '系统错误:' . $db->geterror()))); + } else { + die(json_encode(array('code' => '1', 'tradeno' => $tradno, 'info' => $tips))); + } + break; + case 'recharge': + if ($_POST['money'] <= 0) { + die(json_encode(array('code' => -1, 'msg' => '充值的金额必须为正整数'))); + } + if (!$agentinfo = $db->select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username']), 'AND')) { + die(json_encode(array('code' => -2, 'msg' => '代理信息获取失败'))); + } + $time = time(); + $tradno = $time . rand_str(10, 'num'); + $tips = '您的订单已经生成完毕:
      订单号:' . $tradno . '
      充值金额:' . $_POST['money'] . '
      '; + if ($_POST['zffs'] == 'zxzf') { + $tips .= '付款方式:在线支付
      '; + switch ($_POST['zxzffs']) { + case 'zfb': + $tips .= '支付方式:支付宝
      '; + break; + case 'wx': + $tips .= '支付方式:微信
      '; + break; + case 'qq': + $tips .= '支付方式:QQ钱包
      '; + break; + default: + die(json_encode(array('code' => -5, 'msg' => '错误的付款方式'))); + } + } else if ($_POST['zffs'] == 'czkm') { + $tips .= '付款方式:余额卡密
      '; + $tips .= '正在使用的卡密:' . $_POST['kt_key'] . '
      '; + } else { + die(json_encode(array('code' => -5, 'msg' => '错误的支付方式'))); + } + + if (!$db->insert_back_id('sq_trade', array('name' => '代理' . $_SESSION['agent_username'] . '充值余额' . $_POST['money'] . '元', 'tradeno' => $tradno, 'begintime' => $time, 'user' => $_SESSION['agent_username'], 'status' => '1', 'type' => '1', 'paymoney' => $_POST['money'], 'agentid' => $agentinfo['ID'], 'paytype' => $_POST['zffs'], 'onlinepaytype' => $_POST['zxzffs'], 'kami' => $_POST['kt_key']))) { + die(json_encode(array('code' => -5, '订单创建失败' . $db->geterror()))); + } else { + die(json_encode(array('code' => '1', 'tradeno' => $tradno, 'info' => $tips))); + } + break; + case 'getlevallist': + $back = $db->select_all_row('sq_level', 'ID,lname', array(), 'AND'); + if (count($back) === 0) { + die(); + } + $i = ''; + foreach ($back as $value) { + $i .= ''; + } + die($i); + break; + + case 'getbuylist': + + if (!$agentinfo = $db->select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username']), 'AND')) { + die('代理信息获取失败'); + } + + if (!$agentlevelinfo = $db->select_first_row('sq_level', '*', array('ID' => $agentinfo['levelid']), 'AND')) { + die('等级信息获取失败'); + } + + $info = json_decode($agentlevelinfo['subordinate'], true); + $i = ''; + foreach ($info as $lid => $could) { + if ($could) { + $value = $db->select_first_row('sq_level', 'ID,lname', array('ID' => $lid), 'AND'); + $i .= ''; + } + + } + die($i); + break; + case 'gettradelist': + $where = array(); + + if (!empty($_GET['search'])) { + $where['tradeno'] = $where['name'] = $where['user'] = $where['mail'] = $where['kami'] = $_GET['search']; + $whereinfo = 'agentid=' . $_SESSION['agent_id'] . ' AND (' . $db->wheretosql($where, 'OR') . ')'; + } else { + $whereinfo = 'agentid=' . $_SESSION['agent_id']; + } + $backinfo['code'] = 0; + $backinfo['count'] = $db->select_count_row('sq_trade', $whereinfo, 'OR'); + if (!$arr = $db->select_limit_row('sq_trade', '*', ($_GET['page'] - 1) * $_GET['limit'], $_GET['limit'], $whereinfo, 'OR', 'ORDER BY ID DESC')) { + $backinfo['msg'] = $db->geterror(); + die(json_encode($backinfo)); + } + foreach ($arr as $key => $value) { + if ($value['begintime'] == 0) { + $arr[$key]['begintime'] = '-'; + } else { + $arr[$key]['begintime'] = Get_Date($value['begintime']); + } + if ($value['overtime'] == 0) { + $arr[$key]['overtime'] = '-'; + } else { + $arr[$key]['overtime'] = Get_Date($value['overtime']); + } + if ($value['paytype'] == 'zxzf') { + switch ($value['onlinepaytype']) { + case 'zfb': + $arr[$key]['paytype'] = '支付宝'; + break; + case 'wx': + $arr[$key]['paytype'] = '微信'; + break; + case 'qq': + $arr[$key]['paytype'] = 'QQ钱包'; + break; + default: + $arr[$key]['paytype'] = '异常?'; + break; + } + } else if ($value['paytype'] == 'czkm') { + $arr[$key]['paytype'] = '余额卡密'; + } else if ($value['paytype'] == 'yezf') { + $arr[$key]['paytype'] = '代理余额'; + } else { + $arr[$key]['paytype'] = '异常?'; + } + if ($value['status'] == 1) { + $arr[$key]['status'] = '等待付款'; + $button = ''; + } else if ($value['status'] == 2) { + $arr[$key]['status'] = '等待验证'; + $button = ''; + } elseif ($value['status'] == 3) { + $button = ''; + $arr[$key]['status'] = '完成'; + } else { + $arr[$key]['status'] = '异常'; + } + $arr[$key]['tools'] = $button . ''; + } + $backinfo['data'] = $arr; + die(json_encode($backinfo)); + break; + case 'deltrade': + if (!$db->delete('sq_trade', array('ID' => $_POST['id'], 'agentid' => $_SESSION['agent_id']), 'AND')) { + die('订单删除失败或者删除的数量为0' . $db->geterror()); + } else { + die('订单删除成功!'); + } + break; + case 'clearalltradeid': + $limit = time() - 3600; + if (!$db->delete('sq_trade', 'beigintime<' . $limit . ' AND agentid=' . $_SESSION['agent_id'], 'AND')) { + die('订单删除失败' . $db->geterror()); + } else { + die('订单删除成功!'); + } + break; + case 'clearnopay': + $limit = time() - 3600; + if (!$db->delete('sq_trade', 'begintime<' . $limit . ' AND status = 1 ' . ' AND agentid=' . $_SESSION['agent_id'], 'AND')) { + die('订单删除失败' . $db->geterror()); + } else { + die('订单删除成功!'); + } + break; + case 'clearbeenpay': + $limit = time() - 3600; + if (!$db->delete('sq_trade', array('status' => 3, 'agentid' => $_SESSION['agent_id']), 'AND')) { + die('订单删除失败' . $db->geterror()); + } else { + die('订单删除成功!'); + } + break; + case 'updatelevel': + if ($_POST['leval'] == 0) { + die('请先选择一个代理等级'); + } + if (!$levelinfo = $db->select_first_row('sq_level', '*', array('ID' => $_POST['leval']), 'AND')) { + die('等级信息获取失败,无法继续升级!'); + } + if (!$agentinfo = $db->select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username']), 'AND')) { + die('代理信息获取失败'); + } + if ($agentinfo['money'] < $levelinfo['price']) { + die('您的余额不足,无法升级,请先进行充值!'); + } + if ($agentinfo['levelid'] == $_POST['leval']) { + die('您目前的等级已经是这个了,重复开通干嘛 ̄へ ̄'); + } + $newmoney = $agentinfo['money'] - $levelinfo['price']; + if (!$db->update('sq_agent', array('username' => $_SESSION['agent_username']), 'AND', array('money' => $newmoney, 'levelid' => $_POST['leval']))) { + die('系统内部错误,升级失败!'); + } else { + $db->insert_back_id('sq_log_agent', array('time' => time(), 'aid' => $_SESSION['agent_id'], 'ip' => get_real_ip(), 'msg' => '自助花费余额提升等级为 ' . $levelinfo['lname'])); + die('代理等级提升成功!'); + } + break; + case 'buyagent': + if ($_POST['leval'] == 0) { + die('请先选择一个代理等级'); + } + if (!$levelinfo = $db->select_first_row('sq_level', '*', array('ID' => $_POST['leval']), 'AND')) { + die('等级信息获取失败,无法继续开通!'); + } + if (!$agentinfo = $db->select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username']), 'AND')) { + die('代理信息获取失败'); + } + if ($db->select_first_row('sq_agent', '*', array('username' => $_POST['username']), 'AND') != false) { + die('该代理账号已经存在,请尝试其他用户名'); + } + if (!$agentlevelinfo = $db->select_first_row('sq_level', '*', array('ID' => $agentinfo['levelid']), 'AND')) { + die('等级信息获取失败'); + } + $buymoney = $agentlevelinfo['discount'] * $levelinfo['price']; + if ($agentinfo['money'] < $buymoney) { + die('您的余额不足,无法开通,请先进行充值!'); + } + $couldbuy = json_decode($agentlevelinfo['subordinate'], true); + if (@$couldbuy[$_POST['leval']] !== true) { + die('您无法开通此等级的代理!'); + } + + $newmoney = $agentinfo['money'] - $buymoney; + if (!$db->update('sq_agent', array('username' => $_SESSION['agent_username']), 'AND', array('money' => $newmoney))) { + die('系统内部错误,开通失败!'); + } else { + if (!$db->insert_back_id('sq_agent', array('username' => $_POST['username'], 'password' => $_POST['pass'], 'begintime' => time(), 'levelid' => $_POST['leval'], 'status' => '1', 'superior' => $_SESSION['agent_id']))) { + die('您的余额已扣除但是内部发生错误,下级开通失败,请联系管理员处理!' . $db->geterror()); + } else { + $db->insert_back_id('sq_log_agent', array('time' => time(), 'aid' => $_SESSION['agent_id'], 'ip' => get_real_ip(), 'msg' => '成功开通下级代理 ' . $_POST['username'])); + die('成功开通下级代理!'); + } + } + break; + case 'getagentlist': + include '../function/function_app.php'; + if (!$result = $db->select_limit_row('sq_agent', '*', ($_GET['page'] - 1) * $_GET['limit'], $_GET['limit'], array('superior' => $_SESSION['agent_id']), 'AND')) { + $error = $db->geterror(); + if (!empty($error)) { + $backinfo['code'] = -1; + $backinfo['msg'] = $db->geterror(); + } else { + $backinfo['code'] = 0; + $backinfo['msg'] = ''; + $backinfo['count'] = 0; + } + + die(json_encode($backinfo)); + } else { + $info = ''; + $backinfo['code'] = 0; + $backinfo['msg'] = ''; + $backinfo['count'] = $db->select_count_row('sq_agent', array('superior' => $_SESSION['agent_id'])); + foreach ($result as $value) { + if ($value['logintime'] == 0) { + $value['logintime'] = '-'; + } + $value['begintime'] = Get_Date($value['begintime']); + $value['logintime'] = Get_Date($value['logintime']); + $value['levelname'] = level_idgetname($value['levelid']); + $value['status'] = ''; + $backinfo['data'][] = $value; + } + + + die(json_encode($backinfo)); + } + break; + case 'changeagent': +// if (!$db->update('sq_agent',array('ID'=>$_POST['id']),'AND',array('username'=>$_POST['agent_name'],'password'=>$_POST['agent_pass'],'money'=>$_POST['agent_money'],'levelid'=>$_POST['agent_leval'],'begintime'=>time(),'status'=>'1','loginip'=>'-'))){ +// die('修改失败'.$db->geterror()); +// }else{ +// die('修改成功!'); +// } + if (empty($_POST['mod'])) { + die('模块标识不能为空'); + } + if (empty($_POST['aid'])) { + die('代理ID不能为空'); + } + if ($_POST['mod'] != 'username' && $_POST['mod'] != 'password' && $_POST['mod'] != 'qq' && $_POST['mod'] != 'status') die('不支持修改的字段'); + + if ($_POST['mod'] == 'status') $_POST['value'] = textbooltonum($_POST['value']); + if (!$db->update('sq_agent', array('ID' => $_POST['aid'], 'superior' => $_SESSION['agent_id']), 'AND', array($_POST['mod'] => $_POST['value']))) { + die('修改失败' . $db->geterror()); + } else { + die('修改成功!'); + } + break; + case 'delagent': + if (empty($_POST['aid'])) { + die('非法提交'); + } + if (!$db->delete('sq_agent', array('ID' => $_POST['aid'], 'superior' => $_SESSION['agent_id']), 'AND')) { + die('删除失败 ' . $db->geterror()); + } else { + die('删除代理成功'); + } + break; + case 'leveltips': + include '../function/function_app.php'; + if (!$levelinfo = $db->select_first_row('sq_level', '*', array('ID' => $_POST['leval']), 'AND')) { + die('等级信息获取失败'); + } + if ($levelinfo['appid'] == '0') { + $appinfo = '全局代理'; + } else { + $appinfo = app_idgetname($levelinfo['appid']); + } + die('
      代理应用:' . $appinfo . ',等级名称:' . $levelinfo['lname'] . ',升级金额:' . $levelinfo['price'] . ',拿货折率:' . $levelinfo['fracture'] . '
      注意:升级后当前等级会被释放,而不是同时有两个等级,如果希望有多个等级请联系站长新开代理账号!
      '); + break; + case 'addagenttips': + include '../function/function_app.php'; + if (!$agentinfo = $db->select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username']), 'AND')) { + die('代理信息获取失败'); + } + if (!$agentlevelinfo = $db->select_first_row('sq_level', '*', array('ID' => $agentinfo['levelid']), 'AND')) { + die('等级信息获取失败'); + } + if (!$levelinfo = $db->select_first_row('sq_level', '*', array('ID' => $_POST['leval']), 'AND')) { + die('选择等级信息获取失败'); + } + + if ($levelinfo['appid'] == '0') { + $appinfo = '全局代理'; + } else { + $appinfo = app_idgetname($levelinfo['appid']); + } + die('代理应用:' . $appinfo . ',等级名称:' . $levelinfo['lname'] . ',开通金额:' . $levelinfo['price'] . ',拿货折率:' . $levelinfo['fracture'] . '
      您当前代理等级开通下级折率:' . $agentlevelinfo['discount'] . ',实际支付:' . ($levelinfo['price'] * $agentlevelinfo['discount']) . '元'); + break; + case 'changepassword': + if (empty($_POST['oldpass']) || empty($_POST['newpass']) || empty($_POST['renewpass'])) { + die('请填写完所有数据!'); + } + if ($_POST['newpass'] != $_POST['renewpass']) { + die('两次输入的密码一样,无法修改!'); + } + if (!$agentinfo = $db->select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username']), 'AND')) { + die('代理信息获取失败'); + } + if ($_POST['oldpass'] !== $agentinfo['password']) { + die('输入的原密码错误,无法修改!'); + } + + if (!$db->update('sq_agent', array('username' => $_SESSION['agent_username']), 'AND', array('password' => $_POST['newpass']))) { + die('密码修改失败,服务器内部发生错误'); + } else { + die('代理密码修改成功,请使用新密码进行登录!'); + } + + break; + case 'fidlist_show': + include '../function/function_app.php'; + //$where['agentbuy'] = '1'; + if (!$agentinfo = $db->select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username']), 'AND')) { + die(json_encode(array('code' => -2, 'msg' => '代理信息获取失败'))); + } + if (!$levelinfo = $db->select_first_row('sq_level', '*', array('ID' => $agentinfo['levelid']), 'AND')) { + die(json_encode(array('code' => -3, 'msg' => '代理等级信息获取失败!'))); + } + $applist = explode(',', $levelinfo['appid']); + $backinfo = array(); + $backinfo['code'] = 0; + $i = ''; + foreach ($applist as $appid){ + $backinfo = $db->select_all_row('sq_fidlist','ID,fidname', array('appid'=>$appid,'agentbuy'=>'1'), 'AND'); + $appname = app_idgetname($appid); + foreach ($backinfo as $fidinfo) { + $i .= ''; + } + } + die($i); + break; + case 'gettckeylist': + $where = array(); + if (!empty($_GET['search'])){ + $where['kami'] = $_GET['search']; + } + $where['fid'] = $_GET['fid']; + $where['aid'] = $_SESSION['agent_id']; + $backinfo['code'] = 0; + $backinfo['count'] = $db->select_count_row('sq_fidkey',$where,'AND'); + if(!$arr = $db->select_limit_row('sq_fidkey','*',($_GET['page'] - 1) * $_GET['limit'] , $_GET['limit'], $where, 'AND','ORDER BY ID DESC')){ + $backinfo['msg'] = $db->geterror(); + die(json_encode($backinfo)); + } + foreach ($arr as $key => $value){ + if ($value['creattime'] == 0){ + $arr[$key]['creattime'] = '-'; + }else{ + $arr[$key]['creattime'] = Get_Date($value['creattime']); + } + + if ($value['usetime'] == 0){ + $arr[$key]['usetime'] = '-'; + }else{ + $arr[$key]['usetime'] = Get_Date($value['usetime']); + } + + $arr[$key]['status'] = ''; + } + $backinfo['data'] = $arr; + die(json_encode($backinfo)); + + break; + case 'creatfidkey': + $count = $_POST['sc_count']; + if ($count <= 0){ + die(json_encode(array('code'=>'-1','msg'=>'生成的数量不能为空或者0或者负数'))); + } + $time = time(); + if ($count <= 0){ + die(json_encode(array('code'=>'-1','msg'=>'卡密金额不能为空或者0或者负数'))); + } + if (!$fidinfo = $db->select_first_row('sq_fidlist', '*', array('ID' => $_POST['sc_fid']), 'AND')) { + die(json_encode(array('code' => -2, 'msg' => '无法找到该商品,请刷新页面重试'))); + } + if (!$agentinfo = $db->select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username']), 'AND')) { + die(json_encode(array('code' => -3, 'msg' => '代理信息获取失败'))); + } + $spendmoney = $fidinfo['agentprice'] * $count; + if ($spendmoney > $agentinfo['money']){ + die(makejson(-10,'代理余额不足'.$spendmoney.',请先进行充值')); + } + $newmoney = $agentinfo['money'] - $spendmoney; + if (!$db->update('sq_agent', array('ID' => $_SESSION['agent_id']), 'AND', array('money' => $newmoney))) { + die('系统内部错误!'); + } + + $keylist=''; + for ($x=1; $x<=$_POST['sc_count']; $x++) { + $key = substr($time,0,6).'-'.rand_str(6).'-'.rand_str(6).'-'.rand_str(6).'-'.rand_str(6).rand_str(6); + $insarray[] = "'{$key}','{$time}','0','{$_POST['sc_fid']}','1','{$_SESSION['agent_id']}'"; + $keylist .= '
      '.$key; + } + $sign = rand_str(32); + $_SESSION['cards'][$sign] = str_replace('
      ',"\r\n",$keylist); + if(!$num = $db->insert_back_row('sq_fidkey',array('kami','creattime','usetime','fid','status','aid'),$insarray)){ + die(json_encode(array('code'=>'-1','msg'=>'数据库错误:'.$db->geterror()))); + }else{ + die(json_encode(array('code'=>'1','sign'=>$sign,'keys'=>'您的卡密如下:'.$keylist))); + } + break; + case 'tckeystatus': + if(!$db->update('sq_fidkey',array('ID'=>$_POST['keyid'],'aid'=>$_SESSION['agent_id']),'AND',array('status'=>textbooltonum($_POST['status'])))){ + die('更新失败'.$db->geterror()); + }else{ + die('成功'); + } + break; + case 'deltckey': + if (empty($_POST['keyid'])){ + die('非法提交'); + } + if (!$db->delete('sq_fidkey',array('ID'=>$_POST['keyid'],'aid'=>$_SESSION['agent_id']),'AND')){ + die('删除失败 '.$db->geterror()); + }else{ + die('删除成功!'); + } + break; + case 'download': + if (empty($_SESSION['cards'][$_GET['sign']])){ + die('该Sign不存在或者已过期,无法下载卡密'); + }else{ + $filename = $_GET['sign'].".txt"; + header('Content-Type:text/plain'); //指定下载文件类型 + header('Content-Disposition: attachment; filename="'.$filename.'"'); //指定下载文件的描述 + header('Content-Length:'.strlen($_SESSION['cards'][$_GET['sign']])); //指定下载文件的大小 + die($_SESSION['cards'][$_GET['sign']]); + } + break; + case 'getkeylist': + $where = array(); + if (!empty($_GET['search'])){ + $where['kami'] = $_GET['search']; + } + $where['aid'] = $_SESSION['agent_id']; + $backinfo['code'] = 0; + $backinfo['count'] = $db->select_count_row('sq_key',$where,'AND'); + if(!$arr = $db->select_limit_row('sq_key','*',($_GET['page'] - 1) * $_GET['limit'] , $_GET['limit'], $where, 'AND','ORDER BY ID DESC')){ + $backinfo['msg'] = $db->geterror(); + die(json_encode($backinfo)); + } + foreach ($arr as $key => $value){ + if ($value['creattime'] == 0){ + $arr[$key]['creattime'] = '-'; + }else{ + $arr[$key]['creattime'] = Get_Date($value['creattime']); + } + + if ($value['firstusetime'] == 0){ + $arr[$key]['firstusetime'] = '-'; + }else{ + $arr[$key]['firstusetime'] = Get_Date($value['firstusetime']); + } + if ($value['lastusetime'] == 0){ + $arr[$key]['lastusetime'] = '-'; + }else{ + $arr[$key]['lastusetime'] = Get_Date($value['lastusetime']); + } + $arr[$key]['status'] = ''; + } + $backinfo['data'] = $arr; + die(json_encode($backinfo)); + break; + case 'creatkey': + $count = $_POST['sc_count']; + if ($count <= 0){ + die(json_encode(array('code'=>'-1','msg'=>'生成的数量不能为空或者0或者负数'))); + } + $time = time(); + $money = $_POST['sc_money']; + if ($money <= 0){ + die(json_encode(array('code'=>'-1','msg'=>'卡密金额不能为空或者0或者负数'))); + } + $spendmoney = $money * $count; + if (!$agentinfo = $db->select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username']), 'AND')) { + die(json_encode(array('code' => -2, 'msg' => '代理信息获取失败'))); + } + if ($spendmoney > $agentinfo['money']){ + die(makejson(-10,'代理余额不足'.$spendmoney.',请先进行充值')); + } + $newmoney = $agentinfo['money'] - $spendmoney; + if (!$db->update('sq_agent', array('ID' => $_SESSION['agent_id']), 'AND', array('money' => $newmoney))) { + die('系统内部错误!'); + } + + $keylist=''; + for ($x=1; $x<=$_POST['sc_count']; $x++) { + $key = substr($time,0,6).'-'.rand_str(6).'-'.rand_str(6).'-'.rand_str(6).'-'.rand_str(6).'-'.$money; + $insarray[] = "'{$key}','{$time}','0','{$money}','{$money}','0','1','{$_SESSION['agent_id']}'"; + $keylist .= '
      '.$key; + } + $sign = rand_str(32); + $_SESSION['cards'][$sign] = str_replace('
      ',"\r\n",$keylist); + if(!$num = $db->insert_back_row('sq_key',array('kami','creattime','firstusetime','allmoney','lastmoney','lastusetime','status','aid'),$insarray)){ + die(json_encode(array('code'=>'-1','msg'=>'数据库错误:'.$db->geterror()))); + }else{ + die(json_encode(array('code'=>'1','sign'=>$sign,'keys'=>'您的卡密如下:'.$keylist))); + } + break; + case 'FidKeyOperation': + switch ($_POST['operation']){ + case 'ExportNoUse': + $result = $db->select_all_row('sq_fidkey','kami',array('usetime'=>0,'status'=>1,'fid'=>$_POST['fid'],'aid'=>$_SESSION['agent_id']),'AND'); + $keylist = ''; + foreach ($result as $value){ + $keylist .= $value['kami']."\r\n"; + } + $sign = rand_str(32); + $_SESSION['cards'][$sign] = $keylist; + die('您的卡密已就绪,点击这里下载卡密'); + break; + case 'ExportAll': + $result = $db->select_all_row('sq_fidkey','kami',array('fid'=>$_POST['fid'],'aid'=>$_SESSION['agent_id'],'status'=>1)); + $keylist = ''; + foreach ($result as $value){ + $keylist .= $value['kami']."\r\n"; + } + $sign = rand_str(32); + $_SESSION['cards'][$sign] = $keylist; + die('您的卡密已就绪,点击这里下载卡密'); + break; + case 'DelNoUse': + $db->delete('sq_fidkey',array('usetime'=>0,'fid'=>$_POST['fid'],'status'=>1,'aid'=>$_SESSION['agent_id']),'AND'); + die('成功删除'.(int)$db->affected_num().'行'); + break; + case 'DelUse': + $db->delete('sq_fidkey', '`usetime` > 0 AND `fid` = '.$_POST['fid'].' AND `aid` = '.$_SESSION['agent_id'].' AND `status` = 1','AND'); + die('成功删除'.(int)$db->affected_num().'行'); + break; + case 'DelAll': + $db->delete('sq_fidkey',array('fid'=>$_POST['fid'],'aid'=>$_SESSION['agent_id']),'AND'); + die('成功删除'.(int)$db->affected_num().'行'); + break; + } + break; + case 'KeyOperation': + switch ($_POST['operation']){ + case 'ExportNoUse': + $result = $db->select_all_row('sq_key','kami',array('firstusetime'=>0,'status'=>1,'aid'=>$_SESSION['agent_id'])); + $keylist = ''; + foreach ($result as $value){ + $keylist .= $value['kami']."\r\n"; + } + $sign = rand_str(32); + $_SESSION['cards'][$sign] = $keylist; + die(makejson(1,'success',array('sign'=>$sign))); + break; + case 'ExportNoMoney': + $result = $db->select_all_row('sq_key','kami',array('lastmoney'=>0,'status'=>1,'aid'=>$_SESSION['agent_id'])); + $keylist = ''; + foreach ($result as $value){ + $keylist .= $value['kami']."\r\n"; + } + $sign = rand_str(32); + $_SESSION['cards'][$sign] = $keylist; + die(makejson(1,'success',array('sign'=>$sign))); + break; + case 'ExportAll': + $result = $db->select_all_row('sq_key','kami',array('aid'=>$_SESSION['agent_id'])); + $keylist = ''; + foreach ($result as $value){ + $keylist .= $value['kami']."\r\n"; + } + $sign = rand_str(32); + $_SESSION['cards'][$sign] = $keylist; + die(makejson(1,'success',array('sign'=>$sign))); + break; + case 'DelNoMoney': + $db->delete('sq_key',array('lastmoney'=>0,'aid'=>$_SESSION['agent_id']),'AND'); + + die(makejson(2,'success',array('nums'=>$db->affected_num()))); + break; + case 'DelNoUse': + $db->delete('sq_key',array('firstusetime'=>0,'aid'=>$_SESSION['agent_id']),'AND'); + die(makejson(2,'success',array('nums'=>$db->affected_num()))); + break; + case 'DelAll': + $db->delete('sq_key',array('aid'=>$_SESSION['agent_id']),'AND'); + die(makejson(2,'success',array('nums'=>$db->affected_num()))); + break; + default: + die(makejson(-1,'未知操作:'.$_POST['operation'])); + } + break; + case 'keylog': + if (!$result = $db->select_limit_row('sq_log_kami','*','',0,array('keyid'=>$_POST['keyid'],'aid'=>$_SESSION['agent_id']),'AND',"ORDER BY time DESC")){ + die(makejson(-1,'数据库中没有记录')); + } + die(makejson(1,'success',array('items'=>$result))); + break; + case 'delkey': + if (empty($_POST['keyid'])){ + die(makejson(-1,'卡密ID不能为空')); + } + if (!$db->delete('sq_key',array('ID'=>$_POST['keyid'],'aid'=>$_SESSION['agent_id']),'AND')){ + die(makejson(-2,'删除失败 '.$db->geterror())); + }else{ + die(makejson(1,'删除成功!')); + } + break; +} +die('啊嘞嘞???'); diff --git a/agent/html/buy.page.inc.php b/agent/html/buy.page.inc.php new file mode 100644 index 0000000..919aaf3 --- /dev/null +++ b/agent/html/buy.page.inc.php @@ -0,0 +1,151 @@ + + + + + + + + 代理开通授权 + + + + + + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      +
      + +
      + +
      +
      + + +
      + +
      + + + +
      +
      + + +
      + +
      + + + +
      +
      + + +
      +
      + + +
      +
      +
      +
      + + + + + + + \ No newline at end of file diff --git a/agent/html/czkm.html b/agent/html/czkm.html new file mode 100644 index 0000000..84c6bec --- /dev/null +++ b/agent/html/czkm.html @@ -0,0 +1,264 @@ + + + + + + + + 欢迎页 + + + + + + +
      + + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      +
      + + +
      +
      + +
      +
      +
      注意:清空和删除卡密不管卡密是否已使用,一律不归还使用的余额!
      +
      + +
      + + + + + + +
      +
      +
      + + +
      + + + + + + + + + \ No newline at end of file diff --git a/agent/html/ddjl.html b/agent/html/ddjl.html new file mode 100644 index 0000000..cc0d77d --- /dev/null +++ b/agent/html/ddjl.html @@ -0,0 +1,189 @@ + + + + + + + + 欢迎页 + + + + + + +
      + + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      +
      +
      + +
      + + + +
      +
      + +
      +
      + + +
      + + + + + + + + + \ No newline at end of file diff --git a/agent/html/jbts.html b/agent/html/jbts.html new file mode 100644 index 0000000..0e6ae7b --- /dev/null +++ b/agent/html/jbts.html @@ -0,0 +1,140 @@ + + + + + + + + 添加应用 + + + + + + +
      +
      + +
      + +
      + +
      辅助文字
      +
      +
      +
      +
      + + +
      +
      +
      + +
      + + + + + + + \ No newline at end of file diff --git a/agent/html/ktsq.html b/agent/html/ktsq.html new file mode 100644 index 0000000..df442a2 --- /dev/null +++ b/agent/html/ktsq.html @@ -0,0 +1,121 @@ + + + + + + + + 欢迎页 + + + + + + +
      +
      +
      + +
      + +
      +
      +
      + +
      + + +
      + + + + + + + + + \ No newline at end of file diff --git a/agent/html/ktxj.html b/agent/html/ktxj.html new file mode 100644 index 0000000..fab46e6 --- /dev/null +++ b/agent/html/ktxj.html @@ -0,0 +1,158 @@ + + + + + + + + 开通下级代理 + + + + + + +
      +
      +
      + +
      + +
      +
      +
      + + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      +
      +
      + + +
      +
      + + +
      + +
      + + + + + + + \ No newline at end of file diff --git a/agent/html/sqgl.html b/agent/html/sqgl.html new file mode 100644 index 0000000..b21a87d --- /dev/null +++ b/agent/html/sqgl.html @@ -0,0 +1,189 @@ + + + + + + + + 欢迎页 + + + + + + +
      +
      +
      + +
      + +
      +
      +
      +
      +
      + +
      + +
      + +
      + +
      +
      +
      + + +
      + + + + + + + + + \ No newline at end of file diff --git a/agent/html/tckm.html b/agent/html/tckm.html new file mode 100644 index 0000000..cdde6a8 --- /dev/null +++ b/agent/html/tckm.html @@ -0,0 +1,256 @@ + + + + + + + + 欢迎页 + + + + + + +
      +
      +
      + +
      + +
      +
      + +
      +
      +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      +
      + +
      +
      + + +
      +
      + +
      +
      +
      注意:清空和删除卡密不管卡密是否已使用,一律不归还使用的余额!
      +
      +
      + +
      + + + + + +
      +
      + +
      +
      +
      + + + +
      + + + + + + + + + \ No newline at end of file diff --git a/agent/html/userset.html b/agent/html/userset.html new file mode 100644 index 0000000..3f2f1df --- /dev/null +++ b/agent/html/userset.html @@ -0,0 +1,90 @@ + + + + + + + + 欢迎页 + + + + + + + +
      + +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      +
      + + +
      +
      + +
      +
      + + + + + + + + + \ No newline at end of file diff --git a/agent/html/welcome.html b/agent/html/welcome.html new file mode 100644 index 0000000..dcbccb6 --- /dev/null +++ b/agent/html/welcome.html @@ -0,0 +1,184 @@ + + + + + + + + 欢迎页 + + + + + +
      +
      +
      +
      + +
      +
      +

      loading

      +

      用户数量

      +
      +
      +
      +
      +
      +
      + +
      +
      +

      loading

      +

      账户余额

      +
      +
      +
      +
      +
      +
      + +
      +
      +

      loading

      +

      累计充值

      +
      +
      +
      +
      +
      +
      + +
      +
      +

      loading

      +

      累计消费

      +
      +
      +
      +
      +
      +
      + +
      +
      +

      loading

      +

      下级数量

      +
      +
      +
      +
      +
      +
      + +
      +
      +

      loading

      +

      当前等级

      +
      +
      +
      + +
      +
      +
      +

      系统公告

      +
      + +
      +
      +
      +
      + +
      + + + + + + + \ No newline at end of file diff --git a/agent/html/xjgl.html b/agent/html/xjgl.html new file mode 100644 index 0000000..cc02573 --- /dev/null +++ b/agent/html/xjgl.html @@ -0,0 +1,125 @@ + + + + + + + + 欢迎页 + + + + + + +
      +
      + + +
      + + + + + + + + \ No newline at end of file diff --git a/agent/html/zxcz.html b/agent/html/zxcz.html new file mode 100644 index 0000000..0f24976 --- /dev/null +++ b/agent/html/zxcz.html @@ -0,0 +1,139 @@ + + + + + + + + 添加应用 + + + + + + +
      +
      +
      + +
      + +
      +
      + +
      + +
      + + + + + +
      +
      + + +
      + +
      + + + +
      +
      + + +
      +
      + + +
      +
      +
      +
      + + + + + + + \ No newline at end of file diff --git a/agent/index.php b/agent/index.php new file mode 100644 index 0000000..ee1af8f --- /dev/null +++ b/agent/index.php @@ -0,0 +1,33 @@ +select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username'], 'password' => $_SESSION['agent_password']), 'AND')) { + echo '没有登录:code:-2'; + header('Location: login.html'); + die(); +} +if ($_SERVER['HTTP_USER_AGENT'] !== $_SESSION['agent_HTTP_USER_AGENT']) { + echo '没有登录:code:-3'; + header('Location: login.html'); + die(); +} +if (!empty($_GET['mod']) && $_GET['mod'] == 'loginout') { + unset($_SESSION['agent_username']); + unset($_SESSION['agent_password']); + unset($_SESSION['agent_HTTP_USER_AGENT']); + unset($_SESSION['agent_id']); + + header('Location: login.html'); + die(); +} +header('Location: agent.html'); \ No newline at end of file diff --git a/agent/login.html b/agent/login.html new file mode 100644 index 0000000..e5c14ca --- /dev/null +++ b/agent/login.html @@ -0,0 +1,124 @@ + + + + + + + + 授权系统代理登录 + + + + + + + + + +
      + + + + + + + \ No newline at end of file diff --git a/ajax.php b/ajax.php new file mode 100644 index 0000000..4fb3332 --- /dev/null +++ b/ajax.php @@ -0,0 +1,1162 @@ +select_all_row('sq_apps', 'ID,appname', array(), 'AND'); + if (count($back) === 0) { + die(); + } + $i = ''; + foreach ($back as $value) { + $i .= ''; + } + die($i); + break; + case 'loadbuylist': + include 'function/function_app.php'; + $where = array(); + $where['openbuy'] = '1'; + + if (!empty($_POST['loadbuylist']) && $_POST['loadbuylist'] != 0) { + $where['appid'] = intval($_POST['loadbuylist']); + } + //print_r($where); + + if (!$result = $db->select_all_row('sq_fidlist', '*', $where, 'AND')) { + die('站长没有添加任何商品' . $db->geterror()); + } + //print_r($result); + $info = ''; + foreach ($result as $item) { + //echo '1'; + if (!$appinfo = $db->select_first_row('sq_apps', 'appname,usetype,imgsrc,upurl', array('ID' => $item['appid']), 'AND')) { + echo $db->geterror(); + continue; + } + //echo '2'; + if ($item['num'] != '-1') { + if ($appinfo['usetype'] === 'dqsj') { + $numtip = '使用时长:' . time_last($item['num'] * 60); + } else { + $numtip = '充值点数:' . $item['num'] . '点'; + } + } else { + if ($appinfo['usetype'] === 'dqsj') { + $numtip = '使用时长:无期授权'; + } else { + $numtip = '充值点数:无限使用'; + } + } + if (empty($appinfo['imgsrc'])) { + $appinfo['imgsrc'] = './mdl/dog.png'; + } + $info .= '
      +
      +

      ' . $item['fidname'] . '

      +
      + +
      + + 购买价格:' . $item['buyprice'] . '元
      ' . $numtip . '
      应用名称:' . $appinfo['appname'] . ' +
      +
      + + + +
      +
      '; + + } + die($info); + break; + case 'buy_first': + include "function/function_app.php"; + $fidinfo = $db->select_first_row('sq_fidlist', '*', array('ID' => $_GET['fid']), 'AND'); + $appinfo = app_idgetinfo($fidinfo['appid']); + $output = ' + + + + + + + + + + 授权在线开通 - '.$G['config']['sitename'].' + + + +'; + $output .= '
      '; + $output .= GetBuyFormHtml($appinfo,$type); + $output .= '
      + + + + +
      + +
      + + + + +
      +
      + + + + +
      +
      + 请选择您的支付方式: + + +
      +
      + + +
      +
      + 请选择在线支付方式: + + + +
      +
      +


      +
      + +
      + +
      + + + + + + + + + + +'; + die($output); + break; + case 'buy_agent': + include './function/VerificationCode.class.php'; + $verification = Verification::check($_POST['token']); + if ($verification !== true) { + die(json_encode(array('code' => '-88', 'msg' => '请先进行人机验证'))); + } + if (empty($_POST['lid'])) { + die(json_encode(array('code' => -2, 'msg' => '请选择一个级别'))); + } + if (empty($_POST['username'])) { + die(json_encode(array('code' => -3, 'msg' => '请输入用户名,用户名和密码是您登陆代理后台的唯一凭证!'))); + } + if (empty($_POST['password'])) { + die(json_encode(array('code' => -4, 'msg' => '请输入您的密码,用户名和密码是您登陆代理后台的唯一凭证!'))); + } + if (empty($_POST['qq'])) { + die(json_encode(array('code' => -5, 'msg' => '请输入您的QQ'))); + } + if (!$levelinfo = $db->select_first_row('sq_level', 'lname,price', array('ID' => $_POST['lid']), 'AND')) { + die(json_encode(array('code' => -5, 'msg' => '无法找到该代理等级'))); + } + if ($levelinfo['price'] <= 0) { + die(json_encode(array('code' => -6, 'msg' => '该代理等级不允许在线开通'))); + } + if ($db->select_first_row('sq_agent', 'ID', array('username' => $_POST['username']), '') != false) { + die(json_encode(array('code' => -6, 'msg' => '用户名重复,请尝试其他用户名'))); + } + $time = time(); + $tradno = $time . rand_str(10, 'num'); + $money = $levelinfo['price']; + $tips = '您正在开通新代理,请确认以下信息:
      '; + $tips .= '交易订单号:' . $tradno . '
      '; + $tips .= '正在开通等级:' . $levelinfo['lname'] . '
      '; + $tips .= '代理用户名:' . $_POST['username'] . '
      '; + $tips .= '代理代理密码:' . $_POST['password'] . '
      '; + $tips .= '代理QQ:' . $_POST['qq'] . '
      '; + $tips .= '应付金额:' . $levelinfo['price'] . '
      '; + if ($_POST['zffs'] == 'zxzf') { + $tips .= '付款方式:在线支付
      '; + switch ($_POST['zxzffs']) { + case 'zfb': + $tips .= '支付方式:支付宝
      '; + break; + case 'wx': + $tips .= '支付方式:微信
      '; + break; + case 'qq': + $tips .= '支付方式:QQ钱包
      '; + break; + default: + die(json_encode(array('code' => -7, 'msg' => '错误的付款方式'))); + } + } else if ($_POST['zffs'] == 'czkm') { + $tips .= '付款方式:余额卡密
      '; + if (empty($_POST['kt_key'])) { + die(json_encode(array('code' => -8, 'msg' => '余额卡密不能为空'))); + } + $tips .= '正在使用的卡密:' . $_POST['kt_key'] . '
      '; + } else { + die(json_encode(array('code' => -5, 'msg' => '错误的支付方式'))); + } + $newtrade = array('name' => $levelinfo['lname'], + 'tradeno' => $tradno, + 'begintime' => $time, + 'user' => $_POST['username'], + 'pass' => $_POST['password'], + 'fid' => $_POST['lid'], + 'num' => 1, + 'paymoney' => $money, + 'mail' => $_POST['qq'] . '@qq.com', + 'paytype' => $_POST['zffs'], + 'onlinepaytype' => $_POST['zxzffs'], + 'kami' => $_POST['kt_key'], + 'uqq' => $_POST['qq'], + 'ip' => get_real_ip(), + 'status' => '1', + 'type' => 4 + ); + $db->insert_back_id('sq_trade', $newtrade); + die(json_encode(array('code' => '1', 'tradeno' => $tradno, 'info' => $tips))); + break; + + case 'buy_submit': + include './function/VerificationCode.class.php'; + $verification = Verification::check($_POST['token']); + if ($verification !== true) { + die(json_encode(array('code' => '-88', 'msg' => '请先进行人机验证'))); + } + include 'function/function_app.php'; + + if (empty($_POST['kt_key'])) { + $_POST['kt_key'] = '无'; + } + if (!$fidinfo = $db->select_first_row('sq_fidlist', '*', array('ID' => $_POST['id']), 'AND')) { + die(json_encode(array('code' => -2, 'msg' => '无法找到该商品,请刷新页面重试'))); + } + if (!$appinfo = app_idgetinfo($fidinfo['appid'])) { + die(json_encode(array('code' => -2, 'msg' => '无法找到应用,也许是该应用已下架'))); + } + if ($fidinfo['num'] == -1 && $_POST['kt_num'] != 1) { + die(json_encode(array('code' => '-3', 'msg' => '此套餐包含的授权时长为永久,请固定开通数量为1'))); + } + if ($_POST['kt_num'] <= 0 || $_POST['kt_num'] >= 10) { + die(json_encode(array('code' => '-4', 'msg' => '开通数量填写错误,开通数量必须为1-10之间'))); + } + $time = time(); + $tradno = $time . rand_str(10, 'num'); + $tips = '交易订单号:' . $tradno . '
      '; + $spendmoney = $fidinfo['buyprice'] * $_POST['kt_num']; + $tips .= '应付金额:' . $spendmoney . '
      '; + if ($spendmoney <= 0) { + die(json_encode(array('code' => -7, 'msg' => '错误的支付金额:' . $spendmoney))); + } + + if ($_POST['type'] == '1') { + if (empty($_POST['kt_user'])) { + die(json_encode(array('code' => -13, 'msg' => '用户名不能为空!'))); + } + if (empty($_POST['kt_pass'])) { + die(json_encode(array('code' => -14, 'msg' => '密码不能为空!'))); + } + if (!$userinfo = $db->select_first_row('sq_user', '*', array('username' => $_POST['kt_user'], 'appid' => $fidinfo['appid']), 'AND')) { + + } else { + if ($_POST['kt_pass'] !== $userinfo['password']) { + die(json_encode(array('code' => -2, 'msg' => '您的用户名已开通,您需要输入的正确密码才能进行续费,当前输入的用户密码错误!'))); + } + } + $tips .= '开通用户名:' . $_POST['kt_user'] . '
      '; + $newtrade = array('name' => $fidinfo['fidname'], + 'tradeno' => $tradno, + 'begintime' => $time, + 'user' => $_POST['kt_user'], + 'pass' => $_POST['kt_pass'], + 'fid' => $_POST['id'], + 'num' => $_POST['kt_num'], + 'paymoney' => $spendmoney, + 'mail' => $_POST['kt_mail'], + 'paytype' => $_POST['zffs'], + 'onlinepaytype' => $_POST['zxzffs'], + 'kami' => $_POST['kt_key'], + 'uqq' => $_POST['kt_adminqq'], + 'ip' => get_real_ip(), + 'status' => '1', + 'type' => 3 + ); + } else if ($_POST['type'] == '2') { + //卡密方式 + if (!$userinfo = $db->select_first_row('sq_user', '*', array('username' => $_POST['kt_user'], 'appid' => $fidinfo['appid']), 'AND')) { + $userkey = $userinfo['username']; + $tips .= '开通方式:新开卡密
      '; + } else { + $userkey = ''; + $tips .= '开通方式:续费卡密(' . $_POST['kt_user'] . ')
      '; + } + $newtrade = array( + 'user'=>$_POST['kt_user'], + 'name' => $fidinfo['fidname'], + 'tradeno' => $tradno, + 'begintime' => $time, + 'fid' => $_POST['id'], + 'num' => $_POST['kt_num'], + 'paymoney' => $spendmoney, + 'mail' => $_POST['kt_mail'], + 'paytype' => $_POST['zffs'], + 'onlinepaytype' => $_POST['zxzffs'], + 'uqq' => $_POST['kt_adminqq'], + 'kami' => $_POST['kt_key'], + 'ip' => get_real_ip(), + 'status' => '1', + 'type' => 3 + ); + + } else { + //检查绑定 + + $tips_ = ''; + if ($appinfo['bindip'] == '1') { + $check['lip'] = $_POST['kt_ip']; + if (empty($_POST['kt_ip']) || $_POST['kt_ip'] == 'undefined') { + die(json_encode(array('code' => -10, 'msg' => '绑定的IP不能为空'))); + } + $tips_ .= '绑定IP:' . $check['lip'] . '
      '; + } + if ($appinfo['bindmac'] == '1') { + $check['mac'] = $_POST['kt_mac']; + if (empty($_POST['kt_mac']) || $_POST['kt_mac'] == 'undefined') { + die(json_encode(array('code' => -10, 'msg' => '绑定的机器不能为空'))); + } + $tips_ .= '绑定机器:' . $check['mac'] . '
      '; + + } + if ($appinfo['bindqq'] == '1') { + $check['rqq'] = $_POST['kt_robotqq']; + if (empty($_POST['kt_robotqq']) || $_POST['kt_robotqq'] == 'undefined') { + die(json_encode(array('code' => -10, 'msg' => '绑定的机器人QQ不能为空'))); + } + $tips_ .= '绑定QQ:' . $check['rqq'] . '
      '; + } + //$check['appid'] = $appinfo['ID']; + if (empty($check)) { + die(json_encode(array('code' => -10, 'msg' => '系统内部错误(应用绑定信息配置异常),请联系管理员解决'))); + } + $newtrade = array('name' => $fidinfo['fidname'], + 'tradeno' => $tradno, + 'begintime' => $time, + 'user' => json_encode($check), + 'fid' => $_POST['id'], + 'num' => $_POST['kt_num'], + 'paymoney' => $spendmoney, + 'mail' => $_POST['kt_mail'], + 'paytype' => $_POST['zffs'], + 'onlinepaytype' => $_POST['zxzffs'], + 'kami' => $_POST['kt_key'], + 'ip' => get_real_ip(), + 'status' => '1', + 'uqq' => $_POST['kt_adminqq'], + 'type' => 3 + ); + + if (!$userinfo = $db->select_first_row('sq_user', '*', $check, 'AND')) { + $tips .= '开通方式:新开授权
      绑定信息如下:
      ' . $tips_ . '

      '; + } else { + $tips .= '开通方式:续费授权
      绑定信息如下:
      ' . $tips_ . '

      '; + } + } + if (empty($userinfo['balance'])) { + $userinfo['balance'] = 0; + } + $tips .= '正在开通套餐:' . $fidinfo['fidname'] . '
      '; + if ($appinfo['usetype'] === 'dqsj') { + if (empty($userinfo['balance']) || $userinfo['balance'] == 0) { + $tips .= '您目前到期时间:无
      '; + $userinfo['balance'] = time(); + } else { + $tips .= '您目前到期时间:' . Get_Date($userinfo['balance']) . '
      '; + } + $tips .= '新增时长:' . time_last($fidinfo['num'] * $_POST['kt_num'] * 60) . '
      '; + } else { + $tips .= '用户剩余点数:' . $userinfo['balance'] . '点
      '; + $tips .= '购买后点数:' . ($userinfo['balance'] + $fidinfo['num'] * $_POST['kt_num']) . '点
      '; + } + + if ($_POST['zffs'] == 'zxzf') { + $tips .= '付款方式:在线支付
      '; + switch ($_POST['zxzffs']) { + case 'zfb': + $tips .= '支付方式:支付宝
      '; + break; + case 'wx': + $tips .= '支付方式:微信
      '; + break; + case 'qq': + $tips .= '支付方式:QQ钱包
      '; + break; + default: + die(json_encode(array('code' => -5, 'msg' => '错误的付款方式'))); + } + } else if ($_POST['zffs'] == 'czkm') { + if ($fidinfo['allrechargecard'] != 1) { + die(json_encode(array('code' => -5, 'msg' => '本套餐不支持使用卡密支付'))); + } + $tips .= '付款方式:余额卡密
      '; + $tips .= '正在使用的卡密:' . $_POST['kt_key'] . '
      '; + } else { + die(json_encode(array('code' => -5, 'msg' => '错误的支付方式'))); + } + $tips .= '注意:请认真核对信息,付款后一律不支持退款!
      '; + + if (!$db->insert_back_id('sq_trade', $newtrade)) { + die(json_encode(array('code' => -3, 'msg' => '系统错误:' . $db->geterror()))); + } else { + die(json_encode(array('code' => '1', 'tradeno' => $tradno, 'info' => $tips))); + } + break; + case 'introduce': + if (!$appinfo = $db->select_first_row('sq_apps', 'introduce', array('ID' => $_GET['appid']), 'AND')) { + die('服务器内部错误'); + } else { + if (empty($appinfo['introduce'])){ + die('管理员没有写任何详情 :('); + } + die($appinfo['introduce']); + } + break; + case 'queryauth': + include './function/VerificationCode.class.php'; + $verification = Verification::check($_POST['token']); + if ($verification !== true) { + die(json_encode(array('code' => '-88', 'msg' => '请先进行人机验证'))); + } + if($result = $db->select_first_row('sq_bclist','*',array('obj'=>$_POST['qq']),'AND')){ + if ($result['appid'] != 0){ + include_once 'function/function_app.php'; + $app = app_idgetname($result['appid']); + }else{ + $app = '所有应用'; + } + die('查询对象属于云黑名单中!
      原因:'.$result['reason'].'
      拉黑应用:'.$app); + } + + $_POST['qq'] = intval($_POST['qq']); + if (empty($_POST['qq'])) { + die('查询的QQ号码不能为空'); + } + $info = $db->select_all_row('sq_agent', 'begintime,levelid,qq', array('qq' => $_POST['qq'], 'status' => 1), 'AND'); + include 'function/function_app.php'; + if (!is_array($info) || count($info) == 0) { + echo('QQ' . $_POST['qq'] . '没有查询到任何代理信息' . '
      '); + } else { + foreach ($info as $qqinfo) { + echo '代理QQ:' . $qqinfo['qq'] . '
      '; + echo '开通时间:' . Get_Date($qqinfo['begintime']) . '
      '; + + $levelinfo = $db->select_first_row('sq_level', '*', array('ID' => $qqinfo['levelid']), 'AND'); + echo '代理级别:' . $levelinfo['lname'] . '
      '; + + $array = explode(',', $levelinfo['appid']); + $appname = ''; + foreach ($array as $appid) { + if (!empty($appname)) { + $appname .= ',' . app_idgetname($appid); + } else { + $appname = app_idgetname($appid); + } + } + echo '所属应用:' . $appname; + echo '
      '; + } + } + + $info = $db->select_all_row('sq_user', 'uqq,rqq,rtime,balance,appid,aid', array('uqq' => $_POST['qq'], 'rqq' => $_POST['qq']), 'OR'); + if (!is_array($info) || count($info) == 0) { + die('QQ' . $_POST['qq'] . '没有查询到任何授权信息'); + } + + foreach ($info as $qqinfo) { + echo '用户QQ:' . $qqinfo['uqq'] . '
      '; + echo '机器人QQ:' . $qqinfo['rqq'] . '
      '; + echo '开通时间:' . Get_Date($qqinfo['rtime']) . '
      '; + $appinfo = app_idgetinfo($qqinfo['appid']); + echo '所属应用:' . $appinfo['appname'] . '
      '; + if ($appinfo['usetype'] == 'dqsj') { + if ($qqinfo['balance'] == '-1') { + echo '到期时间:永久授权'; + } else { + echo '到期时间:' . Get_Date($qqinfo['balance']) . '
      '; + } + } else if ($appinfo['usetype'] == 'kcye') { + echo '剩余余额:' . $qqinfo['balance'] . '
      '; + } + if ($qqinfo['aid'] != 0) { + $agentinfo = $db->select_first_row('sq_agent', 'username', array('ID' => $qqinfo['aid']), 'AND'); + echo '开通代理:' . $agentinfo['username'] . '
      '; + } + echo '
      '; + } + die(); + case 'levellist': + $info = $db->select_all_row('sq_level', 'ID,lname', 'price<>0', '', ''); + $i = ''; + foreach ($info as $value) { + $i .= ''; + } + die($i); + break; + case 'FieldKamiOpen_First': + include './function/VerificationCode.class.php'; + $verification = Verification::check($_GET['token']); + if ($verification !== true) { + die(json_encode(array('code' => '-88', 'msg' => '请先进行人机验证'))); + } + if (!$info = $db->select_first_row('sq_fidkey','*',array('kami'=>$_GET['kami']),'AND')) die('卡密不存在'); + if ($info['status'] != 1) die('卡密已被冻结'); + if ( !empty($info['user']) || !empty($info['usetime'])) die('卡密已被使用'); + if (!$fidinfo = $db->select_first_row('sq_fidlist','fidname,appid',array('ID'=>$info['fid']),'AND'))die('无法找到对应套餐,请联系管理员处理'); + include "function/function_app.php"; + $appinfo = app_idgetinfo($fidinfo['appid']); + $output = ' + + + + + + + + + + 使用卡密'.$_GET['kami'].' - '.$G['config']['sitename'].' + + + +'; + $output .= '
      '; + $output .= GetBuyFormHtml($appinfo,$type); + $output .= ' +
      + + + +
      +
      + + +
      + +
      +
      +

      +
      + +
      + +
      + + + + + + + + + + +'; + die($output); + break; + case 'FieldKeyBuy_submit': + error_reporting(E_ALL); + include './function/VerificationCode.class.php'; + $verification = Verification::check($_POST['token']); + if ($verification !== true) { + die(json_encode(array('code' => '-88', 'msg' => '请先进行人机验证'))); + } + if (!$info = $db->select_first_row('sq_fidkey','*',array('kami'=>$_POST['kt_key']),'AND')) die(json_encode(array('code' => '-1', 'msg' => '卡密不存在')));; + if ($info['status'] != 1) die(json_encode(array('code' => '-101', 'msg' => '卡密已被冻结'))); + if ( !empty($info['user']) || !empty($info['usetime'])) die(json_encode(array('code' => '-102', 'msg' => '卡密已被使用'))); + if (!$fidinfo = $db->select_first_row('sq_fidlist','*',array('ID'=>$info['fid']),'AND'))die(json_encode(array('code' => '-201', 'msg' => '套餐无法找到,请联系管理员')));; + $tips=''; + include 'function/function_app.php'; + if (!$appinfo = app_idgetinfo($fidinfo['appid'])) { + die(json_encode(array('code' => -2, 'msg' => '无法找到应用,也许是该应用已下架'))); + } + $spendmoney = 0; + $time = time(); + if ($_POST['type'] == '1') { + if (empty($_POST['kt_user'])) { + die(json_encode(array('code' => -13, 'msg' => '用户名不能为空!'))); + } + if (empty($_POST['kt_pass'])) { + die(json_encode(array('code' => -14, 'msg' => '密码不能为空!'))); + } + if (!$userinfo = $db->select_first_row('sq_user', '*', array('username' => $_POST['kt_user'], 'appid' => $fidinfo['appid']), 'AND')) { + + } else { + if ($_POST['kt_pass'] !== $userinfo['password']) { + die(json_encode(array('code' => -2, 'msg' => '用户密码错误!'))); + } + } + $tips .= '开通用户名:' . $_POST['kt_user'] . '
      '; + $newtrade = array('name' => $fidinfo['fidname'], + 'begintime' => $time, + 'user' => $_POST['kt_user'], + 'pass' => $_POST['kt_pass'], + 'fid' => $_POST['id'], + 'mail' => $_POST['kt_mail'], + 'kami' => $_POST['kt_key'], + 'uqq' => $_POST['kt_adminqq'], + 'ip' => get_real_ip(), + 'status' => '1', + 'type' => 3, + + ); + } else if ($_POST['type'] == '2') { + //卡密方式 + if (!$userinfo = $db->select_first_row('sq_user', '*', array('username' => $_POST['kt_user'], 'appid' => $fidinfo['appid']), 'AND')) { + $userkey = $userinfo['username']; + $tips .= '开通方式:新开卡密
      '; + } else { + $userkey = ''; + $tips .= '开通方式:续费卡密(' . $_POST['kt_user'] . ')
      '; + } + $newtrade = array('name' => $fidinfo['fidname'], + 'tradeno' => $tradno, + 'begintime' => $time, + 'user' => $_POST['kt_user'], + 'fid' => $_POST['id'], + 'paymoney' => $spendmoney, + 'mail' => $_POST['kt_mail'], + 'paytype' => 'tck', + 'onlinepaytype' => '', + 'uqq' => $_POST['kt_adminqq'], + 'kami' => $_POST['kt_key'], + 'ip' => get_real_ip(), + 'status' => '1', + 'type' => 3, + 'pass'=>'' + ); + + } else { + //检查绑定 + + $tips_ = ''; + if ($appinfo['bindip'] == '1') { + $check['lip'] = $_POST['kt_ip']; + if (empty($_POST['kt_ip']) || $_POST['kt_ip'] == 'undefined') { + die(json_encode(array('code' => -10, 'msg' => '绑定的IP不能为空'))); + } + $tips_ .= '绑定IP:' . $check['lip'] . '
      '; + } + if ($appinfo['bindmac'] == '1') { + $check['mac'] = $_POST['kt_mac']; + if (empty($_POST['kt_mac']) || $_POST['kt_mac'] == 'undefined') { + die(json_encode(array('code' => -10, 'msg' => '绑定的机器不能为空'))); + } + $tips_ .= '绑定机器:' . $check['mac'] . '
      '; + + } + if ($appinfo['bindqq'] == '1') { + $check['rqq'] = $_POST['kt_robotqq']; + if (empty($_POST['kt_robotqq']) || $_POST['kt_robotqq'] == 'undefined') { + die(json_encode(array('code' => -10, 'msg' => '绑定的机器人QQ不能为空'))); + } + $tips_ .= '绑定QQ:' . $check['rqq'] . '
      '; + } + //$check['appid'] = $appinfo['ID']; + if (empty($check)) { + die(json_encode(array('code' => -10, 'msg' => '系统内部错误(应用绑定信息配置异常),请联系管理员解决'))); + } + $tradno = $time . rand_str(10, 'num'); + $newtrade = array('name' => $fidinfo['fidname'], + 'tradeno' => $tradno, + 'begintime' => $time, + 'user' => json_encode($check), + 'fid' => $_POST['id'], + 'paymoney' => $spendmoney, + 'mail' => $_POST['kt_mail'], + 'paytype' => 'tck', + 'onlinepaytype' => '', + 'kami' => $_POST['kt_key'], + 'ip' => get_real_ip(), + 'status' => '1', + 'uqq' => $_POST['kt_adminqq'], + 'type' => 3, + 'pass'=>'' + ); + + if (!$userinfo = $db->select_first_row('sq_user', '*', $check, 'AND')) { + $tips .= '开通方式:新开授权
      绑定信息如下:
      ' . $tips_ . '

      '; + } else { + $tips .= '开通方式:续费授权
      绑定信息如下:
      ' . $tips_ . '

      '; + } + } + //$newtrade['ID'] = $db->insert_back_id('sq_trade', $newtrade); + + include_once './function/function_auth.php'; + $back = auth_add($newtrade['user'],$newtrade['pass'],$newtrade['ip'], $fidinfo['num'],$newtrade['uqq'],$newtrade['mail'],$fidinfo['appid'],3,$info['ID'],$newkey,$tips,$newtrade); + $db->update('sq_fidkey',array('ID'=>$info['ID']),'AND',array('usetime'=>time(),'user'=>$newtrade['user'])); + if ($back == 1){ + die(makejson(1,$tips.'授权新开成功!')); + }else if ($back==2){ + die(makejson(1,$tips.'授权续费成功!')); + }else if ($back==3){ + die(makejson(2,'授权登录卡密生成成功,请使用此卡密登录授权:'.$newkey)); + }else{ + die(makejson($back,$tips)); + } + + break; + case 'changegetform': + include './function/function_app.php'; + if(!$appinfo = app_idgetinfo(intval($_POST['appid']))){ + die(''); + } + $output = ''; + if ($appinfo['logintype'] == 'zhmm') { + $output .= ' + +
      + + + +
      +
      + + + + +
      + '; + $type = 1; + } else if ($appinfo['logintype'] == 'kmsq') { + $output .= ' +
      + + +
      '; + $type = 2; + }else if ($appinfo['logintype'] == 'jcbd') { + if ($appinfo['bindqq'] == '1') { + $output .= ' +
      + + + + +
      + '; + } + if ($appinfo['bindmac'] == '1') { + $output .= '
      + + + + +
      + '; + } + if ($appinfo['bindip'] == '1') { + $output .= '
      + + + + +
      + '; + } + $type = 3; + } else { + die('未知授权方式:' . $appinfo['logintype']); + } + + $check = false; + if ($appinfo['bindqq'] == '1') { + $check = true; + $output .= ' +
      + + + + +
      + '; + } + if ($appinfo['bindmac'] == '1') { + $check = true; + $output .= '
      + + + + +
      + '; + } + if ($appinfo['bindip'] == '1') { + $check = true; + $output .= '
      + + + + +
      + '; + } + if(!$check){ + die(''); + } + die($output); + break; + case 'ChangeGetVerCode': + include './function/VerificationCode.class.php'; + $verification = Verification::check($_POST['token']); + if ($verification !== true) { + die(json_encode(array('code' => '-88', 'msg' => '请先进行人机验证'))); + } + include './function/function_app.php'; + if(!$appinfo = app_idgetinfo(intval($_POST['applist']))){ + die(makejson(-1,'请先选择一个应用')); + } + $appid = $_POST['applist']; + if ($appinfo['logintype'] === 'zhmm'){ + if (empty($_POST['kt_user']) || empty($_POST['kt_pass'])){ + die(makejson(-2,'请输入您的登录信息')); + } + if (!$userinfo = $db->select_first_row('sq_user','ID,sendtime,mail',array('username'=>$_POST['kt_user'],'password'=>$_POST['kt_pass'],'appid'=>$appid),'AND')){ + die(makejson(-3,'未查询到您的授权信息!
      请检查您输入的账号密码是否正确!')); + } + }else if ($appinfo['logintype'] === 'kmsq'){ + if (empty($_POST['kt_user'])){ + die(makejson(-2,'请输入您登录使用的卡密')); + } + if (!$userinfo = $db->select_first_row('sq_user','ID,sendtime,mail',array('username'=>$_POST['kt_user'],'appid'=>$appid),'AND')){ + die(makejson(-3,'未查询到您的授权信息!
      请检查您输入的卡密是否正确!')); + } + }else if ($appinfo['logintype'] === 'jcbd'){ + $where['appid'] = $appid; + $check = false; + if ($appinfo['bindip'] == '1') { + if (empty($_POST['kt_ip'])){ + die(makejson(-21,'请输入您当前已授权的IP')); + } + $where['lip'] = $_POST['kt_ip']; + $check = true; + } + if ($appinfo['bindmac'] == '1') { + if (empty($_POST['kt_mac'])){ + die(makejson(-22,'请输入您当前已授权的设备')); + } + $where['mac'] = $_POST['kt_mac']; + $check = true; + } + if ($appinfo['bindqq'] == '1') { + if (empty($_POST['kt_robotqq'])){ + die(makejson(-23,'请输入您当前已授权的机器人QQ')); + } + $where['rqq'] = $_POST['kt_robotqq']; + $check = true; + } + if (!$userinfo = $db->select_first_row('sq_user','ID,sendtime,mail',$where,'AND')){ + die(makejson(-7,'未查询到您的授权信息')); + } + } + $_SESSION['change_uid'] = $userinfo['ID']; + if ($_POST['cg_mail'] !== $userinfo['mail']){ + die(makejson(-5,'输入的邮箱与授权开通时候的邮箱不符,请重新输入')); + } + if (time() - (int)$userinfo['sendtime'] < 120){ + die(makejson(-4,'邮件发送频率过快,请等待 ' .( 120 - (time() - (int)$userinfo['sendtime'])).'秒后再发送')); + } + + $newvercode = rand_str(6); + + $db->update('sq_user',array('ID'=>$userinfo['ID'],'appid'=>$_POST['applist']),'AND',array('mailcode'=>$newvercode,'sendtime'=>time())); + $T['title'] = '换绑操作验证码'; + $T['content'][] = '验证码:'.$newvercode; + $T['content'][] = '发送时间:'.Get_Date(time()); + $T['content'][] = '到期时间:'.Get_Date(time()+300); + $T['content'][] = '注意:若您没有执行换绑操作请忽略此邮件并严格保密邮件内容!'; + $MailTips[] = $T; + + if(SendTipsMail($userinfo['mail'],$MailTips,$backinfo)){ + die(makejson(1,'邮件发送成功')); + }else{ + $db->update('sq_user',array('ID'=>$userinfo['ID']),'AND',array('mailcode'=>'','sendtime'=>0)); + die(makejson('-4',$backinfo)); + } + break; + case 'postchange': + if (empty($_SESSION['change_uid'])){ + die('缓存中未找到验证码请求,请先获取验证码'); + } + if (!$userinfo = $db->select_first_row('sq_user','sendtime,mailcode',array('ID'=>$_SESSION['change_uid'],'appid'=>$_POST['applist']),'AND')){ + die('缓存中的用户不存在,请尝试重新请求验证码'); + } + if ($userinfo['sendtime'] + 300 < time()){ + die('验证码已过期,请尝试重新获取'); + } + if ($userinfo['mailcode'] !== $_POST['cg_vercode']){ + die('验证码错误,请重新输入'); + } + + include_once './function/function_app.php'; + if(!$appinfo = app_idgetinfo($_POST['appid'])){ + die('服务器错误:应用无法找到'); + } + $updata['sendtime'] = 0; + $updata['mailcode'] = ''; + + if ($appinfo['bindqq'] == '1') { + $updata['rqq']=$_POST['cg_robotqq']; + } + if ($appinfo['bindmac'] == '1') { + $updata['mac']=$_POST['cg_mac']; + } + if ($appinfo['bindip'] == '1') { + $updata['lip']=$_POST['cg_ip']; + } + $db->update('sq_user',array('ID'=>$_SESSION['change_uid'],'appid'=>$_POST['applist']),'AND',$updata); + die('用户绑定信息修改成功'); + break; + default: + die('未知请求'); +} +function GetBuyFormHtml($appinfo,&$type){ + $output = ''; + if ($appinfo['logintype'] == 'zhmm') { + $output .= ' + +
      + + + +
      +
      + + + + +
      + '; + $type = 1; + } else if ($appinfo['logintype'] == 'kmsq') { + $output .= ' +
      + + + + +
      '; + $type = 2; + } else if ($appinfo['logintype'] == 'jcbd') { + if ($appinfo['bindqq'] == '1') { + $output .= ' +
      + + + + +
      + '; + } + if ($appinfo['bindmac'] == '1') { + $output .= '
      + + + + +
      + '; + } + if ($appinfo['bindip'] == '1') { + $output .= '
      + + + + +
      + '; + } + $type = 3; + } else { + die('未知授权方式:' . $appinfo['logintype']); + } + return $output; +} \ No newline at end of file diff --git a/api.php b/api.php new file mode 100644 index 0000000..728d360 --- /dev/null +++ b/api.php @@ -0,0 +1,391 @@ +select_first_row('sq_apps','*',array('ID'=>$_GET['appid']),'AND')){ + die('?'); +} +$yymy = $appinfo['connectkey']; +$txmy = $appinfo['decryptkey']; +unset($appinfo['connectkey']); +unset($appinfo['decryptkey']); +$userip=get_real_ip(); +/* + * 判断请求mod来区分各个功能 + */ +if (empty($_GET['mod'])){ + die(); +} + +if ($_GET['mod'] == 'GetTempKey'){ + $tempkey = $communication->GET_Temp_Key(); + $_SESSION['tempkey'] = $tempkey; + die($communication->str_encode($tempkey,$yymy,'qianming')); +} + +if (empty($_SESSION['tempkey'])){ + die('-1'); +} +$sign = $communication->str_sign($_POST['DATA'],$txmy,$_SESSION['tempkey']); +if ($_GET['sign'] !== $sign){ + echo ($communication->str_encode('签名校验失败!'.$sign,$yymy,$_SESSION['tempkey'])); + unset($_SESSION['tempkey']); + die(); +} + + +$decode = $communication->str_decode($_POST['DATA'],$yymy,$_SESSION['tempkey']); +if(!$postdata = json_decode($decode,true)){ + echo ($communication->str_encode('Json格式貌似有错误?'.$decode,$yymy,$_SESSION['tempkey'])); + unset($_SESSION['tempkey']); + die(); +} + +switch ($_GET['mod']){ + case 'Initialization': + backmsg('1'); + break; + case 'GetAppInfo': + $bool = true; + $i = 0 ; + while ($bool){ + if (isset($appinfo[$i])){ + unset($appinfo[$i]); + }else{ + $bool = false; + } + $i ++ ; + } + backmsg('1','',$appinfo); + break; + case 'GetCustomData': + $userinfo = getuserinfo($appinfo,$postdata); + + if ($appinfo['usetype'] == 'dqsj'){ + if ($userinfo['balance'] < time() && $userinfo['balance'] != '-1'){ + backmsg('-4','您的授权已到期,请先续费授权!'); + } + }else if($appinfo['usetype'] == 'kcye'){ + if ($userinfo['balance'] <= 0 && $userinfo['balance'] != '-1'){ + backmsg('-5','授权余额不足,请先进行充值'); + } + }else{ + backmsg('-6','应用信息配置错误,请联系管理员进行处理'); + } + if ($appinfo['bindip'] == '1' && !empty($userinfo['lip']) && $userinfo['lip'] !== $userip){ + backmsg('-7','请在绑定的IP['.$userinfo['lip'].']上面登陆,当前IP['.$userip.']'); + } + if ($appinfo['bindmac'] == '1' && !empty($userinfo['mac']) && $userinfo['mac'] !== $postdata['mac']){ + backmsg('-8','请在绑定的设备['.$userinfo['mac'].']上面登陆'); + } + if ($appinfo['bindqq'] == '1' && !empty($userinfo['rqq']) && $userinfo['rqq'] !== $postdata['robot']){ + backmsg('-8','绑定的QQ['.$userinfo['rqq'].']与当前QQ['.$postdata['robot'].']不符'); + } + + + backmsg('1','',array('data'=>$appinfo['data'])); + break; + case 'CheckAuth': + $userinfo = getuserinfo($appinfo,$postdata); + + if ($appinfo['usetype'] == 'dqsj'){ + if ($userinfo['balance'] < time() && $userinfo['balance'] != '-1'){ + backmsg('-4','您的授权已到期,请先续费授权!'); + } + }else if($appinfo['usetype'] == 'kcye'){ + if ($userinfo['balance'] <= 0){ + backmsg('-5','授权余额不足,请先进行充值'); + } + }else{ + backmsg('-6','应用信息配置错误,请联系管理员进行处理'); + } + $userip = get_real_ip(); + if ($appinfo['bindip'] == '1' && !empty($userinfo['lip']) && $userinfo['lip'] !== $userip){ + backmsg('-7','请在绑定的IP['.$userinfo['lip'].']上面登陆,当前IP['.$userip.']'); + } + if ($appinfo['bindmac'] == '1' && !empty($userinfo['mac']) && $userinfo['mac'] !== $postdata['mac']){ + backmsg('-8','请在绑定的设备['.$userinfo['mac'].']上面登陆'); + } + if ($appinfo['bindqq'] == '1' && !empty($userinfo['rqq']) && $userinfo['rqq'] !== $postdata['robot']){ + backmsg('-8','绑定的QQ['.$userinfo['rqq'].']与当前QQ['.$postdata['robot'].']不符'); + } + if ($appinfo['onlinecheck'] == '1' && ((time() - $userinfo['htime']) < $appinfo['onlinesecond'])){ + backmsg('-8','用户尚未下线!'); + } + $db->update('sq_user',array('ID'=>$userinfo['ID'],'appid'=>$_GET['appid']),'AND',array('rqq'=>$postdata['robot'],'mac'=>$postdata['mac'],'lip'=>$userip,'ltime'=>time())); + backmsg('1','登陆成功!'); + break; + case 'GetUserInfo': + $userip = get_real_ip(); + if ($appinfo['logintype'] == 'zhmm'){ + if(!$userinfo = $db->select_first_row('sq_user','*',array('appid'=>$_GET['appid'],'username'=>$postdata['user']),'AND')){ + backmsg('-1','账号不存在'); + } + if ($postdata['pass'] !== $userinfo['password']){ + backmsg('-2','您输入的密码错误'); + } + }else if ($appinfo['logintype'] == 'kmsq'){ + if(!$userinfo = $db->select_first_row('sq_user','*',array('appid'=>$_GET['appid'],'username'=>$postdata['user']),'AND')){ + backmsg('-1','授权卡密不存在'); + } + }else if ($appinfo['logintype'] == 'jcbd'){ + $where['appid'] = $_GET['appid']; + if ($appinfo['bindip'] == '1'){ + $where['lip'] = $postdata['lip']; + } + if ($appinfo['bindmac'] == '1'){ + $where['mac'] = $postdata['mac']; + } + if ($appinfo['bindqq'] == '1'){ + $where['rqq'] = $postdata['robot']; + } + if(!$userinfo = $db->select_first_row('sq_user','username,mac,rip,uqq,mail,ltime,balance,rqq,lip,ltime',$where,'AND')){ + backmsg('-1','未查询到您的授权'); + } + } + backmsg('1','',$userinfo); + break; + case 'OnlineHeart': + $userinfo = getuserinfo($appinfo,$postdata); + if ($appinfo['usetype'] == 'dqsj'){ + if ($userinfo['balance'] < time() && $userinfo['balance'] != '-1'){ + backmsg('-4','您的授权已到期,请先续费授权!'); + } + }else if($appinfo['usetype'] == 'kcye'){ + if ($userinfo['balance'] <= 0 && $userinfo['balance'] != '-1'){ + backmsg('-5','授权余额不足,请先进行充值'); + } + }else{ + backmsg('-6','应用信息配置错误,请联系管理员进行处理'); + } + if ($appinfo['bindip'] == '1' && !empty($userinfo['lip']) && $userinfo['lip'] !== $userip){ + backmsg('-7','请在绑定的IP['.$userinfo['lip'].']上面登陆,当前IP['.$userip.']'); + } + if ($appinfo['bindmac'] == '1' && !empty($userinfo['mac']) && $userinfo['mac'] !== $postdata['mac']){ + backmsg('-8','请在绑定的设备['.$userinfo['mac'].']上面登陆'); + } + if ($appinfo['bindqq'] == '1' && !empty($userinfo['rqq']) && $userinfo['rqq'] !== $postdata['robot']){ + backmsg('-8','绑定的QQ['.$userinfo['rqq'].']与当前QQ['.$postdata['robot'].']不符'); + } + if ($appinfo['usetype'] == 'kcye'){ + $time = time(); + $chazhi = time()-$userinfo['lastreducetime']; + if ($chazhi > $appinfo['onlinesecond']+120){ + //新登录 + $lastbalance = $userinfo['balance'] - $appinfo['cycreduce']; + $lastreducetime = $time; + }else{ + //在线减 + $oninemin = (int)($chazhi/60); + $lastbalance = $userinfo['balance'] - $appinfo['cycreduce']*$oninemin; + $lastreducetime = $userinfo['lastreducetime'] - $oninemin*60; + } + $db->update('sq_user',array('ID'=>$userinfo['ID'],'appid'=>$_GET['appid']),'AND',array('htime'=>time(),'balance'=>$lastbalance,'lastreducetime'=>$lastreducetime)); + }else{ + $db->update('sq_user',array('ID'=>$userinfo['ID'],'appid'=>$_GET['appid']),'AND',array('htime'=>time())); + } + backmsg('1',time()); + break; + case 'Unbundling': + if ($appinfo['logintype'] == 'jcbd'){ + backmsg('-12','检查绑定方式登陆的授权不允许解除绑定'); + } + $userinfo = getuserinfo($appinfo,$postdata); + if ($userinfo['mailcode']!== $postdata['vcode']){ + backmsg('-13','验证码输入错误,请重新输入'); + } + if ($userinfo['sendtime'] < time()-600){ + backmsg('-13','验证码已过期,请尝试重新获取'); + } + if ($appinfo['usetype'] == 'dqsj'){ + if ($userinfo['balance']-$appinfo['unbindreduce'] < time() && $userinfo['balance'] != '-1'){ + backmsg('-4','授权时长不足,无法解绑'); + } + }else if($appinfo['usetype'] == 'kcye'){ + if ($userinfo['balance']-$appinfo['unbindreduce'] <= 0 && $userinfo['balance'] != '-1'){ + backmsg('-5','授权余额不足,无法解绑'); + } + }else{ + backmsg('-6','应用信息配置错误,请联系管理员进行处理'); + } + if ($userinfo['balance'] != '-1'){ + $lastbalance = $userinfo['balance'] - $appinfo['unbindreduce']; + }else{ + $lastbalance = '-1'; + } + + $db->update('sq_user',array('ID'=>$userinfo['ID']),'AND',array('mailcode'=>'','sendtime'=>0,'mac'=>'','lip'=>'','rqq'=>'','balance'=>$lastbalance)); + if ($appinfo['usetype'] == 'dqsj'){ + backmsg('1',"解除绑定成功,扣除{$appinfo['unbindreduce']}分钟授权"); + }else{ + backmsg('1',"解除绑定成功,扣除{$appinfo['unbindreduce']}点余额"); + } + break; + case 'ReplacBinding': + $userinfo = getuserinfo($appinfo,$postdata); + if ($userinfo['mailcode']!== $postdata['vcode']){ + backmsg('-13','验证码输入错误,请重新输入'); + } + if ($userinfo['sendtime'] < time()-600){ + backmsg('-13','验证码已过期,请尝试重新获取'); + } + if ($appinfo['usetype'] == 'dqsj'){ + if ($userinfo['balance']-$appinfo['unbindreduce'] < time() && $userinfo['balance'] != '-1'){ + backmsg('-4','授权时长不足,无法换绑'); + } + }else if($appinfo['usetype'] == 'kcye'){ + if ($userinfo['balance']-$appinfo['unbindreduce'] <= 0 && $userinfo['balance'] != '-1'){ + backmsg('-5','授权余额不足,无法换绑'); + } + }else{ + backmsg('-6','应用信息配置错误,请联系管理员进行处理'); + } + + if ($userinfo['balance'] != '-1'){ + $lastbalance = $userinfo['balance'] - $appinfo['unbindreduce']; + }else{ + $lastbalance = '-1'; + } + $db->update('sq_user',array('ID'=>$userinfo['ID']),'AND',array('mailcode'=>'','sendtime'=>0,'mac'=>$postdata['newmac'],'lip'=>$postdata['newip'],'rqq'=>$postdata['newrobot'],'balance'=>$lastbalance)); + if ($appinfo['usetype'] == 'dqsj'){ + backmsg('1',"更换绑定成功,扣除{$appinfo['unbindreduce']}分钟授权"); + }else{ + backmsg('1',"更换绑定成功,扣除{$appinfo['unbindreduce']}点余额"); + } + break; + case 'ChangePassword': + if ($appinfo['logintype'] !== 'zhmm'){ + backmsg('-13','非账号密码方式授权无法修改密码'); + } + $userinfo = getuserinfo($appinfo,$postdata); + if ($userinfo['mailcode']!== $postdata['vcode']){ + backmsg('-13','验证码输入错误,请重新输入'); + } + if ($userinfo['sendtime'] < time()-600){ + backmsg('-13','验证码已过期,请尝试重新获取'); + } + + $db->update('sq_user',array('ID'=>$userinfo['ID']),'AND',array('password'=>$postdata['newpass'])); + backmsg('1'); + break; + case 'SubscriberDownline': + $userinfo = getuserinfo($appinfo,$postdata); + $db->update('sq_user',array('ID'=>$userinfo['ID']),'AND',array('htime'=>0)); + backmsg('1'); + break; + case 'BalanceRecharge': + $userinfo = getuserinfo($appinfo,$postdata); + if ($userinfo['balance'] == '-1'){ + backmsg('-15','您的授权已是永久授权,无需续费!'); + } + if (!$keyinfo = $db->select_first_row('sq_key','*',array('kami'=>$postdata['key']),'AND')){ + backmsg('-13','您输入的卡密不存在'); + } + if ($keyinfo['lastmoney'] < $postdata['money']){ + backmsg('-13','卡密余额不足'); + } + if ($appinfo['usetype'] == 'dqsj'){ //当授权方式为到期时间 + if ($userinfo['balance'] < time()){ //判断是否已经过期,如果 用户的到期时间小于当前时间 + $newbalance = time() + $appinfo['rechargeface'] * $postdata['money'] *60; + //新到期时间 = 当前时间 + 充值面值 * 充值数量 * 60 + }else{ + $newbalance = $userinfo['balance'] + $appinfo['rechargeface'] * $postdata['money']*60; + //否则新到期时间 = 原有时间 + 充值面值 * 充值数量 *60 + } + }else if ($appinfo['usetype'] == 'kcye'){ + $newbalance = $userinfo['balance'] + $appinfo['rechargeface'] * $postdata['money']; + } + $newmoney = $keyinfo['lastmoney'] - $postdata['money']; + if ($keyinfo['firstusetime'] == 0){ + $newinfo['firstusetime'] = time(); + } + $newinfo['lastmoney'] = $newmoney; + $newinfo['lastusetime'] = time(); + $db->update('sq_key',array('ID'=>$keyinfo['ID']),'AND',$newinfo); + $db->update('sq_user',array('ID'=>$userinfo['ID']),'AND',array('balance'=>$newbalance)); + backmsg('1'); + break; + case 'RegisteredAccount': + $accessurl = 'http://'.$G['config']['pay_domain'].'/ajax.php?mod=register&username='.urlencode($postdata['user']).'&pass='.urlencode($postdata['pass']).'&mail='.urlencode($postdata['mail']); + $tittle = ''; + break; + case 'GetVerifyingCode': + $userinfo = getuserinfo($appinfo,$postdata); + if (time()-$userinfo['sendtime'] < 60){ + backmsg('-1','邮件发送过于频繁,请耐心等待'.(time()-$userinfo['sendtime']).'秒后发送'); + } + $code = rand_str(6); + $db->update('sq_user',array('ID'=>$userinfo['ID']),'AND',array('mailcode'=>$code,'sendtime'=>time())); + if(!$back = sendemail('验证码 - '.$appinfo['appname'],'['.$userinfo['username'].']您正在进行敏感操作,您本次操作的验证码为:'.$code,$userinfo['mail'])){ + backmsg('-1',$back); + } + backmsg('1'); + break; + case 'RetrievePassword': + $userinfo = getuserinfo($appinfo,$postdata); + if (time()-$userinfo['sendtime'] < 60){ + backmsg('-1','邮件发送过于频繁,请耐心等待'.(time()-$userinfo['sendtime']).'秒后发送'); + } + $db->update('sq_user',array('ID'=>$userinfo['ID']),'AND',array('sendtime'=>time())); + sendemail('找回密码 - '.$appinfo['appname'],'['.$userinfo['username'].']您的密码为:'.$userinfo['password'],$userinfo['mail']); + backmsg('1'); + break; + +} +function backmsg($code,$message='',$array = array()){ + global $communication; + global $yymy; + $back = $array; + $back['code'] = $code; + $back['msg'] = $message; + + echo ($communication->str_encode(json_encode($back),$yymy,$_SESSION['tempkey'])); + unset($_SESSION['tempkey']); + die(); +} +function getuserinfo($appinfo,$postdata){ + $userip = get_real_ip(); + global $db; + if ($appinfo['logintype'] == 'zhmm'){ + if(!$userinfo = $db->select_first_row('sq_user','*',array('appid'=>$_GET['appid'],'username'=>$postdata['user']),'AND')){ + backmsg('-1','账号不存在'); + } + if ($postdata['pass'] !== $userinfo['password']){ + backmsg('-2','您输入的密码错误'); + } + }else if ($appinfo['logintype'] == 'kmsq'){ + if(!$userinfo = $db->select_first_row('sq_user','*',array('appid'=>$_GET['appid'],'username'=>$postdata['user']),'AND')){ + backmsg('-1','授权卡密不存在'); + } + }else if ($appinfo['logintype'] == 'jcbd'){ + $where['appid'] = $_GET['appid']; + if ($appinfo['bindip'] == '1'){ + $where['lip'] = $userip; + } + if ($appinfo['bindmac'] == '1'){ + $where['mac'] = $postdata['mac']; + } + if ($appinfo['bindqq'] == '1'){ + $where['rqq'] = $postdata['robot']; + } + if(!$userinfo = $db->select_first_row('sq_user','*',$where,'AND')){ + backmsg('-1','未查询到您的授权'); + } + } + if ($userinfo['status'] != '1'){ + backmsg('-3','用户状态不正常,请联系客服处理'); + } + + return $userinfo; +} \ No newline at end of file diff --git a/api/Communication.php b/api/Communication.php new file mode 100644 index 0000000..0a1ef2b --- /dev/null +++ b/api/Communication.php @@ -0,0 +1,238 @@ +getsign($data) !== $_GET['sign']) die(makejson(-3,$Tips['SignError'])); +$time = time(); +$d = !empty($_GET['c']) && $_GET['c'] == 'api' ? $data : $communication->data_decode($data); +unset($data); +$data = json_decode($d,true); +$sign = ''; +if ($data['mod'] === 'Initialization'){ + if ($data['ddition'] < $appinfo['ver'] && numtobool($appinfo['forceup'])) $communication->back(-101,'AppVerOld',array('updateurl'=>$appinfo['upurl'],'updatelog'=>$appinfo['uplog'],'notice'=>$appinfo['notice'])); + if (numtobool($appinfo['close'])) $communication->back(-102,'AppClosed',array('updateurl'=>$appinfo['upurl'],'updatelog'=>$appinfo['uplog'],'notice'=>$appinfo['notice'])); + $token = rand_str(64); + $db->insert_back_id('sq_token',array('token'=>$token,'ip'=>get_real_ip(),'addtime'=>$time,'appid'=>$_GET['appid'])); + $communication->back(1,'',array('updateurl'=>$appinfo['upurl'],'updatelog'=>$appinfo['uplog'],'notice'=>$appinfo['notice'],'token'=>$token)); +} + +if ($data['mod'] === 'Login'){ + //echo 'login'; + if (empty($data['token']) || !$tokeninfo = $db->select_first_row('sq_token','uid,ip',array('token'=>$data['token']),'AND')) $communication->back(-201,'InitTimeOut'); + + $userip = empty($data['ip']) ? get_real_ip() : $data['ip']; + if ($appinfo['free']) { + $db->update('sq_token',array('token'=>$data['token']),'AND',array('uid'=>0,'start'=>time())); + $communication->back(1); + } + + if ($appinfo['logintype'] == 'zhmm') { + if (empty($data['user'])) $communication->back(-202,'NoUsername'); + + if (empty($data['pass'])) $communication->back(-203,'NoPassword'); + + if (!$userinfo = $db->select_first_row('sq_user', '*', array('appid' => $_GET['appid'], 'username' => $data['user']), 'AND')) $communication->back(-204,'ErrorUsername'); + + if ($data['pass'] !== $userinfo['password']) $communication->back(-205,'ErrorPassword'); + + } else if ($appinfo['logintype'] == 'kmsq') { + if (empty($data['user'])) $communication->back(-211,'NoKami'); + if (!$userinfo = $db->select_first_row('sq_user', '*', array('appid' => $_GET['appid'], 'username' => $data['user']), 'AND')) $communication->back(-212,'ErrorKami'); + + } else if ($appinfo['logintype'] == 'jcbd') { + $where['appid'] = $_GET['appid']; + if ($appinfo['bindip'] == 1) $where['lip'] = $userip; + if ($appinfo['bindmac'] == 1) $where['mac'] = $data['mac']; + if ($appinfo['bindqq'] == 1) $where['rqq'] = $data['robot']; + + if (!$userinfo = $db->select_first_row('sq_user', '*', $where, 'AND')) $communication->back(-221,'ErrorBind'); + } + if ($userinfo['status'] != 1) $communication->back(-231,'UserCold'); + if ($appinfo['usetype'] == 'dqsj') { + if ($userinfo['balance'] < time() && $userinfo['balance'] != '-1') $communication->back(-232,'AuthTimeOut',array('balance'=>$userinfo['balance'])); + + } else if ($appinfo['usetype'] == 'kcye') { + if ($userinfo['balance'] <= 0) $communication->back(-233,'BalanceOut'); + } else { + $communication->back(-4,'GetAppInfoErr'); + } + $bindip = $userinfo['lip']; + $bindmac = $userinfo['mac']; + $usermac = $data['mac']; + $bindrqq = $userinfo['rqq']; + $userqq = $data['robot']; + + if ($appinfo['bindip'] == 1 && !empty($userinfo['lip']) && $userinfo['lip'] !== $userip) { + $communication->back(-234,'IpBindNeed',array('bindip'=>$userinfo['lip'])); + + } + if ($appinfo['bindmac'] == 1 && !empty($userinfo['mac']) && $bindmac !== $usermac) { + $communication->back(-235,'MacBindNeed',array('bindmac'=>$userinfo['mac'])); + } + if ($appinfo['bindqq'] == 1 && !empty($userinfo['rqq']) && $bindrqq !== $userqq) { + $communication->back(-236,'QQBindNeed',array('bindqq'=>$userinfo['rqq'])); + } + + $db->update('sq_user', array('ID' => $userinfo['ID']), 'AND', array('rqq' =>$userqq, 'mac' =>$usermac, 'lip' => $userip, 'ltime' => time())); + //$token = rand_str(64); + $db->update('sq_token',array('token'=>$data['token']),'AND',array('uid'=>$userinfo['ID'],'start'=>time())); + //$db->insert_back_id('sq_token',array('token'=>$token,'uid'=>$userinfo['ID'],'lastest'=>$time,'start'=>$time)); + if ($appinfo['onlinecheck'] == 1) { + $onlineuser = $db->select_all_row('sq_token','lastest',array('uid'=>$userinfo['ID']),'AND','ORDER BY lastest DESC'); + foreach ($onlineuser as $on){ + if ((time() - $on['lastest']) < $appinfo['onlinesecond']){ + $communication->back(-301,'LoggedInTips',array('ip'=>$tokeninfo['ip'],'')); + }else{ + break; + } + } + } + $communication->back(1); + +} + +if ($data['mod'] === 'GoOnline'){ + if (empty($data['token']) || !$tokeninfo = $db->select_first_row('sq_token','*',array('token'=>$data['token']),'AND')) $communication->back(-201,'InitTimeOut'); + if ($tokeninfo['start'] == 0 || empty($tokeninfo['start'])){ + $communication->back(-201,'InitTimeOut'); + } + if ($appinfo['free']) { + $db->update('sq_token',array('token'=>$data['token']),'AND',array('lastest'=>time())); + $communication->back(1); + } + if ($appinfo['onlinecheck'] == 1){ + $db->delete('sq_token',array('uid'=>$tokeninfo['uid']),'AND'); + } + //$db->insert_back_id('sq_token',array('token'=>$tokeninfo['token'],'uid'=>$tokeninfo['uid'],'start'=>$tokeninfo['start'],'lastest'=>time())); + $communication->back(1); + +} + +if ($data['mod'] === 'OnlineHeart'){ + if (empty($data['token'])) $communication->back(-401,'HeartNoToken'); + if (!$tokeninfo = $db->select_first_row('sq_token','*',array('token'=>$data['token']),'AND')) $communication->back(-402,'HeartTokenError'); + if ($tokeninfo['start'] == 0 || empty($tokeninfo['start'])){ + $communication->back(-201,'InitTimeOut'); + } + $db->update('sq_token',array('token'=>$data['token']),'AND',array('lastest'=>time())); + if ($appinfo['free']) { + $communication->back(1,'',array('time'=>$time)); + } + if (!$userinfo = $db->select_first_row('sq_user','*',array('ID'=>$tokeninfo['uid']),'AND')) $communication->back(-234,'HeartNoFoundUser'); + if ($userinfo['status'] != 1) $communication->back(-231,'UserCold'); + if ($appinfo['usetype'] == 'dqsj') { + if ($userinfo['balance'] < time() && $userinfo['balance'] != '-1') $communication->back(-232,'AuthTimeOut'); + } else if ($appinfo['usetype'] == 'kcye') { + if ($userinfo['balance'] <= 0) $communication->back(-233,'BalanceOut'); + } else { + $communication->back(-4,'GetAppInfoErr'); + } + + $msg = ''; + if ($appinfo['usetype'] == 'kcye') { + $time = time(); + $chazhi = time() - $userinfo['lastreducetime']; + if ($chazhi > $appinfo['onlinesecond'] + 120) { + //新登录 + $lastbalance = (int)$userinfo['balance'] - (int)$appinfo['cycreduce']; + $lastreducetime = $time; + $msg = '余额扣除成功'; + } else { + //在线减 + $oninemin = (int)($chazhi / 60); + $lastbalance = $userinfo['balance'] - $appinfo['cycreduce'] * $oninemin; + $lastreducetime = $userinfo['lastreducetime'] - $oninemin * 60; + $msg = '余额扣除成功'; + } + $db->update('sq_user', array('ID' => $userinfo['ID'], 'appid' => $_GET['appid']), 'AND', array('htime' => time(), 'balance' => $lastbalance, 'lastreducetime' => $lastreducetime)); + } else { + $db->update('sq_user', array('ID' => $userinfo['ID'], 'appid' => $_GET['appid']), 'AND', array('htime' => time())); + } + $communication->back(1,'',array('time'=>$time,'o'=>$msg)); +} + +if ($data['mod'] == 'GetCustumData'){ + if (empty($data['token'])) $communication->back(-401,'HeartNoToken'); + if (!$tokeninfo = $db->select_first_row('sq_token','*',array('token'=>$data['token']),'AND')) $communication->back(-402,'HeartTokenError'); + if ($tokeninfo['start'] == 0 || empty($tokeninfo['start'])){ + $communication->back(-201,'InitTimeOut'); + } + + if ($appinfo['free']) { + $communication->back(1,'',array('data'=>$appinfo['data'])); + } + if (!$userinfo = $db->select_first_row('sq_user','*',array('ID'=>$tokeninfo['uid']),'AND')) $communication->back(-234,'HeartNoFoundUser'); + if ($userinfo['status'] != 1) $communication->back(-231,'UserCold'); + if ($appinfo['usetype'] == 'dqsj') { + if ($userinfo['balance'] < time() && $userinfo['balance'] != '-1') $communication->back(-232,'AuthTimeOut'); + } else if ($appinfo['usetype'] == 'kcye') { + if ($userinfo['balance'] <= 0) $communication->back(-233,'BalanceOut'); + } else { + $communication->back(-4,'GetAppInfoErr'); + } + $communication->back(1,'',array('data'=>$appinfo['data'])); +} + +if ($data['mod'] == 'GetAppinfo'){ + if (empty($data['token']) || !$tokeninfo = $db->select_first_row('sq_token','uid',array('token'=>$data['token']),'AND')) $communication->back(-201,'InitTimeOut'); + + $bool = true; + $i = 0 ; + while ($bool){ + if (isset($appinfo[$i])){ + unset($appinfo[$i]); + }else{ + $bool = false; + } + $i ++ ; + } + $communication->back(1,'',$appinfo); +} + +if ($data['mod'] == 'GetUserInfo'){ + if (empty($data['token'])) $communication->back(-401,'HeartNoToken'); + if (!$tokeninfo = $db->select_first_row('sq_token','*',array('token'=>$data['token']),'AND')) $communication->back(-402,'HeartTokenError'); + if ($tokeninfo['start'] == 0 || empty($tokeninfo['start'])){ + $communication->back(-201,'InitTimeOut'); + } + + if ($appinfo['free']) { + $communication->back(2,''); + } + + if (!$userinfo = $db->select_first_row('sq_user','*',array('ID'=>$tokeninfo['uid']),'AND')) $communication->back(-234,'HeartNoFoundUser'); + if ($userinfo['status'] != 1) $communication->back(-231,'UserCold'); + if ($appinfo['usetype'] == 'dqsj') { + if ($userinfo['balance'] < time() && $userinfo['balance'] != '-1') $communication->back(-232,'AuthTimeOut'); + } else if ($appinfo['usetype'] == 'kcye') { + if ($userinfo['balance'] <= 0) $communication->back(-233,'BalanceOut'); + } else { + $communication->back(-4,'GetAppInfoErr'); + } + $communication->back(1,'',$userinfo); +} + +if($data['mod'] == 'OffLine'){ + if (empty($data['token'])) $communication->back(-401,'HeartNoToken'); + if (!$tokeninfo = $db->select_first_row('sq_token','*',array('token'=>$data['token']),'AND')) $communication->back(-402,'HeartTokenError'); + $db->delete('sq_token',array('token'=>$data['token']),'AND'); + $communication->back(1); +} diff --git a/api/monitor.php b/api/monitor.php new file mode 100644 index 0000000..9d266ba --- /dev/null +++ b/api/monitor.php @@ -0,0 +1,54 @@ +select_limit_row('sq_trade','*','',5,array('status'=>'2'),'AND') && count($result) > 0){ + include '../function/trade.inc.php'; + foreach ($result as $tradeinfo){ + if (!$db->update('sq_trade', array('tradeno' => $tradeno,'status'=>'2'), 'AND', array('status' => 3))) + $error[] = '[监控信息]订单状态更新失败:'.$tradeinfo['tradeno'].'[Error:'.$db->geterror().']'; + else + $log[] = '[监控信息] 订单号处理成功'; + trade_do($tradeinfo); + } +} + +//清理初始化后60分钟未操作的Token数据 +if($db->delete('sq_token','`lastest` = 0 AND `addtime` < '.(time()-3600).' AND `start` = 0','')){ + $num = $db->affected_num(); + if ($num > 0){ + $log[] = '[监控信息] 清理初始化后60分钟未操作的Token数据'.$num.'条'; + } +}else{ + $log[] = '[监控信息] 清理过程中发生错误:'.$db->geterror(); +} + +//清理心跳过期数据 +if(!$result = $db->select_all_row('sq_apps','ID,appname,onlinesecond')){ + $log[] = '[监控信息] 获取应用信息发生错误:'.$db->geterror(); +} +foreach ($result as $appinfo){ + if ($appinfo['onlinesecond'] >0 ){ + $OutTime = $appinfo['onlinesecond'] * 3; + if($db->delete('sq_token','`appid` = '.$appinfo['ID'].' AND `lastest` < '.$OutTime,'')){ + $num = $db->affected_num(); + if ($num > 0) { + $log[] = '[监控信息] 清理 '.$appinfo['appname'].' 过期Token数据' . $num . '条'; + } + }else{ + $log[] = '[监控信息] 清理 '.$appinfo['appname'].' 过期数据发生错误' . $db->geterror(); + } + } +} + diff --git a/auth.php b/auth.php new file mode 100644 index 0000000..3aa574b --- /dev/null +++ b/auth.php @@ -0,0 +1,122 @@ + + + + + + + + + + + + 套餐卡密在线使用开通授权 - <?php echo $G['config']['sitename'] ?> + + + + + + + +
      + +
      +
      + + 套餐卡密在线使用开通授权 - + +
      + + +
      +
      +
      + + +
      + +
      +
      +
      +
      + + +
      +
      +
      + +
      +
      +
      + + + +
      + + + + + + + + + + + + + diff --git a/change.php b/change.php new file mode 100644 index 0000000..5363c71 --- /dev/null +++ b/change.php @@ -0,0 +1,252 @@ + + + + + + + + + + + + 授权绑定在线更换 - <?php echo $G['config']['sitename'] ?> + + + + + + + +
      + +
      +
      + + 授权绑定在线更换 - + +
      + + +
      +
      +
      + + +
      + +
      +
      +
      +
      + + +
      + +
      + +
      + + +
      +
      +
      + +
      + + +
      + + +
      +
      +
      + + +
      + + + + + + + + + + + + + diff --git a/function/Encryption.class.php b/function/Encryption.class.php new file mode 100644 index 0000000..a6a3c6a --- /dev/null +++ b/function/Encryption.class.php @@ -0,0 +1,311 @@ +connectkey = $connectkey; + $this->decryptKey = $decryptKey; + } + + private function str_decode($str, $key, $key_rand) + {//解密函数 + return (string)$this->ARSC($this->BytesHex((string)$this->ARSC($this->BytesHex($str), (string)$key_rand)), $key); + } + + private function ARSC($Data, $Key) + { + $key[] = ""; + $box[] = ""; + $pwd_length = strlen($Key); + $data_length = strlen($Data); + for ($i = 0; $i < 256; $i++) { + $key[$i] = ord($Key[$i % $pwd_length]); + $box[$i] = $i; + } + for ($j = $i = 0; $i < 256; $i++) { + $j = ($j + $box[$i] + $key[$i]) % 256; + $tmp = $box[$i]; + $box[$i] = $box[$j]; + $box[$j] = $tmp; + } + $cipher = ''; + for ($a = $j = $i = 0; $i < $data_length; $i++) { + $a = ($a + 1) % 256; + $j = ($j + $box[$a]) % 256; + $tmp = $box[$a]; + $box[$a] = $box[$j]; + $box[$j] = $tmp; + + $k = $box[(($box[$a] + $box[$j]) % 256)]; + $cipher .= chr(ord($Data[$i]) ^ $k); + } + return $cipher; + } + + private function BytesHex($s) + { + $r = ""; + for ($i = 0; $i < strlen($s); $i += 2) { + $x1 = ord($s{$i}); + $x1 = ($x1 >= 48 && $x1 < 58) ? $x1 - 48 : $x1 - 97 + 10; + $x2 = ord($s{$i + 1}); + $x2 = ($x2 >= 48 && $x2 < 58) ? $x2 - 48 : $x2 - 97 + 10; + $r .= chr((($x1 << 4) & 0xf0) | ($x2 & 0x0f)); + } + return $r; + } + + private function str_encode($str, $key, $key_rand) + {//加密函数 + $key_temp = $this->HexBytes($this->ARSC($str, (string)$key_rand)); + $key_temp = strtoupper($this->HexBytes($this->ARSC($key_temp, $key))); + return $key_temp; + } + + private function HexBytes($s) + { + $r = ""; + $hexes = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"); + for ($i = 0; $i < strlen($s); $i++) { + $r .= ($hexes [(ord($s{$i}) >> 4)] . $hexes [(ord($s{$i}) & 0xf)]); + } + return $r; + } + + + /** + * @access DynamicEncryption + * @explain 该函数用于文本数据动态加密,每次加密结果不一致,但解密数据相同 + * @param string $date 将要加密的字符串 + * @param string $pas 加密密码 + * @return string 返回加密后的结果字符串 + */ + private function DynamicEncryption($date,$pas){ + $date = $this->_tobit($date); + if(count($date)%2 == 1){ + $date[] = '0'; + } + $date = $this->_DataDisruption($date); + $dateleng = count($date); + $Code = $this->_DataDisruption($this->_tobit ('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890~!@#$%^&*()_+|')); + $Codeleng = count($Code); + $pasbit = $this->_DataDisruption($this->_tobit($pas)); + $pasleng = count($pasbit); + $int2=0; + $int3=0; + $ret=Array(); + for ($x=1; $x<=$dateleng; $x++) { + $int2=$int2+1; + if($int2>$Codeleng){ + $int2=1; + } + $int3=$int3+1; + if($int3>$pasleng){ + $int3=1; + } + $randompas =mt_rand(1,5000); + $Bus = floor($randompas / $Codeleng + 1); + $Yu = $randompas % $Codeleng + 1; + $ret = array_merge($ret,array_slice($Code,floor($Bus)-1,1)); + $ret = array_merge($ret,array_slice($Code,floor($Yu)-1,1)); + + $tembit= $date[$x-1]^$Code[$int2-1]^$pasbit[$int3-1]^$randompas; + $Bus = $tembit / $Codeleng + 1; + $Yu = $tembit % $Codeleng + 1; + $ret = array_merge($ret,array_slice($Code,floor($Bus)-1,1)); + $ret = array_merge($ret,array_slice($Code,floor($Yu)-1,1)); + } + return $this->_bintotxt($ret); + } + + /** + * @access DynamicDecryption + * @explain 该函数用于文本数据动态解密 + * @param string $date 将要解密的字符串 + * @param string $pas 解密密码 + * @return string 返回解密后的结果字符串 + */ + private function DynamicDecryption($date,$pas){ + + $date = $this->_tobit($date); + $dateleng = count ($date); + $Code = $this->_DataDisruption ($this->_tobit ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890~!@#$%^&*()_+|")); + $Codeleng = count ($Code); + $pasbin = $this->_DataDisruption ($this->_tobit ($pas)); + $pasleng = count ($pasbin); + $ret = Array(); + $lnt3=0; + $lnt2=0; + for ($lnt1=1; $lnt1<=($dateleng/4); $lnt1++) { + $lnt2 = $lnt2 + 1 ; + if($lnt2 > $Codeleng){ + $lnt2 = 1; + } + $lnt3 = $lnt3 + 1 ; + if($lnt3 > $pasleng){ + $lnt3 = 1; + } + $Bus = array_slice($date, floor(($lnt1-1)*4+1)-1, 1); + $Bus = array_search($Bus[0],$Code); + $yu = array_slice($date, floor(($lnt1-1)*4+2)-1, 1); + $yu = array_search($yu[0],$Code); + $randompas = $Bus * $Codeleng + $yu; + $Bus = array_slice($date, floor(($lnt1-1)*4+3)-1, 1); + $Bus = array_search($Bus[0],$Code); + $yu = array_slice($date, floor(($lnt1-1)*4+4)-1, 1); + $yu = array_search($yu[0],$Code); + $tembit = $Bus * $Codeleng + $yu; + $tembit = $tembit^$Code[$lnt2-1]^$pasbin[$lnt3-1]^$randompas; + $ret[] = $tembit; + } + return $this->_bintotxt($this->_DataDisruption($ret)); + //return @iconv('gbk','utf-8',$this->_bintotxt($this->_DataDisruption($ret))); + } + + private function _bintotxt($bytes) { + $str=''; + foreach($bytes as $ch){ + $str.=chr($ch); + } + return $str; + } + private function _tobit($string){ + $bytes = array(); + for($i = 0; $i < strlen($string); $i++){ + $bytes[] = ord($string[$i]); + } + return $bytes; + } + private function _DataDisruption($date){ + $date1=array_slice($date,0,floor(count($date)/2)); + $date2=array_slice($date,ceil(count($date)-(count($date)/2))); + return @array_merge($this->_DataReverse($date1),$this->_DataReverse($date2)); + } + private function _DataReverse($date){ + $sj = array(); + for ($x=1; $x<=count($date); $x++) { + $sj[$x-1]=$date[count($date)-$x]; + } + return $sj; + } + + public function data_encode($data,&$sign){ + $data = $this->DynamicEncryption($data,$this->connectkey); + $sign =md5(md5($this->connectkey.$this->decryptKey).$data); + return $this->str_encode($data,$this->connectkey,$this->decryptKey); + } + + public function data_decode($data){ + $post_data = $this->str_decode($data,$this->connectkey,$this->connectkey); + return $this->rc4_decode($this->DynamicDecryption($post_data,$this->decryptKey)); + } + + public function getsign($data){ + $post_data = $this->str_decode($data,$this->connectkey,$this->connectkey); + return md5(md5($this->connectkey.$this->decryptKey).$post_data); + } + + public function back($code,$type='',$options = array()){ + + global $Tips; + //include 'Tips.php'; + $Tips['ok'] = 'ok'; + $type = empty($type) ? 'ok' : $type; + $data = $this->data_encode(makejson($code,$Tips[$type],$options),$sign);//一次封装取签名 + //echo $data; + //echo '222'; + die(makejson(1,'ok',array('sign'=>$sign,'data'=>$data)));//二次封装 + } + + function rc4 ($pwd, $data) { + + $key[] =""; + + $box[] =""; + + $pwd_length = strlen($pwd); + + $data_length = strlen($data); + + for ($i = 0; $i < 256; $i++) { + + $key[$i] = ord($pwd[$i % $pwd_length]); + + $box[$i] = $i; + + } + + for ($j = $i = 0; $i < 256; $i++) { + + $j = ($j + $box[$i] + $key[$i]) % 256; + + $tmp = $box[$i]; + + $box[$i] = $box[$j]; + + $box[$j] = $tmp; + + } + $cipher = ''; + for ($a = $j = $i = 0; $i < $data_length; $i++) { + + $a = ($a + 1) % 256; + + $j = ($j + $box[$a]) % 256; + + $tmp = $box[$a]; + + $box[$a] = $box[$j]; + + $box[$j] = $tmp; + + $k = $box[(($box[$a] + $box[$j]) %256)]; + + $cipher .= chr(ord($data[$i]) ^ $k); + + } + + return $cipher; + + } + + function hexToStr($hex) + { + $string=""; + for ($i=0;$istrToHex($this->rc4($this->connectkey,$string)); + + + } + private function rc4_decode($string) + { + + return $this->rc4($this->connectkey,pack('H*',$string)); + + + } +//rc4b解密 +//rc4a加密 +} \ No newline at end of file diff --git a/function/GetVerification.php b/function/GetVerification.php new file mode 100644 index 0000000..cfca537 --- /dev/null +++ b/function/GetVerification.php @@ -0,0 +1,13 @@ +尊敬的用户,上午好

      +

      这封邮件是您在平台执行了某项操作发送的,若您并未进行任何操作请忽略此邮件并对邮件内容保密。

      + +[content] +
      +

      查询中心  联系客服

      + +

      Powered by {$_SERVER['HTTP_HOST']}

      +Fram; + +//内容+标题模板行 +$MailTipsCon = << +[title]
      +
      +[content] +
      + +CON; + +//内容行 +$MailTipsLine = << +Lin; + + diff --git a/function/Tips.php b/function/Tips.php new file mode 100644 index 0000000..34291c0 --- /dev/null +++ b/function/Tips.php @@ -0,0 +1,62 @@ +' 后面的内容,请勿删除某行,否则会出错 + * 如果有有变量后面请使用双引号,无变量请使用单引号提高效率。 + * 无变量:'appid不能为空' + * 有变量:'您输入的用户名{$data['user']}不存在' + * 每行以半角逗号结尾,最后一行后面的逗号可有可无。 + * '//'后面的内容为注释内容,不会被PHP解析 + * + */ + + +$Tips = array( + //提示行开始: + //--------------------------系统初始化提示---------------------------- + 'NoAppID'=> 'appid不能为空', + 'NoSign'=> '签名不能为空', + 'GetAppInfoErr'=> '应用信息获取失败', + 'SignError'=> '签名校验失败', + 'AppVerOld'=> '当前应用版本,请下载新版本', + 'AppClosed'=> '当前应用已停用,请与管理员联系', + //------------------------------------------------------------------- + + + //--------------------------用户登录提示---------------------------- + 'InitTimeOut'=> '初始化后太久未操作,数据已超时,请重启软件', + 'HeartNoToken'=> '心跳Token不能为空,请重新登录', + 'HeartTokenError'=> '您的账号在其他地方登录、或由于网络原因长时间未收到心跳、或由于管理员手动将您下线,请重新登录', + + + //账号密码: + 'NoUsername'=> '用户名不能为空', + 'NoPassword'=> '密码不能为空', + 'LoginError'=> '用户名或密码错误', + 'ErrorUsername'=> '用户名输入错误', + 'ErrorPassword'=> '密码输入错误', + + //卡密登录: + 'NoKami'=> '登录卡密不能为空', + 'ErrorKami'=> '您输入的授权卡密不存在', + + //检查绑定: + 'ErrorBind'=> '未查询到您的授权信息', + + //绑定提示: + 'IpBindNeed'=> '当前IP非授权绑定IP,您无法登录', + 'MacBindNeed' => '当前设备非授权绑定设备,您无法登录', + 'QQBindNeed' => '当前QQ非绑定QQ,您无法登录', + + //其他提示: + 'UserCold'=> '您的账号已被冻结,请联系管理员处理', + 'AuthTimeOut'=> '您的授权已到期,请续费后再登录', + 'BalanceOut'=> '您的余额不足,请先充值后再登录', + 'LoggedInTips'=> '您的账号已在别处登录[{userip}],请问是否强制将其挤下线?', + 'HeartNoFoundUser'=>'您的授权已被删除,请联系管理员', + //-------------------------------------------------------------------. + //提示行结束 +); \ No newline at end of file diff --git a/function/VerificationCode.class.php b/function/VerificationCode.class.php new file mode 100644 index 0000000..40f1a49 --- /dev/null +++ b/function/VerificationCode.class.php @@ -0,0 +1,66 @@ + +
      + + + + Vaptcha启动中... +
      + + + '); + } + } + + static function check($token) + { + global $G; + + if ($G['config']['opencode'] == 'true' || $G['config']['opencode'] == '1') { + if (strlen($token) == 32) { + unset($_POST['token']); + //对待签名参数数组排序 + $para_filter = paraFilter($_POST); + $para_sort = argSort($para_filter); + //生成签名结果 + $prestr = createLinkstring($para_sort); + $mysign = md5Sign($prestr, $G['config']['token']); + //签名结果与签名方式加入请求提交参数组中 + if ($mysign == $token) { + return true; + }else{ + return false; + } + } + $info = json_decode(curl_request('http://api.vaptcha.com/v2/validate', 'id=' . $G['config']['codevid'] . '&secretkey=' . $G['config']['codekey'] . '&token=' . $token . '&ip=' . get_real_ip()), true); + if ($info['success'] == '1') { + return true; + } else { + return $info; + } + } else { + return true; + } + + + } +} \ No newline at end of file diff --git a/function/api.class.php b/function/api.class.php new file mode 100644 index 0000000..9c8c525 --- /dev/null +++ b/function/api.class.php @@ -0,0 +1,29 @@ +connectkey = $connectKey; + $this->decryptKey = $decryptKey; + } + + public function getsign($data) + { + return md5($this->connectkey.md5(md5($data.$this->connectkey).$this->decryptKey).$this->decryptKey); + } + + public function back($code,$type='',$options = array()){ + include 'Tips.php'; + global $Tips; + $Tips['ok'] = 'ok'; + $type = empty($type) ? 'ok' : $type; + $data = makejson($code,$Tips[$type],$options);//一次封装取签名 + $sign = $this->getsign($data); + + die(makejson(1,'ok',array('sign'=>$sign,'data'=>$data)));//二次封装 + } +} \ No newline at end of file diff --git a/function/code.php b/function/code.php new file mode 100644 index 0000000..e69de29 diff --git a/function/color.inc.html b/function/color.inc.html new file mode 100644 index 0000000..37fce68 --- /dev/null +++ b/function/color.inc.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/function/communication.php b/function/communication.php new file mode 100644 index 0000000..b2e4d75 --- /dev/null +++ b/function/communication.php @@ -0,0 +1,93 @@ +=48 && $x1<58) ? $x1-48 : $x1-97+10; + $x2 = ord($s{$i+1}); + $x2 = ($x2>=48 && $x2<58) ? $x2-48 : $x2-97+10; + $r .= chr((($x1 << 4) & 0xf0) | ($x2 & 0x0f)); + } + return $r; + } + private function HexBytes($s) { + $r = ""; + $hexes = array ("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"); + for ($i=0; $i> 4)] . $hexes [(ord($s{$i}) & 0xf)]);} + return $r; + } + public function str_decode($str,$key,$key_rand){//解密函数 + return (string)$this->ARSC($this->BytesHex((string)$this->ARSC($this->BytesHex($str),(string)$key_rand)),$key); + } + public function str_encode($str,$key,$key_rand){//加密函数 + $key_temp = $this->HexBytes($this->ARSC($str,(string)$key_rand)); + $key_temp = strtoupper($this->HexBytes($this->ARSC($key_temp,$key))); + return $key_temp; + } + + public function GET_Temp_Key(){ + mt_srand((double)microtime()*10000);//optional for php 4.2.0 and up. + $charid = strtoupper(md5(uniqid(rand(), true))); + $hyphen = chr(45);// "-" + $uuid = chr(123)// "{" + .substr($charid, 0, 8).$hyphen + .substr($charid, 8, 4).$hyphen + .substr($charid,12, 4).$hyphen + .substr($charid,16, 4).$hyphen + .substr($charid,20,12) + .chr(125);// "}" + return $uuid; + } + public function str_sign($str,$txmy,$tempkey){ + + return md5($str.$txmy.$tempkey); + } + + + + +} \ No newline at end of file diff --git a/function/db.class.php b/function/db.class.php new file mode 100644 index 0000000..9d240e7 --- /dev/null +++ b/function/db.class.php @@ -0,0 +1,423 @@ +connection = new mysqli($server, $username, $password, $dbname, $prot)) { + die('MySQL Connect Error (' . $this->connection->connect_errno . ') ' . $this->connection->connect_error); + } + if ($this->connection->connect_error) { + die('MySQL Connect Error (' . $this->connection->connect_errno . ') ' . $this->connection->connect_error); + } + $this->connection->set_charset($charset); + $this->connection->query('set names ' . $charset); + } + + /* + * select 返回第一条数据 + */ + public function select_first_row($table, $fields, $where, $wheretype) + { + $sql = 'SELECT '; + $fidtmp = ''; + if (is_array($fields)) { + foreach ($fields as $value) { + if (empty($fidtmp)) { + $fidtmp = $value; + } else { + $fidtmp .= ',' . $value; + } + } + } else { + $fidtmp = $fields; + } + + $sql .= $fidtmp; + unset($fidtmp); + $sql .= ' FROM ' . $table; + if (!empty($where)) { + $sql .= ' WHERE '; + $condition = ''; + $condition = $this->wheretosql($where, $wheretype); + $sql .= $condition . ' LIMIT 1'; + unset($condition); + } + + //echo $sql; + if (!$result = $this->connection->query($sql)) { + $this->posterror($this->geterror(),'warning'); + //$this->insert_back_id('sq_log_system', array('time' => time(), 'ip' => get_real_ip(), 'msg' => '数据库错误:' . $this->geterror(), 'type' => 'danger')); + return false; + } else { + if ($result->num_rows === 0) { + return false; + } + return $result->fetch_array(); + } + } + + /* + * select 返回所有数据 + */ + + public function wheretosql($where, $wheretype) + { + $condition = ''; + if (is_array($where)) { + foreach ($where as $key => $value) { + if (empty($condition)) { + $condition = $key . '=\'' . addslashes($value) . '\''; + } else { + $condition .= ' ' . $wheretype . ' ' . $key . '=\'' . addslashes($value) . '\''; + } + } + return $condition; + } else { + return $where; + } + + } + + + /* + * 获取某个select行数 + */ + + public function insert_back_id($table, $data) + { + $return = $this->query('SHOW FULL COLUMNS FROM ' . $table); + while ($info = $return->fetch_assoc()) { + if (!isset($data[$info['Field']])) { + + if ($info['Field'] == 'ID' or $info['Field'] == 'id' or $info['Field'] == 'Id' or $info['Field'] == 'iD') { + $data[$info['Field']] = '{nullvaluereplace}'; + } else if (stristr($info['Type'], 'int') || stristr($info['Type'], 'bigint') || stristr($info['Type'], 'integer') || stristr($info['Type'], 'double')) { + $data[$info['Field']] = '{intvaluereplace}'; + } else { + $data[$info['Field']] = ''; + } + + } + } + + foreach ($data as $k => $v) { + + if (empty($column)) { + $column = $k; + if ($v == '{nullvaluereplace}') { + $value = 'NULL'; + } else if ($v == '{intvaluereplace}') { + $value = '0'; + } else { + $value = '\'' . addslashes($v) . '\''; + } + } else { + $column .= ',' . $k; + if ($v == '{nullvaluereplace}') { + $value .= ',NULL'; + } else if ($v == '{intvaluereplace}') { + $value .= ',0'; + } else { + $value .= ',\'' . addslashes($v) . '\''; + } + + } + } + + $sql = 'INSERT INTO ' . $table . ' (' . $column . ') VALUES (' . $value . ')'; + //echo $sql; + if (!$this->connection->query($sql)) { + //echo $this->geterror(); + return false; + } else { + return $this->connection->insert_id; + } + } + + public function query($sql) + { + return $this->connection->query($sql); + } + + /* + * 执行查询语句(update),成功返回受影响的行数 + */ + + public function geterror() + { + return $this->connection->error; + } + + + /* + * 插入数据到一个表,返回插入的ID + */ + + public function select_all_row($table, $fields = '*', $where = '', $wheretype = 'AND', $order = '') + { + $sql = 'SELECT '; + $fidtmp = ''; + if (is_array($fields)) { + foreach ($fields as $value) { + if (empty($fidtmp)) { + $fidtmp = $value; + } else { + $fidtmp .= ',' . $value; + } + } + } else { + $fidtmp = $fields; + } + $sql .= $fidtmp; + unset($fidtmp); + $sql .= ' FROM ' . $table; + if (!empty($where)) { + $sql .= ' WHERE '; + $condition = ''; + $condition = $this->wheretosql($where, $wheretype); + $sql .= $condition; + unset($condition); + } + + $return = array(); + + $sql .= $order; + + if (!$result = $this->connection->query($sql)) { + //$this->insert_back_id('sq_log_system', array('time' => time(), 'ip' => get_real_ip(), 'msg' => '数据库错误:' . $this->geterror(), 'type' => 'danger')); + $this->posterror($this->geterror(),'warning'); + return false; + } else { + while ($info = $result->fetch_array()) { + $return[] = $info; + } + $result->free(); + return $return; + } + } + + + /* + * 插入多条数据到表,返回插入的行数 + */ + + public function select_count_row($table, $where = '', $wheretype = '') + { + $sql = 'SELECT COUNT(ID) FROM ' . $table; + if (!empty($where)) { + if (is_array($where)) { + $condition = ' WHERE ' . $this->wheretosql($where, $wheretype); + $sql .= $condition; + } else { + $condition = ' WHERE ' . $where; + $sql .= $condition; + } + + } + + + unset($condition); + + if (!$result = $this->connection->query($sql)) { + //$this->insert_back_id('sq_log_system', array('time' => time(), 'ip' => get_real_ip(), 'msg' => '数据库错误:' . $this->geterror(), 'type' => 'danger')); + $this->posterror($this->geterror(),'warning'); + return false; + } else { + + $array = $result->fetch_array(); + + return intval($array[0]); + } + + } + + + /* + * 删除记录 + */ + + public function select_limit_row($table, $fields, $limit = '', $num = 0, $where = '', $wheretype = 'AND', $order = '') + { + $sql = 'SELECT '; + $fidtmp = ''; + if (is_array($fields)) { + foreach ($fields as $value) { + if (empty($fidtmp)) { + $fidtmp = $value; + } else { + $fidtmp .= ',' . $value; + } + } + } else { + $fidtmp = $fields; + } + $sql .= $fidtmp; + unset($fidtmp); + $sql .= ' FROM ' . $table; + if (!empty($where)) { + $sql .= ' WHERE '; + $condition = ''; + $condition = $this->wheretosql($where, $wheretype); + $sql .= $condition; + unset($condition); + } + $sql .= ' ' . $order; + $return = array(); + + if (empty($limit)) { + if (!empty($num)) { + $sql .= ' LIMIT ' . $num; + } + } else { + if (!empty($num)) { + $sql .= ' LIMIT ' . $limit . ',' . $num; + } + } + + if (!$result = $this->connection->query($sql)) { + //$this->insert_back_id('sq_log_system', array('time' => time(), 'ip' => get_real_ip(), 'msg' => '数据库错误:' . $this->geterror(), 'type' => 'danger')); + $this->posterror($this->geterror(),'warning'); + return false; + } else { + while ($info = $result->fetch_array()) { + $return[] = $info; + } + $result->free(); + return $return; + } + } + + + /* + * 获取最后一次出现的错误信息 + */ + + public function update($table, $where, $wheretype, $newdata) + { + $newdatatmp = ''; + foreach ($newdata as $key => $value) { + if (is_int($value) || is_double($value) || is_float($value)){ + $value = round($value,2); + } + if (empty($newdatatmp)) { + $newdatatmp = $key . '=\'' . addslashes($value) . '\''; + } else { + $newdatatmp .= ', ' . $key . '=\'' . addslashes($value) . '\''; + } + } + + $condition = $this->wheretosql($where, $wheretype); + + $sql = 'UPDATE ' . $table . ' SET ' . $newdatatmp . ' WHERE ' . $condition; + //echo $sql; + if (!$result = $this->connection->query($sql)) { + //$this->insert_back_id('sq_log_system', array('time' => time(), 'ip' => get_real_ip(), 'msg' => '数据库错误:' . $this->geterror(), 'type' => 'danger')); + $this->posterror($this->geterror(),'warning'); + return false; + } else { + if ($this->connection->affected_rows === 0) { + return false; + } + return $this->connection->affected_rows; + } + + + } + + public function insert_back_row($table, $k, $v) + { + $return = $this->query('SHOW FULL COLUMNS FROM ' . $table); + while ($info = $return->fetch_assoc()) { + $bool = false; + foreach ($k as $value) { + if ($value === $info['Field']) { + $bool = true; + break; + } + } + if (!$bool) { + $k[] = $info['Field']; + foreach ($v as $key => $value) { + if ($info['Field'] == 'ID' or $info['Field'] == 'id' or $info['Field'] == 'Id' or $info['Field'] == 'iD') { + $v[$key] .= ',NULL'; + } else if (stristr($info['Type'], 'int') || stristr($info['Type'], 'bigint') || stristr($info['Type'], 'integer') || stristr($info['Type'], 'double')) { + $v[$key] .= ',0'; + } else { + + $v[$key] .= ',\'\''; + } + + } + } + } + + $datainfo = ''; + foreach ($v as $value) { + if ($datainfo === '') { + $datainfo = '(' . $value . ')'; + } else { + $datainfo .= ',(' . $value . ')'; + } + + } + $sql = 'INSERT INTO ' . $table . ' (' . $this->arraytocomma($k) . ') VALUES ' . $datainfo; + //echo $sql; + if (!$this->connection->query($sql)) { + //$this->insert_back_id('sq_log_system', array('time' => time(), 'ip' => get_real_ip(), 'msg' => '数据库错误:' . $this->geterror(), 'type' => 'danger')); + $this->posterror($this->geterror(),'warning'); + return false; + } else { + return $this->connection->affected_rows; + } + } + + private function arraytocomma($array) + { + $back = ''; + foreach ($array as $value) { + if ($back === '') { + $back = $value; + } else { + $back .= ', ' . $value; + } + } + return $back; + } + + public function delete($table, $where, $wheretype) + { + $condition = $this->wheretosql($where, $wheretype); + $sql = 'DELETE FROM ' . $table . ' WHERE ' . $condition; + if (!$this->connection->query($sql)) { + return false; + } else { + return true; + } + } + public function affected_num(){ + return $this->connection->affected_rows; + } + + /** + * @param $msg + * @param string $type info | warning | success | danger + */ + public function posterror($msg,$type = "info"){ + $this->insert_back_id('sq_log_system', array('time' => time(), 'ip' => get_real_ip(), 'msg' => $msg, 'type' => $type)); + } +} \ No newline at end of file diff --git a/function/function_app.php b/function/function_app.php new file mode 100644 index 0000000..459ba7f --- /dev/null +++ b/function/function_app.php @@ -0,0 +1,32 @@ +select_first_row('sq_apps', '*', array('ID' => $id), 'AND'); +} + +function app_idgetname($id) +{ + global $db; + if (!$result = $db->select_first_row('sq_apps', 'appname', array('ID' => $id), 'AND')) { + return false; + } + return $result['appname']; +} + +function level_idgetname($id) +{ + global $db; + if (!$result = $db->select_first_row('sq_level', 'lname', array('ID' => $id), 'AND')) { + return false; + } else { + return $result['lname']; + } + +} \ No newline at end of file diff --git a/function/function_auth.php b/function/function_auth.php new file mode 100644 index 0000000..0d75798 --- /dev/null +++ b/function/function_auth.php @@ -0,0 +1,291 @@ +select_first_row('sq_user', '*', array('username' => $username, 'appid' => $appid), 'AND')) { + $T['title'] = '您的授权账号已新开成功!'; + $T['content'][] = '应用名称:'.$appinfo['appname']; + $T['content'][] = '注册时间:'.Get_Date(); + if ($appinfo['usetype']=='dqsj'){ + if ($balance!='-1'){ + $balance=time()+$balance; + $T['content'][] = '到期时间:'.Get_Date($balance); + }else{ + $T['content'][] = '到期时间:永久授权'; + } + }else{ + if ($balance == '-1'){ + $T['content'][] = '开通余额:无限使用'; + }else{ + $T['content'][] = '开通余额:'.$balance; + } + + } + + $db->insert_back_id('sq_user', array( + 'username' => $username, + 'password' =>$password, + 'mail' => $mail, + 'uqq' => $uqq, + 'rtime' => time(), + 'status' => '1', + 'appid' => $appid, + 'aid' => $oid, + 'balance'=>$balance, + 'origin' => $origin, + 'oid'=>$oid + ) + ); + $T['content'][] = '授权来源:'.GetOriginText($origin); + $T['content'][] = '联系方式:QQ '.$uqq; + $T['content'][] = '授权账号:'.$username; + $T['content'][] = '用户邮箱:'.$mail; + $MailTips[] = $T; + SendTipsMail($mail,$MailTips,$backinfo); + return 1; + } + $T['title'] = '您的授权账号已续费成功!'; + $T['content'][] = '应用名称:'.$appinfo['appname']; + $T['content'][] = '注册时间:'.Get_Date($userinfo['rtime']); + if ($balance != '-1') { + if ($appinfo['usetype'] == 'dqsj') { + if ($userinfo['balance'] < time()) { + $usernewinfo['balance'] = time() + $balance; + } else { + $usernewinfo['balance'] = $userinfo['balance'] + $balance; + } + $T['content'][] = '到期时间:'.Get_Date($usernewinfo['balance']); + } else if ($appinfo['usetype'] == 'kcye') { + $usernewinfo['balance'] = $userinfo['balance'] +$balance; + $T['content'][] = '授权余额:'.Get_Date($usernewinfo['balance']); + } else { + $tips='应用使用方式设置异常'; + return -3; + } + + } else { + $usernewinfo['balance'] = '-1'; + $T['content'][] = $appinfo['usetype']=='dqsj' ? '到期时间:永久授权' : '开通余额:无限使用'; + } + $T['content'][] = '授权来源:'.GetOriginText($origin); + $T['content'][] = '联系方式:QQ '.$uqq; + $T['content'][] = '授权账号:'.$userinfo['username']; + $T['content'][] = '用户邮箱:'.$userinfo['mail']; + $MailTips[]= $T; + $db->update('sq_user', array('ID'=>$userinfo['ID']), 'AND', $usernewinfo); + SendTipsMail($userinfo['mail'],$MailTips,$backinfo); + return 2; + } else if ($appinfo['logintype'] == 'kmsq') { + //卡密登录方式 + if (empty($username)) { + //没有卡密新开授权 + $T['title'] = '您的授权卡密已新开成功!'; + $T['content'][] = '应用名称:'.$appinfo['appname']; + $T['content'][] = '注册时间:'.Get_Date(); + if ($appinfo['usetype']=='dqsj'){ + if ($balance!='-1'){ + $balance=time()+$balance; + $T['content'][] = '到期时间:'.Get_Date($balance); + }else{ + $T['content'][] = '到期时间:永久使用'; + } + }else{ + if ($balance == '-1'){ + $T['content'][] = '开通余额:无限使用'; + }else{ + $T['content'][] = '开通余额:'.$balance; + } + } + $newkey = rand_str(32); + while ($info = $db->select_first_row('sq_user', 'ID', array('username' => $newkey, 'appid' => $appinfo['ID']), 'AND')) { + $newkey = rand_str(32); + } + //echo $newkey; + $db->insert_back_id('sq_user', array( + 'username' => $newkey, + 'mail' => $mail, + 'rtime' => time(), + 'balance' => $balance, + 'status' => 1, + 'origin' => $origin, + 'oid'=>$oid, + 'appid' => $appid, + 'aid' => $oid, + )); + $T['content'][] = '授权来源:'.GetOriginText($origin); + $T['content'][] = '联系方式:QQ '.$uqq; + $T['content'][] = '授权卡密:'.$newkey; + $T['content'][] = '用户邮箱:'.$mail; + $MailTips[] = $T; + SendTipsMail($mail,$MailTips,$backinfo); + return 3; + } + //续费授权 + if (!$userinfo = $db->select_first_row('sq_user', '*', array('username' => $username, 'appid' => $appid), 'AND')) { + $tips = '授权卡密不存在'; + return -2; + } + $T['title'] = '您的授权卡密已续费成功!'; + $T['content'][] = '应用名称:'.$appinfo['appname']; + $T['content'][] = '注册时间:'.Get_Date($userinfo['rtime']); + if ($balance != '-1') { + if ($appinfo['usetype'] == 'dqsj') { + if ($userinfo['balance'] < time()) { + $usernewinfo['balance'] = time() + $balance; + } else { + $usernewinfo['balance'] = $userinfo['balance'] + $balance; + } + $T['content'][] = '到期时间:'.Get_Date($usernewinfo['balance']); + } else if ($appinfo['usetype'] == 'kcye') { + $usernewinfo['balance'] = $userinfo['balance'] +$balance; + $T['content'][] = '授权余额:'.Get_Date($usernewinfo['balance']); + } else { + $tips='应用使用方式设置异常'; + return -3; + } + } else { + $usernewinfo['balance'] = '-1'; + $T['content'][] = $appinfo['usetype']=='dqsj' ? '到期时间:永久授权' : '开通余额:无限使用'; + } + $T['content'][] = '授权来源:'.GetOriginText($origin); + $T['content'][] = '联系方式:QQ '.$uqq; + $T['content'][] = '授权卡密:'.$userinfo['username']; + $T['content'][] = '用户邮箱:'.$userinfo['mail']; + $MailTips[]= $T; + $db->update('sq_user', array('username' => $username, 'appid' => $appinfo['ID']), 'AND', $usernewinfo); + SendTipsMail($userinfo['mail'],$MailTips,$backinfo); + return 2; + } else if ($appinfo['logintype'] == 'jcbd') { + $chect = json_decode($username,true); + if ($appinfo['bindip'] == '1'){ + $search['lip'] = $chect['lip']; + $T['content'][] = '绑定IP:'.$chect['lip']; + } + if ($appinfo['bindqq'] == '1'){ + $search['rqq'] = $chect['rqq']; + $T['content'][] = '绑定QQ:'.$chect['rqq']; + } + if ($appinfo['bindmac'] == '1'){ + $search['mac'] = $chect['mac']; + $T['content'][] = '绑定设备:'.$chect['mac']; + } + if (!isset($chect['lip'])){ + $chect['lip'] = ''; + } + if (!isset($chect['rqq'])){ + $chect['rqq'] = ''; + } + if (!isset($chect['mac'])){ + $chect['mac'] = ''; + } + if (!$userinfo = $db->select_first_row('sq_user', '*', $search, 'AND')) { + $T['title'] = '您的授权绑定已新开成功!'; + $T['content'][] = '应用名称:'.$appinfo['appname']; + $T['content'][] = '注册时间:'.Get_Date(); + if ($appinfo['usetype']=='dqsj'){ + if ($balance!='-1'){ + $balance=time()+$balance; + $T['content'][] = '到期时间:'.Get_Date($balance); + }else{ + $T['content'][] = '到期时间:永久使用'; + } + }else{ + if ($balance == '-1'){ + $T['content'][] = '开通余额:无限使用'; + }else{ + $T['content'][] = '开通余额:'.$balance; + } + } + + $db->insert_back_id('sq_user', array( + 'mail' => $mail, + 'rtime' => time(), + 'balance' => $balance, + 'status' => 1, + 'appid' => $appid, + 'uqq' => $uqq, + 'mac' => $chect['mac'], + 'rqq' => $chect['rqq'], + 'rip' => $ip, + 'lip' => $chect['lip'], + 'aid' => $oid, + 'origin' => $origin, + 'oid'=>$oid, + )); + + $T['content'][] = '授权来源:'.GetOriginText($origin); + $T['content'][] = '联系方式:QQ '.$uqq; + $T['content'][] = '用户邮箱:'.$mail; + $MailTips[] = $T; + SendTipsMail($mail,$MailTips,$backinfo); + return 1; + } + + $T['title'] = '您的授权卡密已续费成功!'; + $T['content'][] = '应用名称:'.$appinfo['appname']; + $T['content'][] = '注册时间:'.Get_Date($userinfo['rtime']); + if ($balance != '-1') { + if ($appinfo['usetype'] == 'dqsj') { + if ($userinfo['balance'] < time()) { + $usernewinfo['balance'] = time() + $balance; + } else { + $usernewinfo['balance'] = $userinfo['balance'] + $balance; + } + $T['content'][] = '到期时间:'.Get_Date($usernewinfo['balance']); + } else if ($appinfo['usetype'] == 'kcye') { + $usernewinfo['balance'] = $userinfo['balance'] +$balance; + $T['content'][] = '授权余额:'.Get_Date($usernewinfo['balance']); + } else { + $tips='应用使用方式设置异常'; + return -3; + } + } else { + $usernewinfo['balance'] = '-1'; + $T['content'][] = $appinfo['usetype']=='dqsj' ? '到期时间:永久授权' : '开通余额:无限使用'; + } + + $T['content'][] = '授权来源:'.GetOriginText($origin); + $T['content'][] = '联系方式:QQ '.$uqq; + $T['content'][] = '用户邮箱:'.$userinfo['mail']; + $MailTips[]= $T; + $db->update('sq_user', $search, 'AND', $usernewinfo); + SendTipsMail($userinfo['mail'],$MailTips,$backinfo); + return 2; + } + $tips = '未知授权请求?'; + return -2; +} + diff --git a/function/function_core.php b/function/function_core.php new file mode 100644 index 0000000..7938da7 --- /dev/null +++ b/function/function_core.php @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/function/function_page.php b/function/function_page.php new file mode 100644 index 0000000..f9fd50f --- /dev/null +++ b/function/function_page.php @@ -0,0 +1,11 @@ +'', + 'epay_pid'=>'', + 'epay_key'=>'', + 'epay_againcheck'=>'0', + 'alipaytype'=>'0', + 'qqpaytype'=>'0', + 'wxpaytype'=>'0', + 'kqxt'=>'1', + 'yjtx'=>'1', + 'alipay_id'=>'', + 'alipay_rsa'=>'', + 'alipay_pkey'=>'', + 'tenpay_id'=>'', + 'qqpay_key'=>'', + 'sitename'=>'温泉PHP网络授权', + 'adminqq'=>'80071319', + 'adminmail'=>'80071319@qq.com', + 'beian'=>'', + 'weburl'=>(((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://').$_SERVER['SERVER_NAME'].$_SERVER["REQUEST_URI"], + 'smtp_address'=>'', + 'smtp_port'=>'', + 'smtp_user'=>'', + 'smtp_pass'=>'', + 'agentnotice'=>'欢迎使用温泉PHP网络授权系统の代理端,您可以在此充值、自助提卡、开通用户等操作,如有问题请联系本站客服处理。', + 'mainnav'=>'链接名称1 温泉发卡网', + 'sitekey'=>'', + 'xtsy'=>'1', + 'opencode'=>'false', + 'codevid'=>'', + 'codekey'=>'', + 'maindrawer'=>'', + 'token'=>'', + 'sid'=>'0', + 'stime'=>'0' +); diff --git a/function/trade.inc.php b/function/trade.inc.php new file mode 100644 index 0000000..e2e80c2 --- /dev/null +++ b/function/trade.inc.php @@ -0,0 +1,121 @@ +select_first_row('sq_agent', '*', array('username' => $tradeinfo['user']), 'AND')) { + return makejson(-101,'代理信息获取失败'); + } + $newinfo['money'] = $agentinfo['money'] + $tradeinfo['paymoney']; + $newinfo['allrecharge'] = $agentinfo['allrecharge'] + $tradeinfo['paymoney']; + if (!$db->update('sq_agent', array('username' => $tradeinfo['user']), 'AND', $newinfo)) { + return makejson(-102,'代理信息更新失败'); + } + $db->insert_back_id('sq_log_agent', array('time' => time(), 'aid' => $agentinfo['ID'], 'ip' => get_real_ip(), 'msg' => '成功充值' . $tradeinfo['paymoney'] . '元,余额' . $newinfo['allrecharge'])); + return makejson(1,'充值余额成功!'); + } + if ($tradeinfo['type'] == '2') { + //代理开通商品 + if (!$fidinfo = $db->select_first_row('sq_fidlist', '*', array('ID' => $tradeinfo['fid']), 'AND')) { + return makejson(-201,'商品信息拉取失败'); + } + if (!$agentinfo = $db->select_first_row('sq_agent', '*', array('ID' => $tradeinfo['agentid']), 'AND')) { + return makejson(-202,'代理信息拉取失败'); + } + $allspend = $agentinfo['allspend'] + $tradeinfo['paymoney']; + $db->update('sq_agent', array('ID' => $tradeinfo['agentid']), 'AND', array('allspend' => $allspend)); + include_once 'function_auth.php'; + $back = auth_add($tradeinfo['user'],$tradeinfo['pass'],$tradeinfo['ip'],$tradeinfo['num'] * $fidinfo['num'],$tradeinfo['uqq'],$tradeinfo['mail'],$fidinfo['appid'],4,$agentinfo['ID'],$newkey,$tips); + if ($back == 1){ + return makejson(1,'授权新增成功'); + }else if ($back==2){ + return makejson(1,'授权续费成功'); + }else if ($back==3){ + return makejson(2,'成功生成卡密',array('kami'=>$newkey)); + }else{ + return makejson($back,$tips); + } + } + if ($tradeinfo['type'] == '3') { + //在线购买 + if (!$fidinfo = $db->select_first_row('sq_fidlist', '*', array('ID' => $tradeinfo['fid']), 'AND')) { + return makejson(-301,'商品信息拉取失败'); + } + include_once 'function_auth.php'; + $back = auth_add($tradeinfo['user'],$tradeinfo['pass'],$tradeinfo['ip'],$tradeinfo['num'] * $fidinfo['num'],$tradeinfo['uqq'],$tradeinfo['mail'],$fidinfo['appid'],2,$tradeinfo['ID'],$newkey,$tips); + if ($back == 1){ + return makejson(1,'授权新增成功'); + }else if ($back==2){ + return makejson(1,'授权续费成功'); + }else if ($back==3){ + return makejson(2,'成功生成卡密',array('kami'=>$newkey)); + }else{ + return makejson($back,$tips); + } + } + if ($tradeinfo['type'] == '4') { + $nowtime = Get_Date(); + $db->insert_back_id('sq_agent', array('username' => $tradeinfo['user'], 'password' => $tradeinfo['pass'], 'begintime' => time(), 'levelid' => $tradeinfo['fid'], 'status' => 1, 'qq' => $tradeinfo['uqq'])); + $T['title'] = '您的代理已成功开通!'; + $T['content'][] = 'QQ:'.$tradeinfo['uqq']; + $T['content'][] = '账号:'.$tradeinfo['user']; + $T['content'][] = '时间:'.Get_Date(); + $T['content'][] = '等级:'.level_idgetname($tradeinfo['fid']); + $MailTips[] = $T; + SendTipsMail($tradeinfo['mail'],$MailTips,$back); + return makejson(1,'代理开通成功'); + } + return makejson(-404,'订单类型异常'); +} + +function MakeTradeTips($tradeinfo){ + $T['title'] = '您的订单已成功处理!'; + $T['content'][] = '订单金额:'.$tradeinfo['paymoney'].' 元'; + switch ($tradeinfo['paytype']){ + case 'czkm': + $T['content'][] = '支付方式:充值卡密'; + break; + case 'yezf': + $T['content'][] = '支付方式:代理余额'; + break; + case 'zxzf': + switch ($tradeinfo['onlinepaytype']){ + case 'zfb': + $T['content'][] = '支付方式:在线支付-支付宝'; + break; + case 'wx': + $T['content'][] = '支付方式:在线支付-微信支付'; + break; + case 'qq': + $T['content'][] = '支付方式:在线支付-QQ钱包'; + break; + default: + $T['content'][] = '支付方式:在线支付-未知'; + } + break; + default: + $T['content'][] = '支付方式:未知方式'; + } + $T['content'][] = '订单名称:'.$tradeinfo['name']; + $T['content'][] = '下单时间:'.Get_Date($tradeinfo['begintime']); + $T['content'][] = '完成时间:'.Get_Date(); + $T['content'][] = '订单编号:'.$tradeinfo['tradeno']; + return $T; +} + diff --git a/function/ver.inc.php b/function/ver.inc.php new file mode 100644 index 0000000..21adedd --- /dev/null +++ b/function/ver.inc.php @@ -0,0 +1,9 @@ +{( zJaZG%Q-e|yQz{EjrrH1%iF>*@hH%Ix2L(=?nD~p6#i#!Nr%z3h453n7sRo6gn?dGz My85}Sb4q9e0GdJ}YybcN literal 0 HcmV?d00001 diff --git a/img/backdrop/tactile_noise.png b/img/backdrop/tactile_noise.png new file mode 100644 index 0000000000000000000000000000000000000000..8dbb0349f48d57702e3f2a99b4e83226907031f2 GIT binary patch literal 1197 zcmV;e1XBBnP);XM#a z;ci-vK%C0GLQ>OPCsDKsr#6v4a;mgmY3+7~Ir-bPYC*V+e=YL?%{Dt>@K&9e^49QTp*>Lr&!~WhDZ+{G_kuY(T7> zN|Z)dKzf(st8}jvq^oyz42IfB4C;)l#YRml$#85RXsVFt;5nwG@gj@wy!&HiHysqQ z-;b3l!GOJ;Kh}>-J+JI)0se4x?67ldUkiYJH@cYHVWUIdCs^UfLYb+P&O8GYj@VZW zuZR)KD%b2Ihf9KX$P%D5aD_vqhF>?l!RH)!qcUPVCM!d#g^xs~7j+Z( z^6dne$;k~iky{T))Q+6yQiQ$577Q)G<&8oqxY!&NK+&K0M5caJ|-D5YqttJ?Fy&)|AIDwFk!l#+~g9`o~|d9 zk9@J_>WqQmEa<9ac*O3l8S&P1?UFGIU7rJ1K1hs+R@6`lva93!PVe-Z#cy-KQD2l@ zlZM%R6eEqV>nXjiiKMlMZi!sa`V zIWR`eWw%avZ9yf5{hh>u(B6lq=b#POTZ28TmPco$sJf2M$X@kJbsPe%rL`|fh*@lo zWW&=$)FsMUz6!|Yh$|2a8)QHB#a?uh(M7g1dI4tG!bmuAr?`ev$l?fTNm=y4jWnQ1AjJHJ%9F23x3s_kB zw!RjgdtZ#5{oeD#~2OCiyHyH(8UujS#t + + + + + + + + + + + 授权在线开通 - <?php echo $G['config']['sitename'] ?> + + + + + + +
      + +
      +
      + + 授权在线开通 - + +
      + + +
      +
      +
      + + +
      + +
      +
      +
      +
      + + +
      +
      + +
      + 数据正在等待中 +
      + +
      +
      + + +
      + + + + + + + + diff --git a/mdl/LICENSE b/mdl/LICENSE new file mode 100644 index 0000000..9faf108 --- /dev/null +++ b/mdl/LICENSE @@ -0,0 +1,212 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2015 Google Inc + + 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. + + All code in any directories or sub-directories that end with *.html or + *.css is licensed under the Creative Commons Attribution International + 4.0 License, which full text can be found here: + https://creativecommons.org/licenses/by/4.0/legalcode. + + As an exception to this license, all html or css that is generated by + the software at the direction of the user is copyright the user. The + user has full ownership and control over such content, including + whether and how they wish to license it. diff --git a/mdl/bower.json b/mdl/bower.json new file mode 100644 index 0000000..2a826c9 --- /dev/null +++ b/mdl/bower.json @@ -0,0 +1,29 @@ +{ + "name": "material-design-lite", + "version": "1.3.0", + "homepage": "https://github.com/google/material-design-lite", + "authors": [ + "Material Design Lite team" + ], + "description": "Material Design Components in CSS, JS and HTML", + "main": [ + "material.min.css", + "material.min.js" + ], + "keywords": [ + "material", + "design", + "styleguide", + "style", + "guide" + ], + "license": "Apache-2", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "./lib/.bower_components", + "test", + "tests" + ] +} diff --git a/mdl/dog.png b/mdl/dog.png new file mode 100644 index 0000000000000000000000000000000000000000..d56c2c804c7666aae7e041439d9186bd8270c55c GIT binary patch literal 496632 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�_u*{!wNsWEQR zITaX6324#3FTF}@v0NnOBE4pU*1erl`KtYa70cWB0IsszeXrm)N_gT2_uGa37MKo`fxLxBC?$M=I zRiiUor}M=a1nLU0(CRsgn)H9uYAb78rsrDbKp@&AAcqxLfTsYLJG}{GD=j_$X`6re zi`KpRO)CV1$94+j3vlbK(K9oQ1(mipQUE>4L<&_oZKD96^z9TF#mz`9E6%x}?>g}b zojq@AO}P^+>{zfIXo;^05a4Ef7$*yl22@Sd+M^Tc? z2MlRE;vKky$wV%V3uKGO6vq~791ASkyxQt}Haou#K${d+%}ca}7*X*RCnO{_X9&{ucpO9z4Ah{X+w+$zX{8^S}E>?=|`NPol@~_c%Qf6MQqIISlF5n~qP6 zm-`auSKc5H{P=*s-6&t0;aep~pOajJ`8X&DKXtyg$isBln1BtID>M-inQ{4&0(lUX z|3ClPWN?)SNFF$vP@C@zUcNl{6dQYBU`9ZWCC zCkoM9OWIs;K&64!W5P{{Av6ehwCb~dX_)#>^)3nMH^e}`X8kLFMu6-4Eivs?D{7a} z!7>yBB#CLm{G;=vk?C3jr5+2B7J!2qq?JlTBltWL6Ud6LuxNCZg{h%K;XvXG1e}6c zEio=9-5U+`Qm2drm1<9|Kfcek}TA)bGlUS)L%|m%Y;|*)P z5&&fcz2~G=2w-AqsTm|D1@gq;X%fvC zyiqgmQ10EhE^s-fC5)01CfUH6Me#&{R;cNy_1^sn+xmllW}yYoYFuLK8G!}@?;Cb$ z4iP+J&^2QGbu?uTh=6utwHy>-%@9CxaFr8CYmo33D2fSORd*h-$~J+6_M=wacUr*b zqE&Pr6UaI20zVJ35SVTW5lAj=-zQLW*y8$Kr1^jV%wa3;J7om}mjqa@S?%a64zNN4 z_iV}s|Ip_Atl5lT{GT@d)AaY#`=ht5X5<-*4&D=Zxnkwrmn}YW!@@lhsJKj<1=w`o zP|G1J?FL{yYo!CPSkuxkTWI-bZTWASt^GZ-=+Q4*V%eLz|5Z=dr@c%lw_5^tw^gQg zdZyfD3szxzyPkoJyuF%l-GdfAorlZ|L@s<_%l{9vrJ|y>pYXVt;sJr8?%P(?bJb!3 zZyp;autGTj;*AO@3(%(Z@7rg^gC`u|0g6K_Ua^@!^cS}H-TZH@fAFAoq{} zdT8-AJM|0yk4=5|Z(3;HYgV%OlNQRpVAYEZ(H^(l8hWndD4PpmL-XJ@+EVEW;F|c-f z85PQ@BuEi38sv_|kKpBb?nUK_+Bf)^)j$UY1=L&a! z&=V3D{jy-KP`b(l=A=*-YL7K8dCq3;|BS6T_Y=10z)xE9toQ4?+J9mAnt)Jtj`qHI zYq(25S$qVK0_!U9S{TkS2NW`{hX4x%{Ow9?kS9I(H$#9cD8C^e1qKGzD+g8jJE&vwc5
    • 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ürx%fR<|TxUJC4xNG_oVP$l>RC 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 z zFZ(XVK%5v6imp2F8cLKfNB}UB#Y5saHMOGMfcGqa@ctZnkV5xEZq@K@qw;*No(b`P z{)j+a3h~)o@*Rb=5rEPg+COupU+2A+4Oira17D4)=R*O2WLUb#Kr--62HGq@B|`8z zCFX#+bC0|J_Cm+ZA1M!-cfdKJx8T(hAYvzCzl>GMIlQ5nQZ9^bIDGiLCj?W-7LRQG z)I$$@dkzZ#P4gGRj=>;~j)#iK!!q7x)fuWQHhbK_!&4N|Y}u5^sdTv-_#NI(r5X7#bDfb@ z`b=#tmr;@>nOi$}*1;Jy@c?Kj{1WL13LjHOh9vmwF{w`#p z-a{>~=zZRfs4ah<=rf_wLIF&Og#Ut;w~|-hg>1>J-)UJ*yRBSGJH39l#j3XZ2B5~t z>%L|(nqT~6h_k{9u})JMr_>GPJUn^vZEfe{ee9mYD9lI_#?v&TGu z>j+>IS_B6~VMh1jyL=3UKA?CsC6N3cynB*40AVGU^ewt@zXiH~rGaw*AotHvHb|=YJ{r`AE9p zoW&ZCSQ>I}Ks+MK=?)41M4vpDT6zG`Ogm@~Z7Tv~HVGGLExGd}!M|LSIlJ&T9;^z1 zj50AZM6s|yp?DaTt|_+ZmP2BzrCaH~)lv`d)j;)2NDN8X4!mb+xLfOF!88cmbZZjl zJ-6=lzqYOozqO9FzY(bVxz#NG%8JK7w9J7gmfn3$LR`v60~87O0HOq_^sH2xiQ5VV zCqb4LlqS_lpQBVbY?yPXJO@gj6Pn8H+h*B4o7KLJ8a&*e05%D(770rba}qH9P?DhG z_?9HVk}zo3q83>4|Mgu?<0-Z6iZzZsvr4vrx18`W7e()K+jr>wB0^jOHN{#iFlP>) zIZb5U&;<#Fiw<_NngYP0|5%gz!|!2+e*(cw5xDxHIjDvABd0o+w$W zB(YbH-L&}PXI8i1sVk*4S+417dxn@DhGGr+ricXjjz=dc2lY34eo_JX`kMh-b3s<9 z{SuN-1JKeM?G-cjopivGErWm>O@s{V7d>`Q1ZRSwL{X-M7s<7u{eT@3k%K}Mqf2pk zo`9GeAQctSgX!TJDi$X_TL}u5S)c&AFjPXD=Ym5hYIg(|W3v=fD0cenH%Weq}Ad`vq9? z#Cs9{^EnCX(UtG{+`Uu$hSCij1*SGfA-?aUDEt>4TSFo%LKJ}I*0khe09t{9QUG9u zoX$4^EanU=9`8y7l!Ktw8j+C|c@m@CIKVgH3QL@IL)i~M+#avJ#+4ku_>!kq!9mG@ zK!GctHwRXFZjX!!$?qhoElv&$1JF(dR>|BUcKV5r;RQU_9Ep;pD*y#PN3nB1IXx&R zDzwL>ILW_ahg;9u52V-xbURK1t=^&j{y8ub@!Ol|b@v1cKnI{y*(Zf7nNvd{ zQSmx53!nu6z{``>xY>CaFj70LaUzdXV~_+`P*NrVdUmFeKAZL4A4UOOr2;I#RSLE3 zc8?z53K@hx&Wyk9q0+k13sxh&i-AkZ2>=mZ4u*HQmp)POl)eCPDtk{!7hQ2jiibKG zr)1w=?MoQv8NifE$k-&nl0I~BrFZZiLaZKUZ5D`X3sv?3uB4MVfEUk@Vu9=~(VP@E zX$>_Wbih>%@C9h0_W&@`(ZQo7ecK^f+$sG7bqPdvO5Zy1x7H}%>-l(+ycQxm`}(d} z<>(_B9G_a-(qCBDsy|xq>c7^S{Jp0Fq<6n3Jt1Sf{(xf`j7LgdxKRS1!n?u~=qvid zi6dp=?eY%zHeeR830KDg0$AKb4r8oT1H*2IR07RIo~xvW&Ik#0RLtn%1>%ls068XJ zv!wZi7YjpB)=a(dnlat$zO{i(zq0lEIvPDYbp9-)%sZoTL z1+Yp2Ed8&+CQhFdf6uD>?^^5RGs|wotHr&P5!fZh7BjaKZVQ$QjO{326UX7DP2*R^ z6lcOjYT?rN;HnP_ein252y#!##`xW#Ft^8h|U3Xk(3goH82UcA_9G z^<3P;0}x3F_GtX0P+>&T+VGu>P$HQ!$|;xyw8THbTO|-Z7(5Snv^dL>vI(9SCIuUE zaAXWPAUiHT1Ng`&;*ilk@m!}Au>@w6`{VgkGMN1H$VkCxd4*)mzU%}s^L($t)k_J5OKP(Kq5#aBi1Cd64&xlaX_VYMC6lp*o<5frJ#OGaBJEh|U7$bl+GbRCGLC7Tl7P7i^@|qtDmq*%%K)sKDLT0{^ z=8Snn$k{*XGiS?6mpI9w5KkK-(rB1 zqRxoOsnMi#YEV&*2wEXe5E+04*DuB4NbE~*Bxgleft1YFa}r!P#o+Jz(FP-1eD^kFCn!UKJgbhSG zfEVwL@)z8rqtEo-84B%=a=0992{3TrIv|T-&-fg&3z4+}5lW82#u2#Un31fma{`$+1+F-#`GpMI2mW15@)=+g zoh2GhB2Zhkev|Da)Z&Ur3R=7yc?f(>i%@oWt&*NB@v@)BAS0n-@PzY6{k(HlJ$%w? zM^F3Tfp;!xtR?4L4vV+gfKLfCm0Ot*qlogRYOcF9u z?Uv4%3$T#+Tmc>Egxr>Gdd4pC$?i~ny))<>09NvONtuM)+mS*+4*pmwkUS5>-;#ID zl9!O4?IfT?8$Inr^2{S6YJZ7jN5l9fftI(`4-8#_;KX<&Ppe1(EdO79;CH=C?|5`1 zvyM5&FxEKFkzuKnDr=n>_r%rZtJa05l4y-U5wP{puZTQ0Pxx2+ct0M{XxCtNtNPoi zzIN`A?2--??r_HgW6%6ZPbM80>T`0fc-unX_>Aw8#Jx@j1*qUb$u9LbOGXSEm@xhjTwW*y7Ew2@7}a%!9Y+$u&M%6jD>Q7JG18MdeslMhy~taoY=^@_Qu^b5FZ zO~f@FI2}kZwU}GLBT4+v=X?*if}HUMt~xge32QN`!|qOWi%<$d0|VN3OGdxNTSwL3 zvgSip(RkF#^gBn_ny?>B4y2OcYFmN;S$KG~u!O!d>ZDAY&sf*u7g`jue$_@iX}+N5 zSVAy%$SuRIyVv4l=iTcAfC0>41q6_#cOw9tQ6s?fV<|B655Mm6wlHrTD}*qE0o=9j z42gA1)${zM&hjDom1%MTZzh?wN1h6vHmJH25r9CJJ$Wa`z>H`8@ z?0!0=^?AsP1rBa}VGH(rY4f&!Y#qz*S@k%_Ii0k+@$ zx#H0Y*RU%ts!H!*D*?2kMC|~y@M`JW7ivdEAS_DSc5vh&MrusWp*{gGUH$kODDfP^ zk~|~igC)uqBzD;OJMioXtT0}l?@9aFEv!ELC09U|=U61JuN%8Sx<@n@Pz9hiLzFde zE1B`>Iwd8=0p0|6RByxfT zA&!}O3|^|)mi{4EM4msTbs7Peh@T=47W|9x2f(7HTmV=X-0-LylWbddOT6=;Effz8 zZhYy-mcU!Fs@=XLm+%YgrD9lfLgXWUz;jK1u!5gM5l~4|1c;IpjJhCmWC#!)kZc8D z;eB&C(zZjoLP}l=8>I=z`e6X;#}c4Q{dD5*R{>V^Tld_wylq)(6Ff`Oex-mc01N#V z$zGlbpkgN`_c4Z~YeY_puEjS!JPN=H-WJ9`0aji^uamja)!QV!OwMkUHZrq*0-;|4 zSV>?jT|rJSA?EbvJ(i|+rb}05c1Txr=@}&2ckC7j+GW`->VrpvG(Nh=qZD|I05t+% zP$+&a*@ibR;XQH?%KV9lK13Ujh`zxGfTfJ)!7Z$TI-_EtY^hH*0bsxHRfw;Ui67ojXf4) z-w@)XCJOmjvh*Yj+`2_5p`6;aSoQpTAyyKgy>O+JUMOOz0rP>>LKk2uY~xVQi1feb z12D*-#Khttah>*e0&>*m7V4NtNZ}G}5||NcC805|F?1Y&Rob-QN*nfCi9TZyI7s?2 zq=kVuhh+7fwyg=;9Ikv$@~0L7TYz(#j$7^UHLFIcNLi&fh>66^FhT^d!ruVP;H?8t z0Ym^;mFys6ai&-+P{d3>mhzf4em|C)xE~=ID$@tBwLdU4mZ6>>02UV2ZU zV$pl3uP2;9@AX>nMhS>iPTaPdh4-y;KE*TfPEdLNxWzivPASv0Hd$nxj-bB*TTqm* zgBK)HA#iqj|)$3CLpCX{;%vVc>nEyhrua13#=f3MB)?NGj(U zz7e5Y3PFZkn7?-t>n(t*$h#U004#kObBT40Oo4wQesZG)z7mhYPn2Nc_dFMcMa`uc z3D{CB@J{Q}d*Y?%*0c77wTrhJ7T&S)(MvLB-nLl521~1#{AR~htJawK%;ne|9!jN% zpWj45ex#59NGbuWYGfz@LbzhIqU<9NmLL4gPHsvWxXgOXD*A$Fhdw8tm3#+sX?vg+ z8Pn0<$lxvtYjQAl!ynXU}Ojs0&=T0)~vZm=AttqeGtY*`bVIV zG0dpn=DBjnUgWNOz2X8PI3IkR0Zgx_AZH_>mwFW_m5u`lQDO*h6m9f(CuOqQmH=4j zF2b9vwaze~Wca$bUWTU^B(1+-nN3$D=WjcErDI!K?Ejg#$y*w7btBPz@kimSK1b8 z%<2>asX-js;^p)ue6aYlDTUvA-D<|3So4C9t#j#D*1Phj*0<_gtDkr-L4HGxJZZ6- z7%k_N}7rdKQQD zYH*~`L9FgN?3U6JP-FXlMjHwMfqKKr2k%?;=wm6^+j{>Q%WOF0$eoV+mf*PF-=ycI zcs+hN31B6`6~HP1uK27~3s8#cON52vcV( zR<7UH>~sOZ@7X2{g{0nnu3%<%RqF4=dtRlWkRtNmN?a)m|qOq@~)Ln+_JV+A6mn*=T$G_&)+z5%JqpP%-xz5ikp(Dv=a_$lp3G z5|Gem&`jttdH zu1C~v4pnN>6BY7B=A@T4{f|v4|60$nM zR}NMrH#2o5&x(9S2m=JZh*fV7yaNwOj*~A~Cf*v{^pVZq{SzDB{IS)}yQ1I9cq!Rv zv9irB2WESRemK1fAup7^p8fl4GRCWYmW|EOr!n9+t-A zF9KK*MgRYhtLXay);8C9nGMn@>T3kBDrGd*jh^$}gtQH>8=fj;tm}`2=a1Yt#wfjR zs~>dVI{%{gpM?L&SP$bE0Mi?(6`(igDnie>r%B`vg+%H|v}PdpWNCdw-YcJffjbJ% zQpmV`?1dE$J(JwJ;ps!MwgZ;dzSA;0w}>A$NOr6hAFWrPw&)onhkcsI|1l%Ldjv@aTvor3~}U4s6Kwo z!+BUzBzaK@xPJ1Xb+7o`MmGN3hBtg??Mptl%Av;+RM#v`D30IZsUnO>QdxR~lm&nZ zi%qC5g!A?b+z5e+sBBxT4&xG?4Y2kn02aII1gZd6Nr0ur(yj^fn5%#lVL){%TSAMR zu2}0SS@RbxulKH1O?=>qYyIngWlak|5jec*Ib$fX;3_4dPK>1m!lbaxKFeHi zH5*`&{E5Xus4`Z*&3cyIxAH!ny zjGroCeh2}s{%HUUaKoI?zKl9NR{|t;o4r3+Uc3jU!>a}GLfFv{b`!>`w(9%uZ+`@s z-b8_s-wdz-H`Ik0-T2ft9RHOqefy`@HvPbrY^+SycZ23da}leT(!kp&D+}_3cL6QH z6(L3rN`(Md4ziL2fJy~cGw+>CNw1a^Tcqfs!n0U+5lHc!D^gH^3@S9|^qse=sk_#< z^=n&s`X6llrGITBZ~xjV7CaQ_dSPAbJ`;UvwF@5^b*fO*fGj*U4luf-r0r0viK49$ zrGla4HHD%AdJ)J<^8^AAzeGN_bckfWmnw0j{9P07W4Mqkx@)95p35-y#D*JObbfyS5HHxQaE9 z_qaFkR?{KhG2688mWL0wp8TCH*zsW^Y!`u+H&ZH@dL6wgGiKi(tKMpL!>9acvbte5 z*hs;~B`X*k^*6h5tN38I%PasEGOA`s{FfMyzZhWs7;^cW@M3Xg%pF(-a0QX0o7o`U z;t>%U?9!R!gi@J4Res(&kYjsH=n1~Zn28qqt-KhL*RD3_dn>8UHU$y zKd+$(OwFdPNkY#>04vDjR0{Y8B=b`W0_?GW%VC`4d zy7;A4QJk+!sIBFk8g$0e;{o--a8W_V$QpuJ#O@wUP_dL&M1<#xskB{3-13-}Nr0Di z3i+XYG_g6&o3#jKRdA57z))t>R=rn)C!vNAV;4%SR@8LXVjVXucj$>#OnoMW^R2b4 z{U-M z%JZ=j;X~>_;huyss6dY*ZJfAb75(p7tU~YB!eC*t&?Aoze+Qrtgb0k#H1C{*MDSq6 zDq$Fn!C$~2e~t=->H%4~@vW9!uQAt^s^~>(J6HbCY1rbwDG|Wsv#h#JPAq1s6~n9~ zxFd*QW-Kn+kM)Is$ck$L%RUkHv_7vq12(eJa zFMzBAekFk(t9~|V-Zf_tz1qI;eWbL4@WH~{?-m}4+j9i~BvPF0#KKE~b=SD!xy?WD zTN~f^D{Ef;k(EwrUALVUiFajS@ON4p)#7ETOMyGdSSlSl@7@!XK7}RAwe~nEfMbXJ zU|ztIfKA2d1<#Rj@3ky2^42176#*;<4zkRgw3a>b(-nB|l0?LJu5`t(Ttoh)01b7u zlDpah=$c9VpZN`5MZiLI;57m{S$I=d-@VuqlEI^$cd5Jmq8)#pf2J${N8d-E<2g+A z@ccPS0xQWW-&Lf3RrZ{;GCi+U<4YZ@(p~|-u9FUS0E-m2E!CJpgfl%~PV-aVchNTs zd7hO%i%B5IWYlJKow2N*0JvgJ$K0FMy5fb+d+TSmK=a5%wn>ZMI!x@mO_u1g^i2Gv^ha{-TgX@{(OczlLmUq?X>zL{Qk zPoNooL+(`dA9tWt)~$7^z66kk=SR;GXh3GA)o$|NlY>P_%|nRvS#l}@DO; zUaO!pQu`g`ii}+u=r|SH7hLwf#40y?-!O)K91rxN|qT0+j@HRDta_=BRe6uxa=`I)t^`kl3`{43FKEI$2>RZqV3%`1e*qY^r- zWBP)Vh8%3qbrNrINmC-(|%e8Xo~BHtrDtD-dodP&?3Z1+LEp`0!qGA3OPZ zuD}%@vix?*WBst_Y;mGOELL^a(i$#HVBEE;;iuL#^|5tKe_`D#zOz}8 zB{gteg5!d~&M6HL`B+jq&f21HRlRMh%#(H-J1Yb2L!AjE#UZJD{ee& zWl{)5dJaXqID`|04dZx%odztUQ46g@_xB>OWid7Eb2lCn#7?4uq4%w1@@uPG_A6^$ z_XlfR|3_r@0(fRKa{cse)81D2vh;0A|M60s_5S5pR-8$j4OZ(VsX=cz!FUBV30Ev z)h3uT0zz0|04(OTyq8MH0ufphgbe>&`=e*PiNgJnFpZu!L%4-K{w^gFldz#cA2npM zW%=OI#KQJa6*Wt+yyNO`LU~}3qdbN;y>Dxd{lXT#{e>s?a@+(V5x3~wmb6xcxM!u~H>`Bxj@2%C zVq<%LVV&zfvPyw1KChmC*AwGwCU1F_`m&KrT6dJI;JBWPYBxY%f>(;4^V9G$@D4m? z7$AI(XNP<++~%(XSdl^poH!_a4Zz|%2UhBbmv%{lCIK8>BcKJan%Su+ke&cp{3Zff zer%9{QR)sw{>O7gI{{Y_z)A&I5%E9YrvkC?8@=l<1XvNcnhmf77I;>(+8#fs^+r;; zELlC*chQLo1a7%{xVLt{=7X9%*Yx*6uW^>u^`6gZ`|vm%g}tehtW$fFxH`c?yX{NCOlTGf8;Z3Ef{U7zy!b_ z02bc`FF?W*AS%`~Jj5=l9Xn@>_kL|_-~FA3{z~W@N7u+8DIYm+X)>~7HGBL_yu5yP zy$bN_GYU82<-+3M^jScn zEwlsK#Ta;9FO6Z4ZDBXNgUlqD337@10961ifSMm2rmII=^nFe<9(u`%1eki|Dw++j z046iw3ZjGr&qI%-OCGahlZxylyJNJ|Zo-@pe~0-Ez!3dFUjda3qnZzWmZmwNKm5(u zK#UV>gZlwop7WLHXR^JofGmKd0G2>Z5@6{!v)ixd#DfzdTlyb)%WghS5hx$IX&tLR zx02EKt#bb7*0}UrYg_e8YhUpTi!b=vszzQ)=RedMzAAls-aSK{ZUQj&elq6mQGPb* zMAEITo7L_O`hKJ4VT%K;B*4;G`DOwR`POp^8pX!|tyayWz?GBk@wFhpMwEdAurpiU z(fU0ipv5seL)xgBR#{g2+5oU%mN(EWL_UXDQ~<23mdzR?Ei^4uycjHe4lE4-O8`a_4FF4z%i_^O zt{gZeI;(ddk%bW!c_b`wS>y46VFG~QJ%MprCNH>Pz~hlo$CVr`jen8>ejw@DIeK4i zqxvc^Ia5?HSg?G~-!O?YO5!(>@D1KZLb@|Th<*U15H$XL^@IMvv;d1xOf}R*2_Cpq z27Z--OZpAu;}Z!}t`Q{|UKITX*FVCAHAZqL$*!^5x7L37t7GL;eJ^1#a#?+o5NkW`UL$hB09rG-Lm^4qlfofF znGwL6MF5r=0*nF90BaOU_0T7PsaqgPKq~TdCBc|}3uuUbPk9YMRBC<|SN?Z^rSX`X zgBAVm&;FLaCB0a0rYLj^rIuU(V3lgjIC_PeJt3z`U~lle)h@bY9UDHhJOSLYsasYt zb=Lt@e92?4u+9PFH3G?m1PKAh1kM1_tt*~c&-#z7R$wZ?iJG< z}>bC%q2z)Yz!2p(Q(tXIF z=)K$%PsW95eJqt!{*ii^jL=Kai6?y5ruiigoR{&Va@tq};Q$ZG#7>h)^J$*#&hWJ0L zo@mBymkk~^t~p?(1J|r=>4(<5^nK~$lg5!$Wn+&lzW7UPU;1lnpZ+UrU-Z}3GWAER z8UD^H`acz~-IYE)rS_Kr>P$iaqL@6vYH*;l?xtP1X5j1Jlc%Q=m4g$0Qoe3o@VOAIyD-R~(^8m1du!#gw#Q0QAj&cJWTw!JDH?M75 zf@T=|HKgYTK^82_NT{U};|TE`?Z?wbJ_bpb84Y51S>Rbx=9vNwfUC;!E4FCg&uqov zUt0hA7gjRJ&OFwl7)oOvs}nT}NQp6_nLMlrWC5~+^$Z1Xu1GwP3fv=)VFbE@U<{$d zq&G~8jl;7EzjJOFUL%V8qR`UCA8Ad8UGc^mCA^x%R{~W{0#og)UO4FTQ|GJRwu;G{ zT4(#z*F&Dm<;kS%ycxV?+b;Zf*0c8gWXP>@^oo@XoDaYxksuGv?1D>xtO#(l>%Fsx z&t?D#hi$vJD*>DUR)n?a1D>8Jw3P%|0%WNGD|pgEf_em+Qi0R!02bdzIauUUM7dae zKleAuzWfE(WF0HOmDn>P^mpw+$)OXHUAL@z-G|n){HbxqV60wqg-1;NW|x(NYrP9V#dxt6u&gPN z>%01-1R`P$dNd&-UxzcmDhaT}8-OfAIQ%9G4JN@A>(vQQ>>f|9j@8OAtqysMnVQ4G zq4NUhPi)P*f3WqZ{$z21O5dqlt>4mTc7_RDv1!Un{&c|qQex!BG;Ow=_(rt@-ki;| zsT9eNH_@y2L~_&d4VPO>Ke3Y-GSh5)dF48sT#5Rhymq(&Z>%Rv1;@Mw^2 z$mwV^4<35*xVRE-L|()9bK5hQ@|XiB=^+v05lF_k2>qH?Cp|?Ntb3o;kDr!qdCPa9 zBWL*DjeNqD8jm1Hv=%g9ga=98h>x9hAQgcq+Q{)aq;rI1e*l@rgE0{ypQFBpb|%I) zDVH^ONlM7+M4Oq{hiuY1-*a3E<661y772?IBzx2?0Z zwyn|!yM;HzhrQ=Kg20aNrsdD9bIr%ryWw;7ZR!I}+7m15yRC;^kX3$C6MDqb>ko^m zWU)7g?X;d#r3D%xbSPC}1Xr9$zzT{0Rv`UG4fdF)cR-y{$0($kp@pA`vedK5Z2`z} z`Z@)^(wYQ71oZNHZc8A&@RRs!7Jg_oi(Xpe@=vX6?N6<4@(ZgP{z!uOt~$yVO5Lkx z!~kgIH8dP^_g%-TPbJ(h_;=LbNN?4EX@Ho3$a;7kMGOCRP|BPWN6CiBgT-@L%z!DF1=lbj0_IPv-Qbgr)q$%Q z?+=CZ0zlE^Cl~$?B()!50>i?94ia=tt5-Y3z*xZ!grw{dID8M&#;Ug@yg}>=JQ4C0 zB$((2f+Z;c)qdWC5Mbd0uvkL~EA9=TER}IzrCES#F6kXX0K5iZMbBWo#pFq40`OIz zvg&qu9)oWmZ#pE9e&1F~Q7n7sS5`IeYEW|Qc*zkH*XX`3Dc4>+JQ5U*B)$t&3aF7E zz~R=B(cyVl&L?=T0Hg_UHEUgMvm$r}N_cvqz*|AU``9qv4H_pI9;H&I5XJPu!Pf_k zO4uBpOBk(k?6P}K5LE1@#d`(Ng4yANn#GSLl*CW10wrU&EUo*zZM^v3Ti?ddbe})~ z#*BbR$-qSiS^xz=R|K%Unz6uzpMEcjfK=)(x{&BCAd(;lCwh+OJOR=K7$P9#0H0VS6tK`(cutq@=g`|SwWVC(it!>}jw537G#~MGFKo?~e`zr)XU~%|!B}iN zX;lj!y5&x86`-nO;#$&6Me*3uVQPV$ks#Om1*j?I!Oko4*-E5fAUtcFG{CxxK)owm zUpv9jaY_KHR4)mH;mf*o@2S?WR}t6$4y+Qt=e|chd(`g!CL2082r?#LRoJpx$tJCYytFGI#4n+Z5y5xI@NKrR6UOS^*y z3xE}(N9dEc-FQdlb3ea*txR2fADlQ39mS|(VVx2 z&31)d8%677V6AaNr^htUq?LGt4gD_}!7lK+saw{%?2*Mtw4_q0=Lj^Yu~;V@9N8AE zj);N7#Dy1n@|dWQ|6xXUK|o0+)vr@S)_#5P`I-f_*^0n=}kn~42C3mox*uV66_o}o!KDE zhmaG;M+jhLwyc#RfdsJBUz8?03~GihX&kVCf?GCts)W1+uA&7DI7zPuV1-?H%@gOt zJyP-jE$-v@KZ^7&+Jd)@BAT@VZ)^c(kzyf*IDc5Q%$esfiLv>NoslGthlF*2WyoPj z_CwES-ktHqke;I;!9-sXRtPN@1d0B>iDonP9MU@T{<}a6xdU^b$9hd#QVrWIqjsxh z>fIzuQcGrH=a&ww=I{O1b6aA?TV%CLA^2Hp?`Z9uGj>eHDz`b2bV*o-1D9j<>WjuH zEe^;I$Aw@pKvA3AJ0&3#<*&gT0ILXKMV`{gP)RDrgrIbnwZ=Y=dC)v@We1EOpen#s zK5*I-(ml+nHHe4ED|q7x5jZH8RaLi4Agk@P)h&Oi&t!!3UA5g0|Ff0Nm!hv__wZ>i zgTT%_zzJZ5GX@Dqx%Vgmu$&SAE27l8TA{WUAZ&(`xlfdzpz^%h<@LD|KnsvH1FrCL z1+Uecem@IbbyLZHb{(wLI#;Q{itqRxzfZjfkQL=>{UsFTczIrz+EXIHm)~?u@@SD`pnC3@cW!z&7pt_A!G9~=sMSwO(cg*ruCG%fr2>Axh1y>P;@V|^Z@kT`1_2Lx~;T`w| z1B-Y0&e{sefC|YxwY7v|qLQzGdM_#}zRA-18`}1ntvLQWTYTs{$!`wx7swL8iq&p( zP?FQQNs4Tv)-}eD_!QoJ10|LF8|ZcS1Pby1J_>&$bN70F6~F-l4}gJQLQc%cuE4v< zG-O--$mx(6FS*6<@lJ712nPnEH~_ERGMJB9-N=b>_Md(qJ?r}@SK~jUQy7m;vk35n z9w5)DY3j7(jOI)4iq)yz(qF+Cml3buxy)1F9lS|apeG0qazHflmiN(4`as+1FM1?H zvV#M#Il7GUE!+nTb5?ARx|LsSQkanP5|4&sfRGJ@LtN8HgWS!}2ezPQa{c`V%W&@V*tz zdt{|UH?;1Fwn;`;koK|9@e4cxu=BCd97PeQ+4^045qY(^Isv|Bu#5vot<(HwHg#>3 zEZ-nGz1AtW8L%Z@q-H3_us|s_;nEtU*IGiYxR@g_H6TL|%#`)QR>e?7RRfB0l9EK3 zMTk1QNNBEgigy^tO!xM%yh7 zcejKhRhp|u-}h6myH@?);!A#MRg>RX)znX{deK)_I`y$-^xhT_W2^sR%d8RrsAExS zakZ@1bJu8s);V|s)n>%svF7=YtY_)R8lZEQR&!W=IA)o(0*+FOvj=@Pr2?wCgm8jU z2{jchrI1%jk*xFoN%W*9R+WS+3)&f8i$0@XOrkzG zAk~<`I9UjyHo%p}Neqrv1;bD*?!N`V!dr#VE+05)%?qwt!^A}a>vw#SMCb8A)R7{& z8zEmYc*-lB*NwgBAxl6r!X&a5A}^fJx!%M2fuV!thh-5wSoC`~!@f$h0M%S_0Sn{L z5dz8kHzffU%;mXbp6s~WD!LAPmHc@-#IW;kcvz=l$vx}e{E@Y;eC#!RC>KEf6Uo*j zy+d=)Eeu=N#bDGF60xqKVEIXj;lXl4Brt11l2Y90>Wf=}SzgpLhUr6C!a8C+H*KqzJb!jN_>DAT+uso3*uM-}n1i+$()@)!!@zNPeJy;ql z)$_^-hYP?#rTrHLnka%QKqSyao>!FX6?wVvT$SjaGWdg11o}N-3Q$$h#eLMi;u#mL zbdY0lLbY}(p8FYmoZ*-#)EONyL(QyL3YQ9K1%UOJ5$6L&#G%jdd})V(XmdE}f(q(o z^R8RLysMTzEI>6NFe}j2zUwEp=l%a|6)T@vKDz?fe=23L&o?Hd3rvOGq5_Ko_~gHl z|L4`FW%Z*hs5MnaO)IT4PZY1haNX-$@7+u4VJiR?3N+-+M8KU*EKnq~BDq#5USUnn z05B9vFa$#QI)tuC9U#|-94zW;k_*rY4y5zvj^PLi&pf?h2NCGV8 z=v9D){D(^W_FMJH5y|UqPAGJ8vN9T^?*NuSX}=oRONOWq>IZFez^C^|wZDQvuDMJA zKKe;igf)X6p{hG)|HVfyTGRMt0ZMkL;{ls76qB+QO3K$Tf3E_pb$+G&$X@^!5giPr z7C&hJxeN(5dK{P0yHD#;h9!7GH~=R^X4@JgM>^J`Ylm<_&pVbgA|9WVQL^w`t62O8 z(Lb~5g@3Z@@lZ0VsOOf}mvlP?&g&0qY)IhQwCz2t8I`Gx97A@ezx z)Mp5ODbU!>(5?jOZy71Ri;)l|yr;e}&e7b*vO1*Wb#6xRZ@~O2h{l?D; zYFzxSHBWzM@kKwe^0Ake-g!fcO@gbQU0*`m4ewY%gBV8)f>o5)yhhgDYE4$yA&9Ft zR=Q1#{+bQ06!Pu3D1dcTeL5|RYmWdH1jxdZ1x4U0^fg-eGZX|BgyokhV2SlwGknAP zSAJ{*D?Zku7OJMKz7}<+#wx9GwI+Iv09F7@ln$T(X@!I-r2`P0EM@={3m8BJIL#L0 zWYnz_pxPsWtY@f?Fg-DK3YFqXdKFasg~UA~fHfg5YDL8-FIcTW6QSB93YXH zH64(kKk2(55%`1+$i>R2+vvLru~t}U&UCU=-P?)RM(c#nOFH+s;En`3N#1X4d*X8h zSp<+~t}{gciNSjw9K^W!GZNOH+LF~k(&KiGos@>wTt>|%ib`fZk_`e_u(g}4 zSkEmJ$f86BIYP{lhm!ETQNx8iD}j<&`zcEwk}xZM+p4twcRu=`t!vkBENlFcRmqa9 zn||i?m)Q32b(MzM*@j0&fFcq0a_R}5EC{bk@aO=lUiDthczjM;iG*qdvY=9dof3hd zA^{+PN|aCK;kwQjqAX$D{cu4o5T(ylg%Xb4Lh1WaF0BIBT0@zwdo4r2o+NUL>Si=)eM_Dp;Im}J;H_nyvEEpNP_7I= zh;_-f|I*$gzGeXiwZrdP{pd++96K##d&U7n+oG%1uJzxxSnHqi3sX0JlLVo3a$+d* z9Fsf(?88g&P7DL2TzpowS)?o8BKNSVP4xl|k{Nh&-Lw1}a$_0A?L0r1g0T^Pf&s&9l2mkVY04T2~+LQ{eBBCwP6=J;N;{vxFBO`eit61x6AYEga zR<~BNc?MunY9fUGWHieV2VjxTL7gaH2Mq!a>SwHCm4`Q7t~VaBO7TVSvZvO+;(>6&P4oxBf_+6<^_T9+i`Z^%#9+Nj$r9dq8gR=)HNYO%U-E+7@< zx!?QRv{pK2xz^88%j{TU>0QgTo~E^yHW&p+GsN!&Bkx+^u z2s3!6_9b0u9t69vKu3zF2w`+g0_T9`*Nf4Fu=6E!P+<9LTYg;qaT3yZ zivH(2kt~@U5Nah`;O|?*UT|Fk zNMlWsuRv<7YNG>ztorq0hILi~g0EifOcus%hu4z9;}ompIeI>BeYMF2iJp%Ta<`_0 zM-V`%LWs|3dtjC{eOEJiTvnzmA_+fs`T!I-sM@`7RJJWgC>^!d$y*Y-Qo!sEDh>Sy z{j)er#9V~}k3|AA`SqKvK#ZPOx7qTl^|u(iLJO`;7E@8Z1WN5jE74q4O27er+~Y<2 z)t(4AdG3h%>sJ9@n2MVU#I&AcwfbIj5^LAHdUl1)5(uc) z6CTQ{9=;^ybk*WgJS|eH?eni&%h+Y7rm;)bGC~BK(pc#TXEw*S>e)8)Gw|7y7w$^{xhqceqjwuo{HxlTNTydM{an+rsoSaNudl} zv|I^aCjl{vVgkT21%@c{OVMB7MXL4d#Y@$nC@~!mm4l+5bMA!#TmiO91VZrs5K`xG zV+U1T7xmdCE0sJb?Y?2<-8ZeA6B&B0I0&jzJJ@W4A}DARknIzI>7b~lz}v9E+fV>v zr9Bt@Jv^W4${wb~Bh-ArYDX_QkSiU$Bv~imC!-7CR^r~MQ(nueq(h1fZ(Qp!FCUXp zE8*HIexsdwChZNN?~>YePGI?6D{NN3IAeEOn(yKP0b+q6itm;TP(DK7xsMG$7;uSP9`S(Z zQ%QiccKwusrh~diS5hmQ4qKXxJ-m+<0+TuMcdS7`u1V{xS$%IBxoC}}=dER)K-1(E zYo3pxa94`zp4LF91xNiiatl3qUSI-nhxZC&F-E2K3f3iI9KDwuMk(`x?!B4^$z&N* zv4orgNM*^$0;nLLXg5j+&;d|{04rW+OWzTWOqb!4Ub{iEZj&o)6j$UK!FVo^oC&mU zh9sK{Btzy>B(KXmG*-H1i+AxF7fU8kV44K`v})(qW3>Iqpy zs1$%$tTE`Al2J8w!O}_MFIK;#A7d4Oh&@&-Fv=zaj)KdVT*KQGt6lE~-;B{Wn~+Bi zG}Tv>I=U+t50vC%o&X$1XslAQRnM&HKV+pH0z8sQ)F8xw<^HsqHCl&~jd~t{i?soe zBAuX3h9NQG#?31W+H6t zA!I;hot|62Po#bW*fm$#&1(gmq_0}m3G_?0OSZ;J+30n`I+jb`jNg=;);ev(hz}vi z8NjA~dAL*5yiVgLU?q7ANW%llxw7m|rJ4c!S1p}eJN>1VPk&?O!VMLRzO<@^Us(CP z53Qj8zGZdFh@ng?JNL{}{@67}4$UZY&FMB_c;Cm-u1=y%ojxIJhd& zgP|hAfK*@=$jTGQfp*xCTw25pY#65D@_^V$?9W(+soDB?nmX zcdc&fedDYms@fB_s2{&>WwP{Hm|=l~(4$2Z7>fzQ^HMPwjx+HZ9}=|e;$tBc%G(mP%3|_y|^6OSvf!bLp z0b8u`E7N!7QUIj_z)+dyphR<*FCm&O5R)YfDywRZgTe@4k)M$%(1cKq2xcZP#08G# z1|W@PQ7mR7T$Uzb8dLuwO2dj1Q4$04FoOEa_;}bY0kDb$oB()@{Ze36t1P{IrIqXd z@*cp=T8ove6mx5QYP4nr;A1E=wcitV`CDy@Rcs7p9>_l-2dZY5SLpZi&ZIy&zJUWt zIcc3^6L7<$z{`5xbHGqJeAW6ke`?i>?^)f_ht|0Au@#S9w8EkHtZDj=b*;W{xt#|+ z^oTW7DiDYl5KD>he0i6^oz`vpf@|U}twr+wx&#!a?%DLYe_=z1|H}Ff|BW5|@_)6r zKKQ@e`uqRcR$l*4w&~t~v5|xS%tjCVjb%|0TuK;VRXTCYL0090dw$j(SFh(nb!7^f z3J_&>2~52Q;H?5^ zQGTJM?YK3LU9pCdOAf*^>NU?b2h|S3nF4y<0O|(<(@(8Mim7(&f!cc8N``M+?!a|R z>%C-sd%m-Y6Mt=M@BZ&>^5Q?(+9&@9d+W>pYH$Da|7KGc|K1iJ{e`VNDY>`cvJ(f4 z$Le=j<&dtWGJ3Vf$*&@RC>(f?7kHNgZK_T;trbAt@R^k?Ci(Z4RWEvEwUhTPu6Z0? z|Ea}Cu322`tX9CZl8~O}hRq0^+eTiDgCwq!=bXLCyUDdgAvvg`<{MsKfh*QJAl?BT zryxj4W_JoGmM#;&Obg74rv@ZT9K5V{T~eCxYGVvIz#@rS?_#3{VIyQZGA#1i;$Z@C zMe+=>^i_iL>etDT+wcnI)(6V0USkwS2&B##J}VyOFWYK=?nz-j9h7_A?Y5dz@U_~1RP7!iL+ zHj`$994#9Z0L3t#1+eg{&s<$Dd$?4fP%;Wa_vF>9ZFtBu7f?mVKCA6LXk~pmZk=a}U;E)^PG6Zsl?pXHt`&P0*a&-D9UTC~-@lULB@?$F-eJVb` z;k=s1=`>n*LD#HPpR{%wmkFc`WW}e04y#@5#(%yHoq`6*@VE?KVV@arg(ok7SwJ9F z0WxHGr_nC05#~MuSa^})+gMf$);=UXv*hq5i3rk3F-3 zzT27@E#L;M047L^UlWMyHVGg=;9>+2eMrjWD!^42Q9#*vxByrbmn`Z!VJ(a9Ycbt3 zPNk1ENO__3ec_1!Rta!6n-ZXH)&dnHvIwMf>J~h;qJCMa#TwB1cLcDmSEuE{su-*;d+2H11+t{{0+T^ak zv+?bJt^a>!m1F0vpm)D4dOcSH-D{nZLxOE;Ij{n9E-2JyUvFl^!8$d6iLvkkE+LwT(?Rd0Gu#(C)crG6`vj{Wg zO8Dn%4aVZ{*uef@*}QlE#tIfau~@gP@1YwKM*6$sf@KIGko=C<3(pieTZ9NpbuSgf zDIefPOBV`U>;IyW%kIVE_k_?; zS+1T%50-{)F-@edS_a_WJJp`tt-570&Fr0YbGQ^7Cg4vsYg<*cm4mGc@M2v&&lq& zXzBW0tW)h&|6+I(+fG>C)Lo0|{W0}7Ht)I(9{s(I9six?UEoi=oZcpd+`Lcy5`dI) zjFqm_+ESmJWT0u?QsRJ+PP7IffOpfHr?&a_|7g=^{?^j^@Jxyy1f=LMfZMC`%K$+B zkyZe)fdzsWa%Y??myDRW2fKe^JDwDw`BcQTR;7e;BZwm@Bt$L&Q6`t6g1X##*uMFRQ zNC5bd%QMz`OuxgE&-2K0^2kTK7JB$-g<|p_&8{_9H4l{W<=R z6gTa{PzOliNy@}~CdzgXn&d1V?&@{nJ}J*w*&6rYv`n0l!Kt;-bI5@xIjW_7;sKU`cY6;n!az*aAPSIEau*mtrJMH>Q#$Bo88UU+8b6&$s-G5ZZ-2Oigur%Hj|E(9V$EvmNDmanltThX8aU7lJ`U*7AR=kO! zt)hgkEWp?nK8SRG09euk0<7d!lc$=kwOB9t(Y)}1cY-IqY_i-v4@(P}Fe9LiL5@l3#+szyB!J6CaYKJ-bql}IK>XZl z7yQgxmVIM2Q!iXFW=iO%lN;42;ULuLbywVyl0eaOJ@nYLPK}o(BLwQ!h89)W{i05b z0{Vx7*MkK{E`nF^ZrCp{am5-JN`T9frUnv|mnRUIr)Oc|_C`#TQE09elW zc%bwyEH^w@fF>3j48(XKkcxWV5mW0qC|u8ZV*zSm)a&;`>BO7K<4RIO;Rj+7NLaP+ z_uYdo@Tz6KYCbCmr1(0-pxy6UF=u0(SVGJcd{mj1nvoh+HlNAN`5k(UEZQJh{X+TSC-;HH3A1@`_an zrThL)xEKR^`Y41BO z)PsT9hWv< zU?{s0u(nD}CgF#xoMNgy$OzS>j`J)2oWwLzgoAuzh!__yAH0fJfCI}h0ysv3d* zxBTIImOmn(HGD@P=%#>{0GB?;g9NByb3v{Mk63>HO$o|-?%sz0K(RIfzafoJ%W=yc zmLMGya1^*J8o#TtyJ(pLR(S$)#S@RMWZqNDAABHyK@G6$qRS3=@VI66p40tmuil?K zq~8oYvYg?k0z%g^C4)e+0FYJG$1!C497uUxGyyF_g~)2w0lSs}0e}G7s0p{n$|N(&B+E->uog>Umq>9GOV*Zl?DaZO_46)S z|Ar5&f6EtEv-E{EtocfS{a@PR3;)4JkNmw=ExPSV>}fJ)Fm{k9UV29gnB;qmF%&*K z>uQHidZEnrCD*NW(RFK>VspYt0b$8d@valOPV>%L^Wv-4wd%He2GX?Foo65^y+G^4 zr;NJRxUO(>NkRcey7@avtT5XDR|% zq(G!stoOW2KvwundRH=%-=Y^X@VH1%u*)2y4kHekTGoU2>VyMm&$~x7s-D;hXvalGKvsj4I2R)9z{3HgtK>M~gdbXL9OB!oAy4&8*eM>@pyVlcFkd!!8c zZh6feQ4lt)v`pQ%>fy^;vl#BuJpjb!RDJY%LgzuqX+RA?D;Tdq*Q7~5r&D4^ZO&>r zDX@OgO8akH!{iG;k)~VO3LKSJLPMri=-TnmW?|KO( z7Ao)4VCM*6aWA`Ma(X0ODfUSJTMt{61O`dY={2+|THH|T;t2qUr0P-$#adae6tqKm zh9txlLf3@L1SW|?%ffWzE`fpz5`kOZf5aJz&zax=!q#iy0k8yqn%9Lz;q)4irM9tK zq^wI|kgeC1JJn`^meGq2P&iPO{0kRUESRphEK`6XR=!YUIc>%LYNwt@NRBca?jCOy zXeEDxs?XGsDhoLqe$Xd?fsg~BSqqw^ZUA|(LbX=(cTpnz5rsntE0Cvw%bN`g72QYu z9L8!{j8ziO%~JyH5(ebO5I!Q5R5f(bDhUs1UZTWn`dHD!srrXCMp|PPVeIK23Wqj% znGlk7)!y8`)7CJ3U-ZyDI$pGs`f7FiG*7ypQVt~X3S8n2r^XpX?m$F%auFhw>PW}h zkrkcOz0cCrub9A6tW^SyT$Zw3Hn{6+d;9+X-a6O4Z>94tTkXOddXLsDVPpNyk3Z3z z6EeaRN63)z!OE=>$OC|~=6si#`Z9g!TU&SLudG<$lf$g3OT^J8R8Pm_gb_fEJBoTz z_>=lAe$czf3xIZp&k28~w{Vc}aW^J7*N~c9wUgJq)(e&6DX>>Oe%p#$@#*bKla3URc`Ta{&^yi+7GcvBL4kRycCsiiXuM^#dT)GX31cCxkjVZ!Eh@ zAdF+Tn$`BEQ)=G@Jy#%yjRkGuBfMTc=e$2qtes-VR~=l&ngt~ET(8%s`!m(9H7EbZ zmLB_!{+Ily6NuItO@b}SP_MNnkOi2++u#Yint#@T=cMFG@b_tLwjZ&^RS)dov;SZV zj(?|TXnl2y{{)m`?OJc$`}Mm+0@M1eNxTm4%i`u)(XP4x1_I$3Cu-nwyj=WWu64!Q zZ<6tg=TURrxay^~tbFE$dSm7Ko#d+@iG#cqSP33+(n7>1c%R{8fw5wez`NhE3;~gn zVS$v93m)bz9(vEI3?pein@Fx(`KS!@k&{+Fazbu;A?y zfVIF?RyDvX04&l+QUMmxC-;);cNLoFx*^R|CHic({z(N`=sSQ=e$PJ7AtNE2^8%4? z=%j|x_go*LQ^-}zsb7(xRhC<)cdOlaKJy#a>UroyK!|jY^b8&yjP^`{pSsZ-);xJv zpp=Ar%|(qslkUL*5QSpDk0P&9@GMFX$r$z=IsKi~^U^Ds)xsXt)b%0ZYmUNEo@k0`9gD0o+yBeFpwzg zA}LZTqGs3b^Uh_|9B?#A2%xCvn!D#}re0c|I!73=YT?&bGXA*)(}$MPEg>ny?5=Am zg;0}8jP9;BF=$*!QWF7?ao1y009P3eOT5GRZ6qZIcWxlOY$>FLN=VbK5&erl`h85#$6ZW~ zD9#Qf#1%r9x+jGK7z$pRG%P0}Xm$qT-67GFLn~vYOC4b0y`nURd!}$%Cc=aWL{5Fj z>l0k2Yn>u+#ryz*@%9A@UM-#zNYB*!5eB85$1SZ|)-am^WP#Pml8lmDvHl2c0T4KK zoU$63ZR=#^tN#KNF?L02u41yh0s&M+faE$|8wHg5j$6eD;UFn*c1HCa7O+0yp~FiJ&e?}hS=W9iz?JXFX%1Ef;a&)D74~sd)J4&JStC9f5?x>Dck0|S-UsBw1I7(Sml%$5D$QaOiaQpCgGIc zF2&TL_0*;H)~WGh7gDP}(-mRGu@=#RufC02YuWGD+VMOWl1f=CL{_1SBz08XX2AS`vlrwEwxPK|4;gp1y>VE1RX z_FXCMDk&9FUiUF40A#%Y7u&bt2X-L($q9N-v|AM7Z>(~!TrToT=AzW!vC#zJRZhO4 zgeS*ER4tM)Tk^iuOn>N9HT|)bFZ#er7jRyvK+veb*5Dl}`s)H(R|P;WSoXksmOXUV zy-Rt+HwCcto1sURGkD)J2L;yVNk;Su98olwE&|6G~8Mu8U;gb-icHkN@5}*1pi15Z_atff`x@`GgEZp-#=c zLSPej834^`6fXb9vu(Pxg>sa8A7^V`i(AE zF;olMHi~C3oK}keR=Q`7=tGT+YK||1km(qLTpjo;HDs5akIN00LA&1@+6-o~2H?4MB&ZTfEL#y>wyMS!dP}ikV`(8r;sR*=$^pg2W!B1| ztd%~fIc5c2*Q})fzKo?01hBrax}{%P)sio)cKFuZUDdhj&fG9+!`q^349PBlbTnj zPU*|M`qjF5rD(YZM8x0`n)8VXikgXa=GDS+S6dUuNC-K~lB^&9%o-uqKTkX7W zWRZMh)l;9#+LguAdrizDA%eFGuZ=7P+^`}4hFGTtj}WAYMVwKu&c;_HXqgs)08z_w z3Hk^$%uI-P9+#;TeGy2}^YMiEmfEWAQt-#EdC_ezOW?a8UjZNi{DhqoPzW<7cT(^@ zlP;h`VyfrT@NB|pHCqI*4hj5F+$}7Gs68z3sGZR}sIW^otwNxztm|On`TC81%fbd= zF;T&Tr3Kx(L*uc@Jy}%)hdsXl*CgMuqXf&qx5x@$WwJx&`v8{Oz_?WQ9@TqfElW9* zaO$2AN*GiLEJ&DjIAWFbhi+6C4+4p{5- zb?aVr*V>oebPF`fm*O`Fc^H^^LJ*Lz!CXOj{~+H?fq<`-K&4FxWhcF_N`jUnV5$Vt z#ZVdbht=mJB3Z}vY-0v!NuYDQhm)RBp=VSue{We)_i+z##VRGlrNBEkeqtRgNJ|zgX)YkSgFV@)P4Fpdi3%rj!Lq)8z0_ zI4`|LOdQwy>Q7j9|1FEJ_}C6U`Oh}8=VwxU;s=gL>6cP$#S?`$<6T#PY=d{t0Nz-w zGc0qI7G44e+5_+E-RfW3LR<9KXSVCo-|M$~jLP$bVAvU!FN+%Q7Il3XSCV$C`UIlz zjuF0 zMf0Cn-O7)xgq)!*Kev|6zqP@A|H^va`Uk68`K^G~OMx~4p6(km{O(xZ;4KGGY+xx6 zm?Qj8NR`boB=%;jm;%_eno5GNN#QM^RAd5o-8APkRdWF?C#qiyjdau0>|}G zIJtP>tlqCSW7IV7vY}(&*ttLaKWyOmH&(Pl>$zR)nUEKyQMwPP4~MN(YaydoYZC7) z#X>3ZA+W{a%zzQRWPlt_;i%|&CzJ&dP^l6)sqR1S{1YqFx~w@WW8|?dI`{`0+WJ)} zJSyHKC(zs6t~SH(5ikX%IFoW9`+{{<}=!-oRTIxowZ*7#B{iVz{52o4S=0)Rfk za0MJ7Q}M=727!_+9!?Wc{)I6j2WmF3O4UsP=s3tBw1!TVjE}&B=Z6X$SN6!zmHcIA zq2Djv7=A0I-WX&#=@}Sy0IZVkJyzVM{z|R_3?qHxq~AvGjQ|$jrqcemt$aXpuetUe z;sVb_T6@j&&gnk2oBQ7cK3wkgW&G>kpZ-UtHP$)c5)G#fewZaP37xLKfED?!8 zuKQ7c&1WU&uSst`u#&N-RzCTGRWAHk2H__Tx+>>?XvM?#EsNYqiZ&D4RJ&qz0$5GL z9wH)Vj8_;x%}*^@X|qUetQFv_6<`E#N?&K!u=!$*6}8By3BU?87LvRoa0Q@pV8x&% zygMjpCMp6S#I-%gs%3{|_a3v-(d$+>@xC=od?A4KGpif@g|#mDgP$!_-19<>mE|cV zh^HskEURD28FWe^7NA z*&yG_b)K(64o|FPoqL&@rmlG&03a!V4M^_?ggB)Fk_Zqbz?M)lJLw#u%W}z5tK4AKgGa1>L_(%Ws6NS1fuhA80W1dVtPhqyM&46ElrCWqHt_c?|!X;lh(QHnhmbI=gISh66kDS zj!}O~R+WbnwPw7sGh-oO1w}gs30?YjSP{ShYY5K`goma;LcTY zeQVbhY9Ha7ymo~BYpWFV2|BJP)`_!@r&s!Gn6R^wf zB?nQKRHMLQ(|)U-ykyl6=dF75l*aXtl}XXXvX{ED-Fo&IKm4_WZPH>ph+>Y8V+!z*)&8D9g{V_w*L%@&`mb5;&@HE&!RwaYchzzPR&we!!b(W$?)t{van)QNwz3IVo7r~a)q z>NllJKC_N3zqf5S|EnE%^#8Q!WB-EG;_H8Dxf9O?JOpTZZdlFY53GCrm)5@WBi{^DHFjO&uJIqdXmPErwk40P zX~BJ~ow#K+^R7#|?^9n+Sj+TX>s$BST9-Z$2%|pNMXQ^u_80-68_=HBxd)rO+ZBMz>b7vHz~=?^St z=$^*!qR%xYD!SHc?4~sLUB|6``8~B=pD(6<++}N7dd>RQKd^akePBxtePv_YHQs9; zxS?7;D&RSI(mmaTMLii=GS>;uf+#Aq=_J`iepV{^v1KWQ0TLA#^?WQ5A$GtIUh(18 z53F;^Eo&G(=N?`7A*xB}N39Tr5Lj`88c&ww9|XW5fj zX22C7Ap$oMSV7O_HLVu`Bmg+lTY4s`66IZclcgEbs>sC!jOhK+j~TVn$pRGUKfL9f zR|vqW8Wf*)Xxyswj;5LSMl>5>NtRbGv#ODI{G8iZnZ~B+9koI7we7f7_nq{-G{Bv| zyH@wOr%lfiu;l-|_+o*YiiaB41N+%{^X1=}Y?O0L#JE zCIKp8Ch1)O77@P!uv5(n;i*;X>jsNuR!aF+uW}UTUMt*x0xr2tfgD|fAX#Lx6go5YR0Y&~^Y@sWbzCq6rB=Ch;tFp8qqY)KTCpcybHyG?BR7qBd7c zu~AKy`ZI(jspXZ?xI%-wP!`f+DK1T5t0t{wlY<*MAPapHvX3)Z;kmIS~~S#1Ik zByNl1<5KzpKk0h!T)-DC4hMv4lh-;a(U|L6KXgROOTeQ#VqQXgYI_Pr{R|*&lhqA# za549+b}v@&{ONaz+$+Y3L~A~e30dSJ*)TdS*w)c1073RbIccnUXI?TD;S60!kc zvV8H%OJv*rXCIs_b`P5}w^hcSVbdvDVyB%Cvg#$Q5mziL!e&lc#U+ybRn*j?oLUX*nZFk{DH ze(zl?>VKp@J+`v3C!Uv;J9NVeMsHfNgmv+}dsaAp-||NvdTtkaTAb>T-FIIC@>6SK zoA!dwyv$4S;5~s%0lsb$=`UEp$W<$yd|=f}KCt+TFRgj?PpxLzXI4D_xqB2dd-Q&_ zvtm?0Yu-((o2Pd(pK4=?#<4uS>dN294li4xIjbE!>%gA+W)xMW_E(<9 zgZ`JR?bVAOTlK=H-Uh;N*QBS)! zs8S$+9j;V%$4Df>w^ZX^-XX)GSD;n0ES-ET0ic)ww{MV`IA?o5{y*8xzy5#O=%H_Y zy|Wf5S;OX&CK-Z_LkFy(_id~0e#^>btdZo-PCRxhVvyi9W2=3vQERhHL@e=}J=dE?|73*Db z)B0B4vW_KJtbO4{>(aG*`l|m;sH>!7uK>&2GGq?Oa5*A+$AJe?k648a!^Qx%FxW5( zNv;RM53P2`SE?ulX#YY4*6UJxcKnTg^&}!EYX*KI)Wa@oo%iVL;IB`ttLeB)4 z2!PGLNBTkEMa2Ky&$)!;TalI!E0cVzKVs=s`>bRBEsZm>41K@JGHRqxHD=VvBxNR@ zayzvP^x1srucZPz=r!rjnq3+z8Nl6Vt$qG|&EH9Vwp&1Gmmd-4;I3BspOhnS%WNI_ zml9(@=q@V}!b4Z%ZOSBiBRvNA1(f>{W(}GPQZp(g^CcfSD;1-uYQ7AjsV4$iPo1hJ z9?RHxXcaOV$_2z?Wt!I-$zAa|`FS2)N$7QIv*inP=V%Ob1U5t1RDBb`qJKmHVqakl@?Bw@7FUIYkr;=g2RPOyyLDRDrzWpu zkrdftSxg!%F)%Uv{Fe8uRsy|o-cwnrH(ijCa}essY_ocS&N3i!~G2m%9*vaAUebS}JL z?F-)1xM=Z~EYmm&n9JITb~R#Ac&-5bRy*;+0SW=_gsLbr!1}_X^iWs11f~9NnY>`# zORk6GCj^#?x(<0xh+D6K*(iZlgq5A#J>=g3C_~u)#S13Ut@9yP7RkKKI$qN7yPCe*h67p~WR9>;WRbWd(&vSF)du`Rpzp};e{7On%?`k@1g~L}Y zjY{sEiAgR{i-fM)!8v!?9Y;O}1cQ}mM&j9Q_t2sQS`%ZZIkMh1V=I0dZ^OAnakbVw% zeW>eW{r|v<`|eq8&oxghPwx-Pnsyv|!j zJ)ay3feN^gV+Sz?>>y&7Bgyuex(}~QX5TeS@49Hz_`(}U>6M%o0qOVwDRqjE3KX=c zpB%W1pyk?hz(G}|#*>Xc)B^IlIqcT-%{rRD27zmhe_ET`P1`j#B#3(+nSc>z62=O* zThSP8(OSsU8WlL7zwc)@CGxyL4jm`Ft+nI_jJK2jruUQkN)5IG@oJGQ^-BGYI$a!c zPfnrQ73&m{EI)Y4+P8mfJ8u6QTXyVs8WXLFk{#}$D3;MvCfQadIb0%{Pd-bj__d@t z6tZ;>mgXP8pV=>kwDhGlZTi+4H~q|N*M4K&yZ+iH-uV~SvH4e?Z`Zo^3+vkWg*8k+ zw)(|)jpL=LOz*i=L=f;sRZFfwb>iQ8yylxVX8K#ef>H?VDE1v%`Yyd%I!JPx8c^gS zQL3OyeA~O=tj*te&kehxZj2+scao`+DgK0)`hfha zTJPb-q1896c35B-*;63^(k39*iL6?zHqMibUo6?NCIAJ29ppLyi|`kleyRofW`ipT zV8rjkJvkh}Cc9r>3K{Yr0MD*3o1K}+@ja`U6<9AvFa=tRvc4hfBArsjqSQ!-M(tYBYjG7(l4?Egfv*cYR z)>M_oQ`pA)R=-L{_IfMt)Ox_hmLFfHL7i431g<>ai7KkPkpx|URV_)5ZN$pZAu3c;eHJX^Z zIUX!rZVAs*DkWW=ToV+)l?IJGD!z*VmL@KE#$+h~Ow@5eR!FYfqQ$34ZWPmr@muE$ z6!zWJXHrIGQp5rt*&PBX9V^ra0h6YMQe0JBV8kgR+#wE9{VbM*al6KX^Wv_)q-W1`IoDL~A0V;BC+-oR7 zMV=qV0M*{vbyhZC!ePp@YKwsR0*3RXlvLVwp;V7whIJP!M?cdh!w{VT49ZNw&rci6R={l4++zN zPR79#XX5}LfgyGoauBpE=k&3wmNV~$HLrPTZL42emVjpUf;(2X@Sf!loVDiZ2U;uF z9oUdGjtq9fgH9fy_=FrkP6cS2xNR--H0P7I0FFR$zdSToyXcNpPv4c{aL>vX-W2e; zCD|;%DL_j}4yxI6J}b%UA)z`X>0*Vutb$y|>OJH;R%pHHUEZ!$AK36)KezGyzq65j zf3*I${@NNh{KBSB{X5%v_rKWKoN)J_YnGAJB4sVm zxa0w0FuWwl2SCxR4NFqaIr=WEN;0uhZN;-Bnc2MHjE!!7U<2!JYrSes>wCOX zo}%B+bnEwQ*b!i2Lr+OBV0O1PO}uCQ z%WvDrss~m-B#_Srl$bzN*>)LQ$F)xPYHdlTb*hhX3LWd+B=YMWlvUx_oKnejO4(q% zqF-}cq=W?oGU{Z+H>@xc$dT!p)vH`jaXJPCS|M~ppa@u~@6w|X00Y?vm?SJ%)~j_$ z(NW3!v|7D`l1BWFT-?O({r&_wz|xrG$z~^{d)%u96zc@AYL3bPziyoi?py1ETh=&s z$#-EBLIjAVRUOcEw`85}ClV!j$2e1bm5oK5B+$O_zVi_IuGB$8f8+4TtXW|>RV&=% zGgmME5W)$R)-0XVx?DzNApZBfsYdlTP72XV2RuaQNQf`QfuOM|s9x#L9`eW8e1un* zw1vvy`&K*l!s6qfi9VP9dZE65=!JwiZV#i20@E?AJ)BQ?HHo_5*@}QLdDG;pb1-xa z7hhK0Vky4huB6H=E?3{S?!tGU3$?=D3w{!IgHT?hKuN>IL!tIZRwIx>;ut%FeD_RT ziwny@pdd}?Hmz=vp1)8GvdELs%IcR}Y26Ad#iODHMeK5>wnplJ&qb>#L`M?j-X2X9 z3XTB}i;r!jfk=EK{K;Sf)QE4Bd=4@33|h^Qm{XQ(h}TMivm>kpFd}dz@X2nu;=aAU zm9=U9EsM{S@RBeu?v{lze%mOZ>Xo!*X%bE$>6qgUK+6b)$b|@nI5udXt3KCvg<_J7 z3K(pSRrYd7C&Gb*epxdpZc&m!62vxH#tEx{3f~ZY!h1w`5#^4;2Ur!hX#r@Q@LZ8g zP&;_ki9D;yaas56Qrr~+lw~BXOSp9*%(2+CXvDV_ny-Z_YmUWM*?UOu-tJZ?8y4_X1#l;(S6@Bx-*c?Ct1Wm9vA`whJC51BZJ*lo z{%`!iY2QVZho>!gt2`%y9I-k!EolCb*Dsm9ot1aEk}JM=Z^!x z9c+Ds3CrG83y#|i}6r7*I)q%>s-IiER$9~2-tF2H`ynigHN zj^%fJb3mU!X3xso)-ip<+Ll}u_`G86i?3S8l54(!pk{&ijuIOZeC1NEeg2E1|)_Er0AYIcKH-QU;DaovyXO`DONsKcNu8R8wR0b{vz%p>&4{!#wuxk;I8M~D5 zz;JSYra)m{=LOw&L*VK`@M87d7tp^Yuy@f5e}+S+bw3AB%gFJ=p9wj3oVAkSn^rMS zVN&t2KjVe~) zmeAfj#z1Q#Eipdq!Y*k%WR>ljJAovsrI)LXrM>T2+2DDBq#IVvm@m3*)l2SM<&t|= zy7-P23iuSv*WBS@#EV(B%ROu!;-%yP9wWW4X8f|%&%feFYH=1I`9i%b?%3#tC$?z& z$JQlK);@XD;-gf%KkLU7<#YybrSC!&2xM1cngbp6sajx~UEhs|C7Y=dFEA*uldRb! zh2uPyAkQVjTMD>mS1N0b_Lb=G0$m9W)(AA_OX2q4v59?uvc}~f>NEY{dNiyPj873^ zZalEzBn0sTr3d1Y1%Q$!8DuRxWN^LZM2HgE1^{FS9am~WmA34%V#%$X8p*nH$wpEv zBo|6#)Q)a@ZUY-0S}vt1Dx}?zz6l%p$^NMzfv`Xv|<m% z({3Ec)OO$1TE|Ac69U9HtZw+JHP8FlDL(eTHH)APkm>lR0XOeM5s_p9WOsRLLjTO>u9iS2;)={pPd7+k_?hq=vrt+fZ7Tzj`9^& zCU8?K@?=U){;L2h>Kj)f_^J(_uvy+6yeU{D%p>5&aduT4PkPQ`WrhtJZU* zZ18A!4V>cOv8fn7Vx_VY3w!n%XG!_-GK2*E@Yfw4@@QIg&xSUCW}PdZ>fL%)A)Yhx zr4CCFu`^Fr9QCpUM%Y#3HBi_wqj5{G6kybv07&AggJ5Kcd@u69$TI^ZvQ3>N{Jie{ zRy=Un%7%}5QNs#Z{?mv5WJBA28fq7DSTBINOzo`Ec5U7;TnhxA z7D(YP7Ojzh+Mw$?2^JX$vYyDTz#B}+9o}NcQDOUL{YF5tMNEmH)%x|hYA3fUkxvEK z!ed;a_m%4V#8D|&!qmW`Kw^oM2PHu2Mowt$oweqrw{2+0C)T?1vB1_%>)G&uwXS&P z{c2zJGK8nt?MB7pdaZAAY1r0}_loVzQpD_}Ea;=i<0Y>TSHIx4#TVVR#>MxN1xBmp zUGu+7hAv1cosz=V7!e-T^AWgIIp^3JDz)c!oew7^v```byq{Z`(e|!`mrUK4Nw}?5 zN?ytzk6Ml&y(8d0AbB!yU-ZDYRu}i*a&J|3`@8OiqQnQDv|P;(xl!4z$Gx&Vu0wFuXbpoP<2D5vpXLrsEuTt^Z4~SMj zDMbJX`oI@i3k@f}}V%hHF|w*0Xz*z=7IZTiT1S3mW`m0K3x@C_Rru#WeSd{GjTW2I8O zR7RJfNC_GTLF|+jh;XkH;TjB;BG%e=4+ldYZq)qane===&4=%Xgn#vXcB&GJhwt$G z;GG8Cc-fo!aMB0z&F^nID?ZUUwq3PY*ELJ)zHB|4zp{zl-}$-%jB{``zlEnM+W^Rl zb_Kcz0R=1&6%{ECMTo@%fE58HJOu1MBk#%kT~7T)JWv7z^ch)AV!sr8j*OI%ogdr$ zJzrS)n7|*NaXe_g>lnHIwgY9(r!0}2u4JSsdkk>^8Qt&Vqt_p)NQuTuayd2=;mr`_Wfij^+b7)y3ZM@0ZD zRx#~5s;YaB1FUoby*~%Akn@B@$(t?iQa>w}I>7P`PK|)7=YvBS6b$nUWr@ zcdEIU@6|dvr}oNVqtuOLJjPM=m_U;ZhMKV(&g(gNWIZi|xzakT6i9D;*Gl^@`;l0j zONt(d)d>v6$-CCO*>F|6(m0Z)Furw`Zv3HylLFnCCLPc7Bl6wzB6OwK?WA^B^-{~P zS#Cx8tTevHignFXJE#YS{_t97oJCvBCaVL!L8+|!qBTuEw7Std0?U#sLo!UkKH~dG z7P`*D*b@JN8T>>Kq9l4IwGd+rIJ**v#Uk9PcAnFATGsSUJ>a2LO}uZ_^P%TfJ^9GW z$8TD(EHk$RWzD8n$jU1h$+F27V`mG|vO6HBevuZ<0?TWh5|d79Vi(BjUuYRsO9VVL z*|HG)oG5iPqhYzOiE<2ohGrI+P%~{uxr+QbqU0G>wac9dOEQpvEGI2s78c<<6dWL< zYWS?I3|YKbl6WsFu~=ns%c^E@8w4sFgj_-L2nr9^B*HY+SdK%S1-IW_tR&5s$Z{-{ z#RI^~t`>6;mV*QeSX>b~=+gqHm@8uvD_<7e!va`%pwjEr&P4y{E0jZDG`{qW{!mP= zP*!M}taElr;--x%$r5`eWXJy;T>-eFdO6#O*-c446^FxSQi)msk)uu~-ugnq{zGe6 zaKT;VBx&Lmb8nHJgS(#iHPw4L?306_z4AUDpArd~>RnzMpmzR6EkcA0mZV5R5=EEa zD*!rv!MayJv58$@OHtkNuoemCw8cXzxoTU1<_XKW8eyviTOD?U0)-0P*WZV;n3FBkKzkY&Hj@>-UKbtfQ9h}uK3jgY{W7#E@GM;&S20nh0* z5)6%7WRUFCGxk^^f*AphG9h`keupbILJS2RVsgI6f|kPZ>i7x5)8J>f32?DtBezFN zOu(LcS?t`xBNbn8#~K&jwaJ~|*!Z@uY+&O@*0JWfH7|c?@nv_D#PK(U0tM{s+4KCs%UC!WhtDr>KJ z?5-Et#4DHv;A*CgdLCXuTAR>pyjlWRA z9FG!;jL>JU_>a;r868)o?5Fy?i!NaW@yFYf~-1q7S`Q2HD15y$he zxu9+NBLSxePOZ!DTj#2$Hn0gm^@Yvf{S*Dq(O~a6fX!t?LI(w1rI^Yz&uw~Mspg-s zpg;m10!j$rQG(~G564b9cID=@ihsqgR81!-oUlFB*o!3JD!LANVsfldYq*$X>bGPd z;DM7epcpXVijXk?!Ryy)j0G6j5eK*eWRbj_PTo|xc)3{0s1VY+E#7ObTYhE3Z~w__ zodK|7O#)UOr>$-2BM;GXUL}XqbDRu26xjvax%8&>uDS2tCO0xjASZO_9uFB`nq%tl zMZ1T+Obfu0^Z!cq-V#x{j7Y|+NNp9k}*2od5K$f%~K)OxEF zP@ncmZgn_wFkgN5@7MkE6e2Y|eY+ zyPi44C9m(C))lf1{t-`UY#mfK>k3MSao8P5;&M^t9F-L= z2278il#;t_r9F?WcK9Q!8~NC%>y=OCX}kakd2)L2Xb1ptP;=e*eJyTIu)pZ8dM{YV zq1Ghz&jDC~Dv0s$iLFxGG*%$;41lM`uB2;+(6a!5KKnj^l}8zes?8FB60A}pB<r5kcE{d3v_79Z){-m&#iBRtmx^dS|C~|C1MQn2*kXE z;JhZ6+8ZldV(Fzzyxk;;59&vcXNC+WcKVvBm{AwZ8OjS<37(Bpl44t?3n- z_wuCz^UFL@5@F%G>QIIwZVe6;};~?dAw~sAS-jRj3^`6IZN$>bh};9tQ^F zxoKMV(0bQ>=*iiDMhYjAoLxjkc(pfQKpc8fe;)#qI6~W8;&IE%2!3R}qP8$R;DBsY1#PVeQ7f7HsE)%F&`b5Iwxiu_% zsxf$BjVqp8>&g$TdDZ(4Iym&1Bv6i=2}L*c+-j5*UKuH^c6JQjaG_JT8MxAKLL{b-v4jVs}};?XNsO!Di9lp3c9aK50xPR8IZ%O1SzwWvryrw}Q5 zLs>mXrLYBx1tQX0G}djq1tw$!0V)Y=`0+f~w3hDb_jfF-OMt8MqIJ*!$GLu~m2FI3yV^<(SXq_s50nTYRMUZ>W4vz|kk zu0{%rbOiBPh5#oXI!`?JG=n{%x;|di+P5SF30v%Q&lL&A$m!_(SJp>J&XyeWbOQ0H z{>QtYueFh18?Nakk~igRth8mPpJ_)PB%yjgdPIL?G-0@eeAi8Z^lX3?AdAA8>{=}D zJMEs$=4H>ESDDlJ+OMs0#b-9~*6(fpp}+NUBs|S7Rzl4c!{@D5W58LarBYN-)$o~c zoYlBMZpT5*)gggt0n2`Nld9k9FZptmzbNcUoF6Bdn$v#NYDX_wqm*5F|2Ypqa{5R4 z%4fFe-hZ&o_y2>%H-2h)GA?o_ZfQ)!8&uQx%?0l{(C5T~`o&MIWyJ@66c(jLnwCDb zv2Bt$iys7!TgNd6gm~L1^N=RPE=Gi*a+&Kd64OcQX5)@~4C@Yf$a!qrw>G@#XV$m& z8yng5E3MHRn$r`O7MJl*3)tFiS!#3reCb%}8xs8eqz>0v0TggHDrF2v22ZO9KN6gBLU4`CMT?|A7r9RNNR*65^5KGB z3_9_LlYmk+k+2O;c{MU@oz^&^Q+dAY4Pg@!(J|D?^UFX#3P|NtF4w)1!y2E0hNWKD zi+%AL)6bFXX#YzpsA!BP$(yDLE>BU;NT4C+}JDh-6^@Da*ttW{0}w z!OvkPQ4(NPE+JP-)<5+jCZ1>jA6xO@1NU5&j7sQqb2Nm6Dg%v65M?H&F4dwaubQ@! z%4sVohtyCh!9sPuP-rlhq-$JybsETqb$$;C+rgbDfRF%K0Z`4pX4Wqig{y;cO2U0E+l83c5&2h^vR0$TiRcZ<)Mk zY_0br3cSR`Hlu1g35(s+kF9&vXEw6!7ZPYN#9;|hgn@or9X105G%t`RFz42R#th;! zJb1kuzqaAG{%E6b|CM!b{;3p<6zYPzMul#-jJqUQe774Ogm;Xy(>Pj#@&UP8b9f-K zdd|8BrEcnuTfMlU5vK0aS05O z0e!2%8WyoFneZkG6sibBRbPrjaxNyx)a3)$tzrD0wNBi(R$ZG$Zd&7zJ{!8?^{(KZ z0$Ij6@ppW8Oih8?8AYd7aux)XH+to$hr5N%wj> zKpie_1Or|~a(1NP332tmXAKMQSksbw*0J)5z~}qcxBjK|tb1l1s~&kct99jv);Rs4 z%ZY-KhXNo1#vDP>Ch*j(HK70TYH)5JVK_=9R4lk{b<|K2IBDPTu{CY^%xboMZB<*O ztXF<+B~$MU5Zw!hQFlsk%Sy&em#=>2b6#ZkAulz7G9;{dwyq~yMAl+ ztH1R6Oej!t&d4>R_EX8&83$N7BLZGh5PnYJu#_MNwNo8_@Ve!YTRQ#HnpS+GzNu|` zM(etdt!v}w)~ojQZ~n$QWQf$R`@*W$P+RJp<&Fvj^Z~#$*FL@)Q`Q=xIlR0LnhOCG zN}Q1M#q6`sWrz z8W&!7qX=&aR5>J|H+jjLwJy^HqH_eArjGxu?YRG+Y~DM+x0a27<`4XI06%maz}G1- z*L}e^G!zfr(t4QjwsIJG+4vpz$o6VIQu1VS*Jn1g?vdtE;X z5*!7ZmsmNV`5kN3nj2jAjV+Ws-1gr8V1288YMslpp8Ev$YQ>XPc!l*_cA^VJH_pGP z@gSThT_}T}+*uB@E^5PTi02adJ{Md8lAvXNC3m)Qg3z&Kob(4Z5Gepn&B$2Ik_51d z09Lps0$G4N!fWLF#;Vs?y^L_Yi)^lGnz|zSfG&~ztk<(;^pP{?(TJL@0$~T-SS2qj zK5@gUN3UC%KxWnOEe|ca{4NnVX-ojD_+s(GLg`DjLAsb|1Z5uP>ct;Q`D%BRZUjZ( zDgsylNxV`R=)N&d*ahRloeiq4Z(F3PCdsXohs18~S9r2Q-s zw%Bq7XmGSk>%>WG9%nbz4oA#*qbQvZpqn9q!W7D?765bvtwkaR!)?ieV>e||Tt@t4&sg-pH>c?tqp2up0@l zM*g^j?8q}KTKJ&^+qc%d{&Qd&73v?q><;w3GDR?J`%vZXW8vntf1?PtnXXaIQ76P z@wSjOEal)w8wvE`MW7ax*GCe#j!y`5P2Q3+k`Qk{W%2ppQW?OOX)F zm$EJth=Tkmpe9N%gnXq~z4}Ps#q8{~WDR5Fu=@wVOky#h&B2|n6lCN|XvBpp`6p7; zgqaac992OcBT9h!IhB*wtZ(br*0$nP>)-V|t9$zoHu2_AUC|iYHck`fu#uPygRmxZneUl`EFkDIwo_Qhy({ zf<6iVMY5PVTv$MaQzNno!_>ZGI9j>T;H8>!d*R$h%fMcwE=hG7v9VlkXTit+jMS?-IbJNMoti zou^L-6gD39nrC<^2*Jjv$<`v7pl5T|ASYQ++!J0aXu@MAP*t~EvXdiBWWdxO5HGPd zMP3_`P`CQ0_ff)wLx$N1L2em2nB*N&yt$%xzvmp`p{BTURsV5M&+sFNipBTE7z-Sc zbJ40su6gRn;*Qpd_`M8*Xg%9g0@8j~`OO{w19aMWr>Wh5?sZe{(~B!>uZ|D|TA#gaA58`E{B%!m(`{N39Ve2VP6CTKYi1nOve+ z#Uj0DQo47Ebjvcy<)v2HyUREu5nhg=S1`ik0xjes)i2llFHO*r1V#Tt(m|31!&edquGo&*xv36fF1(@JDXH4eUKO|qIQJ7hIBXt8S``OR$WL5m|X z0X_-U(++kjy0%$a#}<#LX9#dYc$?;es#J;q7UKxGa?~xW1rJSe^Jc5;lv2o^r{At{ zw=tlLwvek8(>#RaJXs&*Vs^DNzjL1iixj>PG)akhxO&CV9g81Z|H_xLbnXODRU~0i zhL?xkP&-|@`mR0!XitbQUgB15Nu1O5gBzEfHRK2tN~l#&-SAye#glg>7$w{WA6o(E zO|JUFmYn?O_SU`sqYdr;N^KH2ry{c_-)|H{64KD$9_AA9Srt28q=*C@sES@MOO>Lb zRekRn1?qfDaP=NtsjwW*`Jz~CnS^-bl?nx*-^Q7vWj;og5eD43p-hangc2;-3@UC3v)Jb(J=bXDbR_CtH zIVY)e&N(Z!a+Z)l5{L{IIhZ7a4HyS(gALe&!3mEuPS`llc<$I^d)E8=u6=gZ=~gu$ z^IrSv&i!M3_6a*a`+3&-t*mjp?3UdAWlwuXTNI5~l+)4}6CH;ItPi3^v>d~0@%}} z;ZKzyy7n2{^^WgY(ey{HZ17&IpZlcME_~EtQhL0+fWRzmXehIg9lUC7Gas__umqXj zQLx|vyY@x1`Oke*pz6344c;v+TmY&4n1J#{>zsPYs_7Njr*}DU#NU;>Ip^GO`#$xL zw)&%gWi^*S8}>Jx{)G77bv@fDtJB&^&lJ!fI%!n`!{V&+9ahAzry>(HAeg#0IRs;h~Ak1 zeKW;$PrG}%TnZp=Xs;VrrFBoOC)`$)J3#?Pad5y!G2Oi$RGsWY;GcDu99<9K3lu6P z4hW(v0P~JGRO*|dlwqx^r2ylk%O2!Qx_+|jtTjxbfbiW?(k@txx@rPMfD5ikRxI`9 z0PtkBdGmJW5f%f1bQHKDEqg090W4RzkyDM5SHyGy z3FU6O_|Qc1l4fvr^}Jr9mVFNg?piHKYiV+!W2VTFoiSKETtN z^MDfHFL$1s<>&uD!Pb8?xp${gYp4B$hgJc!YNiUHPkqFdb||P4GxN%&LSWQ^q1!$g z9^M>OLKd{@2u?2pP~fpQqH+mc+<&iafThKn6~K~aOWaJhbDvcT5RfT@`7#VL{N4bI z!mNx7lYb02X}_C)n}`5dj3u#D1l}>01mv+Lg%v=RYTxKqEPTkAjD109+}(?2a+Jvg*V46hX}7IzWWC@lhaU+vYsQY>+=C7X6y zTAE`L_X1W*-5&rCw=M-q%lgGEq%j2o*+D{+Z0L%0u6u{gJM;+~-1>HlNpo~}6TW)_ zX1Ol{xg}`O&SKpXDAMS|7$Ys@_E4h-VBtFP^!+w6B6W_M+e3y+;YJ!U*GpUL+-o#g zMXOEp>@zaaTp)?L5%WRDS3wJ%(J{qumw*yO#d;%QhW{NmNlXlzio&FWrvy|GZZx`e zH)iv0kNGImbrEcZO%&lguIru=&=5eVm4L1eYsDZO;<$IPzU5+{s1XH&<{ZR#d5|dX z5C9;-;@v0RCFJv{Tk409iM9)O$r{1WG9M z3Sjd4)O@8fG2oBXXfKzb^Tl*OxR=l(vEaFdgxEU?U<5H*CB+mez)B1y^Ps3%!dajd zL4u`)jL(SpAIm6#`P6+ufD(H`+X~W>6I2fG6!l-y^PRMnZ~6mU^&{W01<(Dq1-$~k z-IqKQr+3~1M!hqS%aC@|HvX1hQ6_ZEykWOWOlwb32#*SkIAF6Swu_gj~M zQW0@#9eaJ;Xk!xy2(Nw1@7k=l{#Tp!!f#oy@&%iE;`7$N_(ciFE7qXm3klA>diiC(t8-L}n@xvi;*Q#NPXfs$^sW@Z@|aJ6Ov4^A@-PkyODrW>NLr~IK48tWPFeFz0gRE;PR%pV zx#H0}Tk}ek?3J=8z~#kaa~4pn3xIX3rk*v9)mz#)!h-o+HAw5JJFR8p9;=}MZ0`k2 z_ndcN)S+>v9aUxj86!R{?Dwa+1Q0;r)UOGxoVfA@u!!Xb1ocHWw&o-?wrlkK~8j6kU7tjEkqSQDR0c!y`2i^mqgg9tX)`3a4v9X_IS zpRu-Cr}g=O$0gz3 z*IEDaM>I#TdCfUo$)Pf}Rr3#pOP>LE;{C2nOCiUL!5E}E)=N(i)4p~=vc&%5GTd;I)VyQd;Ut?KRjr9w+993f1N?XwaXL02Uc&0jU z^WbuirARE%%SBTVgX!Gk^>LQ%d5g{4`g+SqCZOgOnj`?EA#+b&1g}ZQX6IQDo32GZ-%>O8+t9YhZQaGsSi|TO znlHMZG(&Iqk`dTQX@NCwvvPqU$|BUwIOZ)V2s$S_&RtQ&08!6|MXIr<<`p2TN(`xS z%6Ttt2lJ&NYfJ#BYT$@9Pe0=&3dq9qXA{^UcBPpDiz8P&Ko#o^%#QXC9dphLupIGm zb054Geh8ZNjs;c&z287%Pp~k36>$e(s`ogy>?V(`LvwE(c|g~{CWd!P3+t3+d+)W* zIgbiFT=hV6N-2=qjWxivdITr;hl?g>rJ$K@Ks*X-OpLTxg3n_bYQ;b)w5WNA^@^53 zWPKrI+Gm`zwi)NGZRRCwnSIrJXp*|$y5Js(y#?GG*`~y7N%)3w1^P`Oj8X=;dVC-1!f0LvE&3lojEh)AjXXe?*L;y8=IQ8U z)*+;pKV=)<^Br6Bu0OM$bDtIP5|C`km2nX0bK#+LyDN!yJx%*8*>cj`#sm_u%ii%j zw(7C3Ydj=q+An(i8ySv8H2)>YTj0R62>}|KYn45xoo{)jqd@T72fk#BUld51dR5;q zgo!Eo9nf7Nz+OS@PX{1JU_-#Ulz{!Z1J-otLpJ-(zio>?@Er@*ykNoLJ-UZ80)XdS zJ0(D!fM-_-u*OJBt2Qd&V4A z$~t`~&0F_H>E#)hXIC{biNNJ^mAY|Obn z!+wS&q?C)d&{`+ny~CA73Us45lGRz+FVNAqTknYsN!|Mza~ldj-`mo@g)Kv1(gCFm}LblJie?U1d#rW5#4l-ao;UI zaez@se7||$iOBcMA!1${6C1*6My6wB52o!6K5^a6P^rb47Vv4@;xPy{TKv89@3G-! z(zI#xN}6#XAS7g+9S{RdXt6Y{(F@l??9}m9BRYPPK*VgT99l21B8E2Ql+_I#_jGQW zani(+Yz#m&L9kfNhP)si~?Su_(c+8fac%Os@0$o%s;Xxannk^EJV$yvFEZM(r z3|P^A!c&RGcpOw^buSrdpH;;4ZSXiF+U~SWJ8P}e1!|DSy1L5rly-fI#9_gmAH$2^WB+b@AA5bV|C zTQ-Vu13)CW^cgEr8GRykE$WcDn^jB}HxWcpL##>cPep5I))FeD(GzP!Kr`(*0D2@T zV2XDORsSh33YwX6!Mc_{;;H@wp|_1*_pu-d7*jnx89mS+YXzD(fyM}X1V0&AWVZDl zwIX6BdJkG5B@6_7f_6ZN_7edDy;V@a;Np!SH44y8Z=Q_9K66 zYu@%pR<`JA|GiMcxujK~JD0)?c%{5RN?;Ir207#t#SfvQy5~5rSaW=HvDFJ{|X9{Z%B@r~<<(jK*H5IrZqpWV^ zytLi({_a|5-|2v=Z}G!Ym>zYP6ScMgsMHR_?d#wO*KwtQhSsYSz*QhC+WH*Q@64eR z-6sv@!%zSzXu1D+54=;XC0-EH1JNOY0W6|qi&pOxFxjtT4(mMnPLQ_u7`)BG;B~;2 zKuojdvgW%76W0q6z&|9k!>aIWr7V)M7#1=0^moDoP%gv+h*k5LG-7t(bCn4G)qYG^ z|4HWq1UQAtCO*zoYEYvfIM^c$x$GQ?FnMLq-fI{3NB~}z@|AJOM z4~ZxlJyRN`MB_`+2mMLwciU~}J}#y89o9d3zqd=G`h8HLb0)N=X`h3uwgw}FfQ_!_ z1)X)D#7=q8Il1rO1xQst(fZe+EVR4s(2rM7O2c8#wNE#hC|_) zE_0dZB?|-|UMa6eZ=yvWFU&ipr?Jb=toW&bT^a8l#T+n~4@&Y}lo7ys<#k>g#Pjfs z08}iCL58^ppI_r^j2^myr;AI|Ev%7H&_qYua1CFB91cqEWB{x@kmWB4>lNRl|6YSs zgt=9di-{FYG+OLX)**b>o9O1_Yr=_^53Hi!qyN4qIl$5}W0Q~xDa2nFnpf*5?Kj%s zpe114AlSL8|By9JJ8hkFF8hKc05+%)v!d0E08Y7>hNJ5Ef{@9;SSkgqYGzn*+dK*A z#g-gcWEH*A_`23RKp=YsAG~WYl>*dc7opW?E?_M~YwI4p!{*)oqRrUyyj6|RB51#~ zIxToI^vFS=GYMS_> zW-)$TZYfRFrkz$Hp-3+*EC&b%ug@bOLL63&0G9{JleH!7y+pz{rE}myOm+$&2)t4G z9m^Gr+FLQf6!dKVuEk`j_DkwD0iu|*ae>jS8+Tn=*Q6;f#pe((6`d#DU6Ss(XcVJk zoILv5wtPC0Jt4!_lAZF<7mNAL7ZEoxY$ zX5M2(#4eG6HGI~}C!Ms?!Q)moaNH^cYHMa*wD!fn9veahbhjKyI6LVxHO;t> zOy3m?`mb6r?_OK@{y(;P@BCd`__|-!ekb)z63Pt{&bqH6Y4?GED_OX>j8gU6tXcv* zu6=@T0h-14+s5~Q+gfgamlf-LoEHI4-$b%;5Wcu}-DN4@kk*_?lTzq(=}AONehcZWch-izK9ZC7drk66zNvJNRTa>XhqU$pe#1+Ows zC3~zQLC+~G(eJUDcUXMJ6^l*1WZ9Y5tZ&6*HhbF(mSlXp^&YWsVa00HwVL-j@fmPh z(yB4kyY{R?&4-x4Fi9c_y_cw76}%ygGX%tF9r!#7%X&l|5ZH#_H@Sj_kmh(SSdshC zK@%X0k`crg3T%bhsDNpKUEJLil&%xVCMFDkMQoXr7c9iy)(lXDf+*lYSryhA_280i z+!J#hJ^`=NnqaL6Y(OZKD05iaBUcxSCc-){C6RR-D)qUr3JJHMa<_;I&EXS9}|*Pf#0{abSz5fNI|Sj@7K9UC-B~XG;rcC1z>eN;WVS zNj+yHS)m8@UUYqcTSh!tbCh`0Zmn6A&Z<7Gf3kpUq@;*&Kcj4x3T#mdsJw=9K$IN_ z!Bw~=rZ)stzLm@-#y5XUxf|q^m%WkvqMZy)m`PeItX|+*_{Fts7u>k5o#&rRBtOZ- zOEi$VCw`g>cOlWOK+lNG#KRL&LEXX|=w^BPTBD-uT#do}@Vh^&06g*xCTiB3OQ)dfQDAAaH3BHI$lduP&HQznNkj61_1zx#@9@? zf~wrWeIJUz6vTIcQ}p{Q0M*UZpmU6wOZ9RDY(v6#y-Ey_xCX3=w`swhvZ*T{u<5HG z*5}h {^%B8(_Y5ch2Y7Gj9Fxujj8LB-m|#M;RGm@mdQU5kFQn8H*snmJnFQ}un0 z{?qlF^*$RTV2uW|!m4^;Is$1rcg^rQ8(#4`8(8srtDF9Sm3N(XCQvtY&`tWJj=Kh$ z5cATt$*6*nMp-IeQN0Rl7>%F-g3{cuWI>hsKcealdUgp?Y1PRN2^+u$zHSQt<%Ee> z-DO_~b=to{j8ywmvLdVkEk-2`j{EU?ClUgNx7Mo)du8EzT*a&1 zP3+H-(mhM*z;Xe(`&`<$$4E%fyJb&|GHlceC|)7qr8VV*i5?KQ$}(LWt+Jc*OXE$= zbLNAq1K>p>2^l+B0k{V7B%aDoTo_gt2{mGHJZ?w=H>`$!$g|^$dyhFVBCQ?Q8}V%j zR$7fv^Jwmdhoybr;epPv{*&J9IOsYf!GBQz>#`LOg#ar)>6BGWK53b$XS_&k*V5}Y zwE97-=s&FU?hiHnX1!l+u~3rvMyya7mAs*S@3O@&|CP;t*YDckmCssX+Zn5AJtc;_ z(*<47t#{ZhfiJ*`#$6>r-qe27swm|^HsHo*Z0EZx~23AwKGoUzg=m#lo`niWnyXF;C;`t-|Q zlydFy4_Wo}i~#Ap%QM`?qo|0(l?npjcRsrTCx zm1IZQsBd#dhBLJcQITmG? zo^_Ovpp;FNZOs<%16g$O4)H!fn?MH2Swif@G2!D$nC9$E9W&DrpJ>zH-7_Cui+A4rRjwP0NqpsE`6EuILr zfC;LJv!z{@H{7q14Au9joDjSsNTN`Ot$VzcPf9$8n6HHHsY1M=c8de78EYO9?|;zw zJ_Q6Q=bWq5hDczDjvGs3jyfcv+|&}$-;YO<8qj!N4f6*JWL99k`^nID1(K$Tmu zG&v@?@N0*J!1a9PO`1IQ3$zGkIsqz4fsKG=NE01TYl9_@^n;ARN)|x6NDM|3SabuB znvkS92-Mx+j|SjiJ#%3#&8=O`k-%euNo%D6O32j=9dlq)E$z2)@+oVddET0*ofb2c z0HM7EZbU!}Sw>_S>Rq8t0ie8nLbJ4!Mon-%BW^KIyM-}`@R>VE$hjyz){8=x(gcZX zLX&ngdX_5Ed&InUSar9A<3IBBnh)F#g=BI5@anVZzv5}caU zL=>|J45Cf*jA-BETDXLA6+ZqA{y)|Lvp`J0J0AxC6dIe3^{hKF8e&geo7S=X9(B%>q(l{xtt~ zH-v*L+Ig(;@d{&45HbL}TpOfnEi|nyG`q^S^`3#}9R?&ke5_k^U+o$P+>2D^rtVkM z4%e!&98jkY%N1Ek72N_;+7g6cLh=IcJgiFsRs>FCO~6f4APx| zE-3H1>UFPrp8XY@^YV9X@{8ZFf|XBMLG?katlVSu?fV6mHtC$2j~yBxN*M?MWU9AW zre>Gbb_nRz9k%kFZ?S`)`EOP<_W=Q!^LhpexuJ6oWGO*HRxM+RMG$vvnci7ZCDua$ zi~$Obp10W2r|ja_&FU}xxRpM0Q1d)C^9@6z=J zB5r@tw*SmO*`8l98+raWEEv4QEnt;($1GjDH;k*pdWA4=US}Bz>gq;;4yvCwN#L~# zcnqGirWtoz%gp-(wkUaXj~#v8H*Ddlk6YE^hjh*}Ryc54<9)$f?*vU6o1SA{2dk(< zpn&)*0cDzOmuuWOH*P_Qk{h@ndFLfvN4#>hgD!!F5((Rov>r6JWXcj&0C_BowyZz4 zfFUfpfGpzthw9)uzjZ`Qg& zVW48S)&T+8WULZ5MZa6D#l+(T5<(6-8U&=;B!`HLf(J?HdmO5c3td(@upk0lMH$zg z-CT)PWVNq(6tW_L!s0sdowkz#YL|2_DF}_nb&p5%p2Z(=wd=Wwo5HHzGVO>p3?Hys zI$caYWNkB!Tg&tlR@J}H`3>b*f+V0v>$-KHcEu+W`YPC^U3tWx}+HaDzk%AW`r z7D`6)%n`s0YZ!`O05bJ#Sg?XLMhuOG)+ljVj349KHshpqdijhKRyXO0c>77KokXpx z&^=t*OqF{IOW*DaBJvw6QiXU4+Zb8?SouWd;{72>F5OI$@wBe<_H_+mEhq<4)sp!l z{^xs0{@@nCN^el^4&#}0`SV?MT_+4@lz!iZr2w8bEz+!u|Jbf(@&s8BAUQs{a z62eG69@#k>ySWZJ8PgyxU{x;k8rK9V7f@iQh{|f_I7I*}8mJIpg%l#S@qv8JQ7z9m zJGYG}MCmus*fBhBKINTj0xDyY-h#$`+4FC(V)+8qLh&GM0TJA26c;3I*&B=!mxJ}H z78ig(fdpx`ch?w$=$LuZx2@A9ki|p*37GHEFbR(ISRifP?MU1ORubx45foiRjVKAP zI`$W^Acm`9t)+Tzck(`Z+!xk02|LW8R8}vl)S}61JgT+0wSQVdk*1}cBgdWEN2n8a z+?u8w7Bkytl|4H>@SN+=Pth$>IcpZ*aqW$3;~V{Zcu(uX{oO)EK<&7D#GgmReqs5ez!icb>UZgGJ}-_NQbCKh{8p!Z z1;%2H8~qrL#Y9i9EkD1;f{NN`mtOBo_dx+(&(M^Xk831!FRpQ*3G)mCk|j7>sA;ud zASZN%#X65U(DFWf0$yGjT*895CNllVij3*~5D$Tcj_U^*F<%J@tTq&Y3=-QdHuXNc z?SXGveB?omyM%?tu%JyKo(v#uJ;SYev!4%v3?nDD2LOx3gG^NdaRFFC$7Ks`K_gLLjfvllBy`p|(cF^iOb={7$VX23aE4K6_e_|WH_|LZO z^Z#tYg2x0}bst@qt+wTu#zlg*Lt{l>O5ICk?M7>80^Hy(1N2L9H|!SZIAS!t4w|Hh z)b6p&?0f9uJAdCAS3M~~ywwT@u{;ZuVU5(gjP;-KIIWUy2~e^>`;I%nBKwSTAY`7= zI2eEh0Hab9xR@-Y&j5X*y2hV?k23>5&3U9 z!m5I$#JdzA*m?i@o&5l3Sgx~OVc}DN7VFMyC2C!un4o-M-KFjtz$&cKv`qJkwS0+# ztFT7WjTBkDA~&JCxv*uUBE^2vsQ{p^GR!-dbjnC zK4M+-?z67>cY6c%!4>yd&w}$-Gq}U8%YY-Y^SlHOy#i4LE0>2nMZCrNqQ(NCSwHz? z7>FJtW=Y^xYaI&XJH-nCvD^>Jsff>5$>9xATolSrRo8ZF8s1~AQ}iJ_`3O=W9P0Fz^IvP2?4BxKn0%xTaF#@4C%K>eny6he2^6atcm63Yk_=x zq#%@63SegS{M8y0eJ`ohIB1(}5Re9WjuC?+K$TB7gRGmaIX7SQHAVjNBY+jrEkM@T zarxlt`#=9g!0HAPxB_6gD^?2t%T_+fa)719=#`tXDtH4|5iv?wa=cey=<@{(MDYx0 zt1#Jt(TmnQ?}D|@IAe{&$E;dfXl3^SOG{%;VU0>lKqMs~Qljj3-2-t;`i%^h)G}#K z`>keZx25}Tv$8f_mq{aZ9_T&;X`#4`qqa4eo&i{BRbj$_NQ|l=i>X`p*0j+<6#xtH z*ERdJ^~^nQ-E+=>$L^>K3J%H%NHrtXpDexHiIKv7r^u37{nk8*oRYV{pMVZ83^V z0TlYy#EUz&nrtZPX8b22#O%%rri<=TxMYZ=p0Hp2ckJ-Erf5%2&{%fnb z@+qVJO>O6Ct4?mQDhVbmg+T`ZOMsNVXN|X6rf!d=1+cPRSM>XN>%Hf5w(aA8X~EPx z+!|Hce_r!I&nCd=c zyeI&8*0PNPw5@xspi{u8`!H9ZI2y%uJ|?eJKyY#;sR&U*%A(0kIB zUHNg__xf*G!8AQ~?l z>#qqu#<~lE6-v%nTvtwc0i+aWbzXs&u;Kd(-R~Chj@{1Vnx>rgvJZ{J7i@6RgEmYe z$mn&e89rs@UBuI&R7gonhrIv`@Ia6uU4@b>9;SPs=9U9g+=*D*rKkjycxk`g<2y40 zhpcMwpcEPHQzcO8;R@QXLOhSmzw}Bg%C51L)^wHx9<9U1frHjObl5tlowR{D7i@UZ zB@Yvzh$xxoSnsfIVg2%KZ}C%N#%R$)Tv`<8NzXybrO<^0?+GzLSe(M`T#Zo(Zi=fz z_f<)awdTrx}5MT*>X0)vwwS?vmz^W`W*J9cEmcn&>GoXqn0#-KwtcY&9 z$ZMCzt#q%XaZ_kW6CMBk>1NcQPZ7X!(r0%~)-IA(61iWssI#~m*L%7%!rU9K5)skiBq6oT86MU1 zY255-=hWfBf`;o-;4|zAC&1gV-4ZPlCIY_khRrt+u0{u1IhW%^1ZV*S0vvIP0$xa4 zCsm$+`UqH2(Yw4WbPW>ZjIbq`-(4M=7d)HSoDopN9Y;2zCpi%G-??97qxVVAzN+2U zz3#2H=IYN2BuL2D9PkW68d_roBg2s~bL)r3468wkj7W_)&yuDfW#cxDr{<#Wp_G1O zLwDKoH~+ECd*7eg;*bA@1rmUEmeQe zlJzGvzi4N2$!5Rd>$dcz-`DvrdTq6G0VZmo5&MLT5TFNn-7X3E@@4@%0*$HtB@jcY znPAFYw(Lj$!dAWfcUCz22}=&#XK~$M$s|4N;0Xaa-E+Nwf!0B)VV6}l@3$&}oH|`I z7}B$BdDd?G(!bhz=WQUUXyf#@a_Rw zvVEz7uls60Yz4gnuv%+@1pRGK|BB5y_sQ@(F=NT?I+wPc=R6*+cz|vP7c4$-%Hy$! zJ@X=<09t_<2U(r_9AIJTD(gP(b0XOx(zPnu_G?UbXnt>ZMT7Uqe8+|DNfm4bQ2E{e z*PL~QP4~}yX6}U`3+vR55Flx8QTK_@KCd({qJVk87C?)p(lnH&YysbiODrP0k}Sc@ zO1G?{0ECsvS(oA)4FX%@aZr$57!uik012!|l#>CF;g(P6za+ej%(iu!gWIjPZ;v$& z9k8b1eO5oTO*~_(wM^S?P1A0-x?##ENXeo_3&+O=oGQcv1*W{NBMsSmq!0}XWDn_? zN%HB?Z@4a-Lx4w!hJ%}`rTR}mM(e6#R!rmA}f$qKqhijR8OP6(=Q+|Cw=3BgrSZ3w2uwVlw3(6IjIe`SuktKdV1;pzHBPT-41wnl4`4V%1r`)#{BI>G|}h~GB{VtL;Kif>TOLr#LKoNxYn6m$Gzzr$og=1&uJe;gnC{zQ*?~RQGIHFeueol^_q@UCryTQaJzPTsk$YVo zTv!McX=)Yin;eV~Uw}3VQwqV802+V_W|9%;5d#8bMcGZxtOddnXvoqiBcS0fOg{(A zcab$t*>6o##Y{!bQxCh9t7Y0zYn^_=sj_#E80s$9vN<>4%3Y0E&r$@M3K$9Sc|~Mt z!C^40m?H6M0;XlH0*9@mV#s11&C;x-ReR7X?gHIM=Br=g&Qy3gD@mxN&>KDn-vkKK_OBP=-#7uyVtx%S=9lnUGfH7 zaQbtWUGlvCBPQvXdA~@6Ar-eZj_KarZuP^uMr>WWO`ulKM)6(hasev6R#Mjy0fduQ zxb{u9@uUCU7QXL0HvRc;I=I4uML>C#=1H}{X^MElHVLT?T}SVUT3zwR69T5^tgz+0 zz|U1%{lP!AsW1GhJ_~G2zDv(=Sod-CIUYt*;$(h99u zHg}l!F$7>U4>Tv@0&1zwQx3AQoDrPvZD|B>qInOnB5p9;;_?Q7Qzcz%kdT8a0mPcn z4TvQ;bW;PgwO$2==yAuf4&qrmB9d+ZS*&AfTVYAZjYga%@p{a`Lb6SX-J=u(aiO^N zwZ3V>UMgNj@(o=DxF-)a5I-o;HNBozMB2A)2NtZk(_4&lSy=0vM8)V<2O&QGl*Zyogc`zP?3ulzCX`fRF6oeDby^QZl@=1ys9I z<0@b&1;LXnr0@}|wRqd>Z03pwt!L&%YZ*Rijf2O$V097U79~2aOneB6>)L6J8x8CQ zXk%JOKA#B%!J^l+Tw@)&Q2FfHh>`(-P*()8Xi0cyySG}pQ@mTBozIK+hhZk8W1uDa zj%S3};?f4mm>Wp)%n8d9al`B=;r-@FnXmW>}Cpq7V&T4RtPvpfUF`T8DKF4jAZZOmcjx?Tb5+I7<1W72`FiH$x$oN{#eBlv?A%;X_e9-DNIN` zEUGw%bV%P13m6`83d=(1I$Tde!Wp-iJAkCDO+rY|>kY@nWvQYfbOA5G4bG;a;09MY$;z8^Lqf?uR_#y!`TsyHQ zYIW_^m>sr?&f{L3GXz(sJRrKfTcD*2t5#SEA8K(oGN)Q(Nus{NU zd4E(A2mBE*Ug6c~Pubu@U$K=R`$t><(Z9Eri=PpQ5m2Dfchv@~=@eiWsLgn+na->6 z4sb;hPu6D9afek22o_c9T@31ZNGdqqW=_zN1hJETNh5O_Lm@eXQ!F<$h1 zJY>cUYae)y^da~`r_(c>1(f5f^^ea4#if6Rgf&sg2YmvnD5 zntnjQj{Cf<>+AfrdJmLA5cu)=AtB7XVg5MCY7eXRR|sGwx=$NzY!bRwlK8xi0}iqP z+JFJ?Q7WE66KGtk#J^ExoB4xftgJ;~OoF~t#9U^MNAZhc7IWw#XB%ZThZfzORhND1 zv4&ycx?OWxpi1YWxNbo3zkqNdu}XSx4z>j9!lK6l39ziLZ>JclbmuzYq)i{a&HHrTT zNCd3$_LXkI@(e=Of6p#ohpb78$a;pMc#yBB98tHAVxjPr?7+UTKA!kWqrhGL@L_jJ zQjZFEtAowTHLgsut^wX|+0&Nq#T0hMf`#`Xt@VKQ-Fc>Xj>a~!Ho|}0VkMzXOc;p* zUR_-ZY_@ZoCwml%-_o)U*?bFhpwYNWeDlvy_BPb>CTQnS9kc zW?mH&ykuPq&sh8X(_Tz8GjPCN8eZ8Jf$xOy7gMFwf*2&4GVvW5X@R&8E5zggO#l;O zF3L#9*YmY)SHJmZ9Q%sFdaqZe&> z)jc+_><;Ugf8Oe*5!ucX20W1(FO&tpWu_y$llDSmeCQvKDQiNckEmQODmX=T?9u8LzDdpancIdLD z1}<8eglMUNtk=F05Td;bZZfa;12t{(!m3?M?z72T-e@xqe8@)6|D-Lw`0|EqdAG8gh`bQi6*gx3j5C6R-w!U3}?y?n3 zIj6AerWZHh6{~*o=WN$E&FZ$l-^zw) z#(b{@(*$%zaMc~wJlbukS^-)QcHeH<#+_D}T<4Y31C4R8@)4WzzCW-TAJJHS{BJFo z@qp&Dz+m%ftM0#K$*Gq;o~umn2@4y_N44%T-E&AF@0e9hy=q;nUvIOIf5Mhs|FW%k z;+wYa#Xqu@Z~V3`e#0Nwsu%vuHof>=TmAI6ZQdPUw@HV8(qmGc|h}SkLKZy5Cph|6$_P=okm<{t8XAr`q2NZ0oEUGMiMh{S$m~^ z&#K%daJ46_)22DYXUcjc2BZMdP>V}V7%M2-(Q;s>00fe#U zyjU_J3hCu;iB4-R(}deWR$M$aq3c8zd_ovfC_#{ZBaA`o!>#S^iO{|gxzY)RiAeBh zT=c}95yzP())OT*y+q3RN-51cH(?v_vW)Hr!kww#076dU{WlUIEZn-+qgJ3G2f`vR z2>*qlCnA?KxpO(VLWc0{`ma{cii@*GAh(7%Hh~JsHHZ>O5zx9BS41?C%zW*TaDm2= z1TPFB?s?L47YXQtjp6`%gmHlgKWs?j=rey{B0yE@G;@qz+aOB=TZP1k18K$;eY>n?>M?7Xb3tH6LT2t1k=_d=|bz@=^u!eK1FD=mhA z21h2KfK4$Kh;yJNs-NREWVFbg8E9eCH;bNRSh^yBg$o5Ol*~8RKmkk$Lc_cjlZ4%)=fI|R78 zXj25hlCbDFqT^}lbIP)Vm#uQr6-y3Y6v#Mf#R9d|Kq_ntU4vAJFBaegV8PId*=b$$ zunph#E}M1YGdAz)S8V1T->^xSziHj)f7Lq9{i+RI`3i?@E9eflXE$)vgO#4_nQw`>d$%k`?w{v-bTT zvGt$-SDW>te{1tz|1AqfGfs9$rb#KQ#AiT2nb_Z8bqIQeL zYqz=uDCpLG&$wi5Z~VGV`PiS^+E4$ZHSc(zr3UZQ`Z{h^nj=+YIS!q-0s*YVz&Qc- z5Y*uIq|tY5@RHRndcwMPyw?U#{4jO*B~apY#!GnMLZsR~Rp-4~f18wpcFkdZF74c^IVXVCvsXZ7zW^a!4h{(%=p74W zQMLhBEOCla9k=nI^RRSG2)x$#JpuX%=5{cobzRo6*RoU3TjSijt!2S|)-eCN4R3mb z4X%0GI+r}8b$891PIKKjy#|?M05a-q;no(2$NfuoEJ+;ntMs0m0Is^Qoe#xO0drX2 zC_-FPy-U1M;~~(D>y5ZZ?w_KbG~f<068s+5C4NvZVBLL6An&?WO@2V1ui4NF-QS95 ztbg(2-V8q@pzRIuY2c1EnC=wSTCcP-suAyUg;Tu8Gne%_A-*KQNjz2~Aq>-wd!I-$ zzp;J;qTsRan$?)OHC*4ZN|FqK8yKa@dqUQ4^w>!+HACn@<5uU51klsEtVa7L#N$dc zE3BNjRq;3CKRwi-o)8ACkGTv{{l>fW_)Y+GKIt8XTX?vDlmHTC6R56E0>XHyAo2Oy zWx8i6^tg+gNyMSH8h}3>XT}&Wh40x7!>dedlT-FW_;M__g30`%t2nd?}DWzs1tqX zjaD$FZHIIYTt6^k+>8J$?rDQ-_Fl=oP6DcCkA&1o0T=;~N%vdOf3H42Xu;^4ESUV5 zz|D0lT=1L~%z0YCM1Z62h``KQ2{(=xgQtlx6~zhSm*7JX($a+n@Ih7pvF((#&VNDx z?3~Vf%|;&js?GiI-`L3e{=zyg{AA7@r}GjJ-YwzSv`$LFD$CSM`_?;R&@Gf7EISYcU`dZfs0;DwPfIkl?>`0dZ+_N)$`L<(sSM@ zMp~kA!d;jdz93+M)lAns@@_l&+h#K#`V|X?@3+!v4_MK30jv?-*RTKx)ZOyFBZU=D_6= z#@tt;JFHPwN>%wb5xo%`MD;o!jjSi>eT+P0!MrCeVC+XY?w1l?w2ccOEdRe&g14r9*KS z5u3l|UDh`9A*<*(ZJE9^RyBCus`Wlonqy&=c8Vr%70(n%5xB~9?6T(JV^)tfRZ1Ne z_qu^SUW%rmO5+ogfUR5WF=B&@u6o=U{Rb(gOpIho$`t|gShnL*NHg8HTiwuptC@7r zvXc(D`;quZ5)7PI2!Ijy2!NuPXsv*8yY@|p50<2tT2j}dxM;18sqP6&Wq8e&;5^{8&TkFQWN7?Ca;BbHyJ^0Nu z(FwYknw@!T${(|wU)g=jc|m^B=O|nEDNCRuscUTo=cKqybw5ITFO^ zzHzK!Iu8NqWeuwYP{era2%Z(VlEzF-QlM)FRa3>xXIiRlGa35KLJ2LrDtya8a?{HRa6`I@0{4!Qz?-2wn%&K+UVIpm~iLy0k3- zk2H5Olt>RJ1}H27i0cuvcW4H$;27cwQj0W}(hBvQCDmdmV(#rz&sryKV@58B8K1Y- zx#z8A?kTI8b;RP6c3Dx^R-;Z4LGK0BlOnJc!66V7v>?=U?*gBd5@f{vl*ZOuZQEhD zRMCROT~Y)$_guDu9)Xii32Xrry0O#yFhQ(R^L`1-JuWP95drwzswTnfaaa;SlpgTH zq?B$TYfu7~_?Mtb*MPj)u!NPz59$8~{l@hhC9LRIDM9J?+p^gR+K)-7Bi?iBEv zbl7S}PFus=vsORrq}7icwWe9ev>pU5`!`ssf1TcelnG)ny^DjCFwLJ>{Vq=+pe+&e zm@4q@=Izk=QH-#NV;!&8oF)S?XI+D^!j*RHv{<*mm;Q6hH|rm&(Q{zQBGIBj&)t5> z$~89|=00lOOP{pfrH@$0+-vUUrY2zh;9kqLZ?U8lCERMonWdWJYb+}uQ&<>-5Oi1HC-j8DOJ151DvbdSL(b1o)rjF@oFiS z6o1CGh*h0+>hQGiGQ$e>4vIFC70@Jz%{1Zz)-6oP!swq%R zabhy}sJ2dhD)>I`Db9t3I3w@|@tNO>Ds}(*Tp>l3BFFiyZ1|0~I0UJeOGey^#=Rc5 zq9u70eINgytVGY4mmG;?oW~mb@ADD9<7~zev0dn4MX~~XXGU`*^+t=F*Yx2AfQx~6_ZU1Ai*#N z5Qwv(b3KiUiGzr?#2C3XMH;p@qy=fSuyuo2|Wp^QZfJ3lw(#q zPhe~G4jW$bxD7~=9_NWZDsLI0$7`^s^yp^+9h0D zC2$8XS%CmX&?3OneZ{hKAGf->k63ofH4k(TDgh|FEurg@kbqW;pp5{Q$AVwTbQ zBa8*&q+Mg>a!a1TI3*6ECe(?pus#vzp>`MAa#@$|6JRY66o@$|^=>kHHyH_>G(8@% zg7h5LdzXeRK~~#)pY|2Vx$r4l{@MS_7QFkcig$k7&I%L-n_jYD@*`H%d#7c4PDu;C z-O2}dTG{Y^OAMa2%AWI9(|$qP^eHQzddP}q;8HKjHcdUfduT;ubQp+&TK1!b#M3jmUpOF04`y9NQ-CJF4JD>m@_*R5Xw zYr)U_lVvXbgoOB=*3v4F)pE%at*5PG+GQ&mI^`ua$l^=ueI*5$!&WmnSFXmGnq9Q| zN%ZX%31n!F(>oKQIXNH#tCClW7jOy$phCf{Vk&6B`7=VvL&XRveG_)qs~#!n$;RX(L#vSiqD`twn%8V3bYCMQwTOC zkVY~=dA)$V2$voTNx48jiGT7KCZ{lQmmh{)j^B(celQx7v2=jB0bq>?V9j!X8W526 zpGh~r(3@$ZWAbUDL4Q>=!8P;gWH`LI4Y={Eot zzFq)UiI^jnA~bLS7Ac}7#ArE%li4W;*rHZGlyjiRS6Z4Yja12Yqs9~_Y`VKAdNvq7 z^dP0lBBlYjD9UcLbn78$I%0-cN@~SW+$XvbY2I2&~BEB=yB_8DO7Axw6!E8NO zL%=!(M=20mE&z)*N_G|L?9u(W8x*aZVu}dMYBAQD-B#MZ&tj8~T6)e|Yg&BO`j*~p zlb2k#-l^xTt?#(i^&Gd_fpeA`I4{s5%^UYolR#AORSWvBNiaTU$&m;2oBnITqIk*^ z3(6Y>FdDZ@P)OM3ge(9H7Y^=GtT6;A6GM|CmZoc;#k=-8q5XS2PA=9X-jQ=Zv}_f~ zlg8d7VMh(D4hi?p?N-vW(_JA|0)$yT4{qZC_szg*friso-FufcOn=-0-Rt5{{FSZz zg@3W#Kl86PeE%22*r_R(z4$2ZDY914)Z?Af!n-x@U3v#Sdf)vAys~<-@46M?#$52Q zt^MF%+SVWY-xkb!ox3#wSjqOI9upLFNAcITn$Bx}9JBbaKyeG!75XtA)$xb5 z4SNWd=$P4mxM zS*6V^0x+L~vc z@onAI^!Wxa2c;#46QnvtV9HX@(K7pm1SV@W| zdpuIj0tY=|$%A>8Y+I%^DBdezQTE_3E1b8I0SKQg)%YY> zS13CU;s9CV`P84Po1%M?@+;-edlkB?iE9A*XtXRIt8vAGMFI_qAwks0gHU!zpl6Yv z;`7K2fhoKlh3OE?c-*f315~*@(02zn+AsPZ9t&8QShhhE$=n+W8U6jKFf&sCcEpL# z(eEy2Cz8uQAQch*^25-C&-8;4i#_=h9#y;1`p}l8EMf}P;L;DZ4tBWU3AU57hbZq zIp?i@`Z52XRCKSyMfOfo*T{zD9Vj`FqU-J;xC= z>H^KsOl=aQK*ZNmI zX^qPsvxenQTF-_Tt$*t~t#;)LRxq7Z{i{|w^)4%$bVY)KShyXQ>OCsve7l1@>X?P` zXSyE=xB{#Q2)k+mZn1FSHr*v*vD=CSkV;zjyLAWP7t$UH^Br#CLTKZ5A`sW>n@LC) z_3n2I1r`_r!4o>3HZ<-^Y&u}c?u%B@eTRheomRE;eYX5(|Cdew?BChyAN^Yk*1W-j zF0$}WYg}mGLWS!MVUf~Cy#ud9#8&sL`*UE~Ai&cma5?k3ZT{px*n)Ter3KR-7T~-` zVCgP_z=LkV!m1W%uF~tTwDE`l?GXtm2~@pD5(dazBe=V$_oP6Ou0MF*R=?x-z05)| z`jFm-z*VcR(=M>laYCSIzXR8@TD^CT8)LwGO$r#5*6kIT)x9-ozg17${7-(@IzIe| z{;Y-T->Bm+ShnrFrS*SVulA`G@Mt=uIel1k(1W9?EKenV;)Q|+%|n2KgnDF^@)8{Y zF93ju=H6bzOkfIN6;TAR09PTv3YC#CxEdnxTK7*de0+s951qFv3Y+$59HvtH>!{Uk zdz1BVe2euhc%AhN6c3F)X03}Kw7P|NTW0ooOAH?o$l2+00IM7K?Xh^(0zI|dKi{?f zv3yY?LHCW74G`$hk7xfh%~>1I&#vRB|#iU5E$w9aZSu|_G`fMq?())T)V0f+U= zTK3jkwTwTOH~50CnbdJQr`7RzUz;bBr(v&%~<{7^)NK5P9Yuz|KLIwgOjCwjLl0 zrH>91lw@!(Mx=~O3CBtjhJ;9t@SB4c$qs=gtVjG8c{Fado!BZhPB$AIZcUu?*4uF) z7jDOXpGYRZ3Yri!y&9STQ@kqregG>Rg#SFc0jx|w6CIOJ6Ak*Sq6x0~YA7E}MKM-T zj$O+Yt8q3b(E$ix4Vg+Bi_scmEGCMj$+yj1&_EV5Ie3fDEe_;Hqir zDeIhlQ9|XK4J^FVI%i(6)@f&~rvI?JQ=%^Q#9gF_F(RN?0EYTK#JvDOaLHi(qR8kC z0rmnW06l8{urExtAim5BlVZwfuFbkX071(}i#Kew%9`yKi|e=q0t;)4gkk4VE0}SY zRV{m+=viyp^j2H{;8$(-iBDQENuZL=e#7a za!vE|v}JLfQJaY@yUxQ_)P2TEd+)Y*|C5&Nf1?#l(Q(V3vBO_6oA=J|=<}N_nEtrM zr##^CXH*FOI3a;UjG2UVJHmdu$2|o)e?XOV0ga_Ee#>_LqFJ!> z?G_9_Xk~r(T0uWntn*gfaZKa4Um$y@)@S%G0Yhnl$wbQ$&583m*9AS({Wkvte_}I! z>c82lZe|nEHFdwHjwx(DZiOvJMOeoUgb4}FJKar)n=ho$)yJF; z-G2Hl2XsrDH#ootIFAuvn*W)Pkmh$jVd?d{Q_Y&w0xj)*=d7kp?_2 zu|03G%Jt7#X4XSiJ#d$$NKU9D-b=uln7o+Q4pvzK90y5c471)@CxCV0`I-bEsJ$i- zj+@T2bxDNL+QUi|WU%l`!Jx1$-&wx`1VN+D-LS-BgE|-W?5NJJHA}2u-QZd46R()O z=usP5B*jDPv}gWRYaKb~F_=8BTZ${hzfj}=Hh>?jK$IXLsJteu^qy^7XVopM1$tLl zg7_lwNau&u%iQA5IJ#0)Eux4k754iz4v-Xr)bx9;YR3ImJL>^!p7)5g0YVo%Dqbca zI`ckjn){H|&3@3bBllbRq`Ra@2)s6&(*0@9r3FC6zdZhv!k|e3rnEp$(_%}~Z&Cc0 zBoEqgRSL)xe_ASjgG-;{u3py*MO3^!tZXk{LLxy_1|hZ33rqvB;Qg*-OBs*69j<_X zA7JzSwiAJ>dh3i5OQFvR`*5CotqsGQ+|%3ZcOfCcy> z{Nz6!V7&qn-b51}lTQ<((pN(hTr;000#*5RGa$MdVC93X$T}76=l|7?-blIQBLZNB z7A}Grmr9daVKfiUv~IGxp4&YJiYCGUtq^2|Kr3oxkZKb+sG$DqX?)aD()IvsFeGBMh-HdT+HJM-FIwADz|tG6e%70X{^H(*sv5J$R>6vj3V@4&P~&0td<7;~xKlC4j<{0JK7B-{s8$WVj@I zPYMKKoe?POJu6Tnp*`bXOAg*;jkBN7{Yt=$K4IH`>R)W}Z<($C1G6RX`gdr{5W(0rU1u%R zd)Z3$yusvqZ19P%*_vN7Tds4h{PI6pu<9YrlVcL-Cylyf@yTa3_s?2c*ExL`=mOMs z9Tgn_%s?~04r8qJPQ2Akp4E`l`LHT|XpQs|3{9FV+J@EB*Np)zh~9Tl1y$S`kI4N? z98;&}tma6|bP4@3&BvGkj-GASxsTgDUo-1}=nEFiy~n7IUp{@CGS)19)-2#8BCfJHG0kGhsg}shv}AUUrK;vzQhbltQNRgJ<^8^E#2@-k zTJMGzY|)v|*ut})wUGlKx6I7PEIIWd0l~YScR^(W<50D#S&-3P3D%lpM61JIK9B)QVi1#w_8%< zL!)sNOYW(t1xsdB4uhm1n#`~DQZ*D+22c{mNLK{_BS}uU_zuk)1_j}SrGBuAPAoPR&{%UDL(DZ634@>-e==%b!=t2LpXre*Or-_cq zr-_bvRdn-&xrrv4bT?2AG`Ti$lZ7e*QW3bykJrloZ$gSJS~UwLtmlcaWD%6OSl3-5 z!M<7oVY>@>s=Sjm!hd9y0LFY@QM>`m6-7r!t$BEtH4aL1tyo||0qB2`7XEZA$#e>6 zbqGAnwU$|DZSHM9Vv7&_l+D}oB{9nm{$@lpVg;GLxZjhjh)$mg>4}-LvlZ+Fo8)OTx{q2dzh~xaSUw4?Stg z$$I8FZ?T4Zf7b5!3$yMgf89!M|FFR4qaK4rJQL+Ryoa5~kR8@|o-kVMl-2Kdfm}cg zp98G@0>}HTbojjH-(hP$_X#^K@K^ujFIgY~8k_c{#il$gfOUt)>#QYOk8AuS5NmZ$ zdXMFu2dtv;fYtY25OBX_6_c(DOx|J1eebmuzx=;#-fx<1_+tUKdp>4?j!QNjbxU7q zKcyNjdgf<&?|A{2Gh_0_#h$ib^r^Y+Ec80uW<#{|ZYQRhK{9AeW1%o7`|dibK&s=#LH8tXgxVY~Kavzp5vw_u5Y;mEyK zx!`pI;P(mK3Ea1dYIIzN^`bRYC(x90!zX&eK8O?~rNTNH#{AAa^mUa%5ff$CYwjG@ z`q-&^JZzl{@3To8UuPYwAF`I!4_NQ^C#`YCT>>Vjq{L|5hvfsmASA-M-fn znvcZnjrUOmjM67jfV4?-+Ff@dEMU3Bm7toChxxjPnU<)TW!ah$tFD`4l{Erb;;o75 z`BFTW2#5>h;L`KhE&)X;APtKjvuS(YXS0ud!lv*4kX6pUUx5CK6-Wu<-3ATBoE^|O z9?}>c)3tYrw0^7h>Rtrmv$)O03$?ZaDH5~xeA!l?{AJOnZD`GPy%+JbY?qbR4OvyI zz*T0c#nYR#-EE25eI8d>)~>PZ5KnHMCPha)!%N?gZM)uMV^My+EQjVuwo?iQ*7WQ$ zE38`LJRVtqOc(=L6UjAEVdZoy$V_v(`M>D*2x#4kCX$Iake`q9e{U+RoT}?hapLp% ze>dLOtEGuB!G9!C{)oC)ltQBZB)>)D9jl*f!Ob`Pe;iFTY4T`7P?bmc!6O% z(f3>3qIX-vvNu@svPZ3L$^F(gdbhRBxo)kqC48qG6fila-!EC$a{W$4X8m3@{hC!y zzARxcCRHz>krZ>S(EaHC2_7wL42gOvXmH+>t8S@;%J_GW3)9w{!V0|5i9hUePl<_@ z{u@k*qIU=`1Q>l93261YTJCBL-7%2&UITQIg;*)3OKF7|?g$By8TZ=AjacWChK7j=Dvb66i~&#ZW78O-MT>9lb@2 znKXF`<>JmW0#E1k`Jk2E_M%<*>3^}#{qGX9)&FAti8k`^w|OzxfR;X$+im9c&)X#d;o>tN5Wu=>!TiUpV)#)3 z;0G-`@VLO!-A2rw*OFr{6St&m0ki;hz7;=!sOV2q=aj}8kl^!AK#5KSC@tx}W47|> zdu`*zPg(sU&6Rr1;~M?v{To>a`VK(T`=VGd>xdXqV)eY)v;Y=$xGLIr=z6TxjaqwJ z&t8X5Yuz)0rBI0q>X+!Am%1yiEIZv2RZ}flHNz?@XINQUR5{bj)}UNcqY4WhRzHI4 zy?CeqVbFeDbM35kta!wl7u{{ObFWy{tczBQb$i~O*1Yh#wJdqST30@59c!Pqj*ZV- z+vXRod83qqO>eWN&F{3fEg!b@ocCDS@C#ZmSFN;fuK>1qRO?hLZy2^z!(6KsV9HcW z3CQfUc=aBy`&ZE|-qSASvUbR*tw$>&5^*5B2*kw_2MWll>bl)|H8EhW;EBf|10VpF zTT*g@J(6jBjx02QEGYjsK1aV#B=hoVBAGWvI!{QP|JIZbvhu-I_}@+P__aoQ{{N!^ z*7zitm?oM``6fV8_`~kt<38zVKaR@v_=r_+0qNyuxx)hqDG|!LVqK$8dPxPhMA1C8 zNzAW7pNT`N%2|vmH-=O#rb=KbZFee(A(*H8nq|qRnU-#wD`6u|vw5XROt)!;l?X&p z!JPn6FZH1B-)~DCK*84*U88|4qA(6FR*xT zD)of|vZU&6v((JHbWRC933du`7A$zsPJZUU*~o)GrE$~sdL*oePfK_o4UZvv4i{KU zSf!qON1Mm`hgAm)9RiLf*I1zl{KZvN(6V1Z=A@OhUl1_5L*VvqOAg#;@xD8)v_qh& zP1m6=mYBZxscYUW(0xQgT7aWN0HODS6%SsqqM<8ZslA~4nk9zsx6G_31UN2Ou>OrU z_d|bfvw!A)*wWuOt9|#cdF`q4SrXc~5PJkl+RwO)va1L__+Fj+ z0qffENe5VqUj92f{D)?Vi(jzVwhwE3?$lT42#$mt4`Ir?p9u;`rt+f&Y zO)B+c=}Y&Wup+=baabFlwd3D5Tlo2Zv|#ZwmRRt-p6dZC7oe!^zefP;oRtXh1`WHt z?h{D?F@d(E02~$lvD(G7Uohovt9krqY}Fr_%@VEsJ+s1%PwJiSw&LF7R@y_`o-+=x zVghGnJ$mL&{U-25)%nce2}^Y!G}^oHEVu-*PEZ>x-bBkQfsAH>6nze@SOV?>ln%1= zj>53lKM==3-p) zk6LNo(b*0=55x^ID)4$T|pzQBDEfU{E|kffTdloBaY z-s`f3V#9jAhHV~eh_yDXTu<#U&GiPYUlgty0jyl6A7u?FkV%IMT9U-;=2@(Eu9b^d zmsg9&c*uqLK$VoVYLqv!ipkVu{tI9==E&pD#Pg!W8u%9qO{2y`V;;2avdqXuo3#A} zTYCPJw)B#oZP&Z4Knht?@D7p`>nST%CH0uV+2Z0gseWLyH_qi2C z=erf%ykB(wvf9~B`RBS7IZ)L&MCSuwm1IXWC;vYSmKCI@JKf4Gdh>s;pqy3eRx}a7 zimY1ztROW#BxznD&C&~+Et;zrH_x}x=W&{o+h@L|+r@|lu%hwSiB6EPOpd1ZH_foqsWRfrzg2oeKWX&6_V9FtDSoN@VZg}2$H@wqh zvC3#ln-$|BeoMg5JJUm?YI_zAU{6en`cd9)hR(R82@d zPt76+RbIf9BA}T6v$*91Y8*sOOr-*0l%R+z(-+|u6;pNam5Xa2W6?7k1%`-u0I;}K z2!@(kYlEBKY~5>Lw8~jxn52AD$WZ$d<3R=-)+_HWpG!0#)-6sJr+^fUFAylE_ZjhX z6eLXP_eAYBF?2C?Is1&e2+O+e@Rl<4?JMaxt^W?Z z0$^o(PFQ8vIisgtTmY+N@RAizk~Thcx9GZ6&wbira~{{dowv+|mue(+1P}z|1ayMlN33Ltzz^AE1&#`r3UY}hQWI++j-HgVL^+= zUc#2xq4I|PmJkrA=(!+(C1BYnP&`R=_(yEnFaL|p{Ufu@-!pLePn{yF%9ru_qtUAdq8ZhtF`=ig_Iv1es4y>0Tu3O>Y$}Lx#qfs+uPpZIz z)eyE$aiu`OgIFl6R}si6r(!#nG7<=S4qLH67OvIOru{lbbBX7hb;+hY_e*yC*Y&>k zy(3hX*1ylns_(I`{>QzqXsm0m6}N@%XwM4N^_XWQRd}&jQCPhkkcDeJM*@H-M-1pb1g_*jMJ;oupYvg4h$;_^?}{1czD?rm?=T-Lg6*I1K*S*!giQIXWO ziFxhR7>Xw+q_CotQA@D6T8dKJeyxv_Uh^;2eR~KVDfuA&!FWJ%DNa>A0-jhs>orG2 zo>3@p8Ya0d%Wt<)7{37Ik@}Kux2-UHxP& zZsMWPEQyu5Y}t_)t#|E@+N3QXvBt$ui9w24)7y)BFfcb_BC4fvOCXd8aFj?3#N1y< z?2t4%Dw{)vmD1d+He0M_i}%q=3k;^j>?*_n%LNu;f?*K8fRPB0L|KUlEP2)ATTz1; zr=E*3r6O@zg8)#Yn2+ughU{*{k`XI!7Xy_r@YHUERZPsRev^%Cd&Z`1ebF*A?$k4h zK~`!XF?!O_2|jg~BqU}AqlN&9xHrlLY_J0Q`>7w*`NjMM<^VyIRwxBjH6NAWJ8OXi zZ!maHblQ%8_|NRv2mV;s!BQqb*L66wK49@`6u5#(yFi5`2ndR9laOm8J|#@kM+j74 zB@@8Ff`tVl3Ua3bFd!i{aEE1w@9}u7l8!S1RJxAW4AOhi^U-RDIzSnLyG-{f?|~R^ zKjm>^Mg2NPg1B_}UQ5n-!h)&ycsYeB@A@5EBVe`Wn`ZMr_xBd8c*+WAJ#953Z?N=a zeeSr|O1tm1>Zy-fX5hN+^|%0p07v6-OSX}DdcUQI-(V$^UbLn)pSNJ`$8FcQ%ytV5 z#g2d4%2x|u^*^lpz3M;#7ZinQsYh1Ww9g80>$HjLcWd0G?N{SI#DcX`iiWiPmLn2& z5_n4=wN2m9eSTe_V#8alXx_69u+jtfTb%$W0IQ@Oix;lj9ahjF;L<=ZzQY~_PfS(3 z=c;+jp(T&n?2rAiE&Ls`Rexf(@Uwqz!6E^#e!W+Lm;wO`tXAa|Mx}_V05t%M);Tm^ zPIMgfL{&RonDqe`#C3@INfLU7%pvL)JLyIcx8J%o|wK zo`zai?#89CEOqHL_LL~0AT7eaLSP(Zcp&+W1qd><|oRL_{!YW*16i?mg*CGxHS1Lf1!lmBmy-7-8 z13gN`BU~8+UD;Lk8Tn%k_Dn(hX>;9`YxbdB~^6byq;xk{f_H`fC8kd4r zr|}m5^B7J5Q(U~MO5jSok+M2`#@b%oxJYYOJVR7J`8G>+X?_E;Dru?=$Xe}V0Dz^_ z019-hZl!3s?su7pYUxW{ezQ ziH^ztE&um?ivEk9GXg)~i-NRdpC|&N`GEA5VDOcMb&matE2ruG3S?#VJw3%r^}V82 z^E*1xYnN^uuvbgbB#I~kPZ5CnUjI4ez|yTK-zAt2v?8!YtqiL2vah=d@vFO=Fa%fx zxkuVc)Yc%}Um#5Tqn$-sFmVL%L3)*-A?5WfKw$H3GC z1e4*pDjF6##Typ;Zw}N%xC+ap0b^N9^;2|H!lQK5s;8f{bthl4#RuMM#k47@5d+Oi zYnSjMn+odz+N9T^sR_xMGUpS(3Mpri6Qkx{3Yx`KC2$JbcUX}GT}8)fUGs{ir(L&T z@*NgTzhuWg^<6vl@?QyP2_*C!5g<8a6@ACU7@!UbMF}@72^6J_cZ=b7>0A;z^fbdg z7?!e-AZis;?w}XlP6=lTJMEwDIpB4(5)$qev~B4>XPMzE?pDLH@v(;v2tUo~6&)qk_K|HW+bn}1V4<|!+k z@{m_bFB5PHS}yAOFI!^ZZavdQfz%@s5&{}c$Gt>AruVwV2OhVA{%5UX{)a5s_@lPv z*UaX9QG$Q-yDgaaCMz9!TtMhPs~$S<@jg|0Zi=5$>#B5sdlIl|JD|0&)spp_^?U*b z9s8_O04vcdaMgOsi=NID09-8~7;JgF?*Abx?7z?Aop)KL`J$zp1$e3cP9e?4+XQH~ zX{}Jub+68M#ELouG^v|KO8%s))_l+BY{@VGFPrq0zqe)I_!kQfzR4)35tbi06822& zIP8RVtwi9EG8e_oH2oFeY1J6x;uA3T-h$20I(?=loP?;}Ls+gs08IZ!)+;9g9JjOx z2vACaEv_!^*#S8&Wl>qvZZADS83ei_M6R$Bfo^xxPdQ~fe&X+KIYm>aUbpo0*XzC9 z<8!o(_C0{HdaaLI?OUts=vr8oa03zxMD_TP!d5+D<7t4Q08PD=y~bslzbG*}J}F?5 zl|t5W*`{uOpDjQ36X7~2Tww*8Z>h=p&#m4fVv4jri9Nz{Gj8D{7D?+r=Q<6+RoDO? zOLy3=3u~5u2{Bq&(8UX>LxnpZK1wT=((D`wKJmNC*<-|S-mXRalZ8!EN@=B(#mvf( zvM5k`H&SMBg;Iyk6Ey&jaV+y#nDwsvu3Dew@TBcOVUxCf!kU-7U`5n}BhD+mHU!3* z<>LRe#}U5}pP+47p|=?u*7=46zL#5N?-tKi25@^ZQuw6CfLOgT&qOYHDN?qbkSTzl zJZs9Ur3f_LioREP%oqV^Zn2H-FaLL!y%T^l|3633{pJ5YcF(!*{1>Dolb|$KxpANs z?eqO;VodRa6CevfR+O3Q;0mDi{{gH#iY5#+5s>nUk)wR%9=R4H0Cg)Gcm3rk=Q4~a zEGRl2n-#kMa0|}Y{`Tr{=xX3`?MhZogqjG_X1wK{)|&hN$a*mtV#by&|cSxOUWJT%uJS{w``V7M-TTmd1iF3!d_V7}f*zrcLg16J04)qx@| zBl-nmWgxyR&~NT?rKg>qznZy=YqVvrr5X=gx=r`n%01slv`hb3t!J7 z!XNSph0^0dwN68eI_+h`cu5CPxD3UsOCj;~GVybW&r!ik;%sp3ARrNp5JIx7dPMw% z%y03qgm_n6LY$b`_B8^e8hfrw5z^-ERz7mgy4JpELz~`bt&87g6$20Hf6X7BAD1DP zy6R~f)9KESz1)Jvw%CiLO7U%5Ed>e7w0Mb>x+w91VxtbYAmX&hyiUWQL&gH2#w*BDyh<;l1VDt+1nNdw{fir2u zXpFd)$lMCb#DpnfP_xwrhu&iiv+j~+p=Y9^vj7b48XBuo+z*X0DFH__Z5qOs zRju+Z8BfGPkom>F9)#~2w$33iMzCyY*8y)86Lg5$B%A?Qlkc+8`@UrRKP*r(UBDu> z%Bq$MycS3RQ0P+kg}bY;Qi7}sVJ47Axe1a21Q1;S;Xcx{0004DWJ3Z75Q0UuTXZk_ zPAemkTQ&e*2wDU&!McDm30#jiabZo2i#`Le8g=gi&J;#X*WG5ZI)MRF)!QW?de2!f zbjgBwciZ%r|I`+K!))-U{>mo5_jmQXKugUL^B`%0ff1_2jkRdozTFBsB=FleTcUHD zCEK=m<{5EA0a$`5?dcKo4P!+U+X6$EKBsHlZ9(Uq8pjJ( zmOgAr8U$0Kfu4a)VF6cMcwWi8LBPmCmVh7tt5LwC{hUpG^KV%D%YS5j-}+bU`l&zn zX4gT}Np}U(_YSL32yO|S9tT*SBtpF{0a&lc1n{8>I<1@-f2xu@k*E;1%89_0*MZVp z;Jruh%|TYK78}6YElxE8paSR~GlY^*zgFkdRsg0bO+v;FtERAKxvn?=A=~oqKepcc ze%?zr1g+G8JEQldEx=Oa?%e>~6175Wd#z}-lh5-i@dM3EC(0*Ok=>ii`o$V0;1O%v z=vKKv#}qRk3g=mR_>8SQ`C)5WtZ~a|tg?Ea+1tXoShq~`p6~#`6fVP%NZO&D6-hfJ zu>i8dc&do7GV8iEOC5|*RN48YlvKA?iPx2gM-vZID!v&7E<4}J)i1&VQCdAk%F{H> z{plL3X#!@Gbq?{Y^q>W?E?rmuH_g|YAvRRtCJE0L(5Vx!ti=kaajDk04Loc;D?e`2 zwtUW7N8f5CQc#LJ1vHxljB5L|Pp|G#LYdlF=}nfX)qhFAY3S}OY7p;fUuW6wt!}jo zVp7mOaVN|k53|X~!4;G*vnHaO??*vW15FlPj`AlD zlQ7>zIuS*#zgv;J{ccHf1eP?x0DA&YevHQsV2ueu1VAHl7ly7y_LDYIqe&|*i)Qh$S`+}I}gA(x9v^{O5SThKGFV{H5ha4EC+U8rbWueh&-9b=wXlWuQ3T?KaL5xV( z3IwE_8pQOPbdN2|TuTc9%}NJCxZh&6Az`v7K8%K>kOL@v|6Wv>6d09;N9X&}EX7t= zIk+mpvQx9kk{!DLvK2OG%Ny;;{Xb{fDbk`#1!QRJLJB#ctagFB7Kv|2)UUQovjCO^ zUU`)OR(7=qw0nbXGMfab5GcfF(IvmMbE_2)nA@!B~( zwO=r+*en1sqHFg`a~CLRnJti!SZTGL`>m>Jmt~uGSxwt+tM1t8?R-*g+br8l5k?7B zVsZrfXsc4*y2A)W24G>us%YJ1^dcp?5*Ic9~uM?GVVk^&ils;r)onpoL^3s%r`#fqmtVZn@Ntn==# z*v8*7D}U}w7A$&$6;6G<-p{j^>b%RU2hLhe|3Pc%-Dh>Z2fW#H(G&oy#bu)2Cf#Sj><6vvxnHu~e`Pl9jlW~T+^4L3@!RP{-Xxz5on z0N1_8Ek*=Y<7y?o39Fx1-0wJHg`MXtLpz`5^VV|pvo`DJ|A#ew>wnn@8I(sqruB8e z0amfR&D+K0xnG&cY67?XsdVO0GQzF76Il~?qi#d z7ibo_wNd{A0*T-9)=iqmq>*ldOIHP%>v$ZA^j zPRqAh#l|<;?2rD5RXzGeD_HcTzZ2RQu_h|WiflU|upVah6;&3?;ze% z1TP6|{Rwcm!X$p6?_umCp$Nnx5$rAH#(&fGI99yE1Ka7xnwe##0wGwg$mRlEc>uDA zb|y6C4aB<(sz@HfqBKwE5)Y^o@DVRS0mY5Tc`DnMd*}giT|t_pB)0HaEOA(|7U>xU zs@tzvQQwo6nf{V>E`8Z1Z+zKCZhOC#^`jW*+3S0?U#HH~Cw?UXTruBbndJg+oJ;2w z(W)$|wV3YIyK4||OiDh$MNtpqc5^N`x5iCOfEd6`KIn;n4*x~QgIm$f zaxov6g$4&e(wtjTkOX9LeeQ$%(YWHZ(3p=^mFL~$EK?D9asZSw3P3j-Mke|_I(F=M zQU3oEQDljV@Wd-XRzC2WfUsNvs3OZJz^X7gJPxq+d_p*nuwS@5QCqaMEMgdnp}~&6n9;LfDzWB8@4$DG~H~$iU?~J1V}3( z?Nk%ZK^6;5laQvJXe>16boU@6#t`m@sZ{sG1gRDy^WIl;#Nf0D1;Qe~G}f!KI$VyL zZ~|IPVweY-U9p}6%@6H5Xg=i{etP;dHn{quw&1qU+w6^>uz}GxdyS-Y+dfOQO3P=_ zYoP~8Q9{SMbqh^ajD`Y$_0r}5cw$tZN-gkL(kw92B<&Jy&ocyx`&zDN+MtEC&dREm z>7Et|V2M$RxnhATq-SBSmY0J|f9`QA)p@a8(Sxx#A?7HCSDxiO0z|bTu%c4D2dUQW zvgP|;vKbo%a8eRNsqG#J?rH2v?N35L^J2@iuJ8`|F=~m$My)Kd+|tB5WwBnZ_fGj_ zG!+X}6*Nk77MLw=S!q-n$NEtwU=ptJyv#~v~1fkOX{7Mw;i!k zfiRjU7xo;m!nPd_$Vpzn?M`_F0`V3&>C^ zM8{?X+~^%y)Gi_4ak~|0eiXNbb*zZdtL)fo$=V$jE7@e3^d5mR&BK-hR&nuzc1A#P z$|JvE>2+_^xZWXf`+(KXc)$wC#BADUWqn6A&vc*FBpa;Odl)Z>N`eF#x$*YBnoqZD z4r)FMz*BC8*v=9uRc`UA7C#cmD#emhFKRn(bM}4QmY@1Ly(_&3FG4H8hT_tQ@)ZWM zhy7ED8`T=CU*qk;5)B)?89Oz^ynRf4*qj}uh*-#2&8WKtW8#tJRWqE3gTdVg?}J}@ zSOq{!ywPJ=1wu-RNlgok2?&%41e8}V)HPRmzHP_3NS74&-fzv>lT0niLL% z$hR7FfK^d)np3e}1ZLziy&SY1wjnCjASOVjTuWe1`-Bu~0HK*yp9PLQ)<`cZsLm~5 z7IKcpz?LT07*NV1j|bqzW^zCd(j;;7w*CX~Ij|es>VJ@XZtE{v$1pLNEFMq5wL#bd zRsOrqRYpxGr}?hs6`_sc*RK#!mVugASzJ*&EZKR)Y6i|*!_+%$(e3ZF(QWUv*&E(w zLrY(6&2EMM$DyH0I{q|@1GJi`pat## zR~4xxmPjtMRC1*yGpj67B}OX-UxF)*Oeuh3<3cNFTV@rV>m7tOH15`ONO)9BKzBC3Ofc0Uca|2r?`d zja&6DBz&qV(Ll!5E*G-I;$S(zvOz&c{`2^)n$7wya3!G{?i0G1*w2He$7mdA6^Xp= zS$37D-4|4@_p$<1DbGy4(}HRDTCnC>oAvW%lYiZ8)-Rh)d+rB zz%5y!yWebQ|H5q7&+7b}-)lw7-eJM;6IMC(X@O#0UrI&Az-7&?qY~B!9MA<6%@kk` z`UMvIk9fPF+SV&pJNZ!yWHCC@?pC#!6cSM7jma1_i2y z&RA9ZacitSVy#W5Ezx$y3aH#a>5P|mpqv5)L&LHSdIns}0(r3(YNze@%tNeV<#DZ4de8?&VKCwc_>h@cj z0DfY`H2;fdpSPw{Z@1$DSskzcMJt{4q^@_b#iu+iVEwefqsFLLKubW`fo|1Gty!$g z685#rz05~pJD^Fxu3?Y6K#4H}1QvUiq<|6%nZQzjs}Gl=<|Hmn3eFC%d)~HP`)O}* z?zPLvqV164(W?EL7U_IavasO0i(X*5c6$i^bq)u4QryTa#C;ssIcb0&TEYPU;^$Sv z;wh5^vZlDKA?TR2d4wt!eL@>z4FX}=A*-w#w#u5xR#wq#1ttAfl+ZratPSyuw0K+?sFyNgF))^ETz+PutX8KWc6B@3qD$Cyi?K4#X%+L%&lRPkZSFDazI2 z&(*}94vVKl;(;!2;PIiS0}w=VQ`Eg9Ol(@>UJNYz;j_U@Ltcf2pHK?#hLI77A&f-e zl4HH>j(9SqYfwD69Zi9Y;Kujs>it@N<3ls_6Q7N*t6)ZbjdbU2YV}fxAea zMVam6_by?0cC>N6<9;juv#fLB0;$t7NOLwwTTlW*jLtKk>UACJ{k=x-s>(N7d)K;g3??I8~Cg3#kpq}xx#UB18oAxVagWoV4`Qrb!u8Th*fq2e>o`aU2N;v`vMl2Iew^>2Y zA&Uucm9*)%MtyJ7Gc<43`;g$R+2(=haSBgP)4A6^XQMyyFShe*0xCP+W5J5odpU^0 zuG0dS`zPV0Q`zu4kG6v+I}zuCHfGAn=fV*>F9EH&w>z<~f(_kK$VU}c++ zSbNP;YpXvgfF*F%r}3I3;3tp;2=yl3dY5GA;mT%C;^L*{O@)+#So={cYddDNJt}EG z=7IDMxY`7q^sc;oL!Fcm0e|AOuq0vqA{LCEfW=J$w2eo!?@?`!S*-1(pR-UPILPXK z=$c*+ZfKu%Jo7m_t#KN-@>2ql&suu&zrT* z=^)U&$0(seu~vFIdbVWC7Hy>%(E3OFh1J-Z^E!q)d6jEDYqoCAbz6V^tCm=#caL(S zd0sF`Ifsqm8k3-;;c<{&Cc!CXNb@`%ISlQy*f^VYNH z3)Zmdla^ZcBUU=+dCiaeb&rgV#=UN>_@~a78kMpef|}5Rqw`6@^>qF$*UF=uY{{1? zk<#rl0(Yl_h{a9-t1*C8wM_SmLMjjnSQ7ung$a2*K!B7$7S^wb$gGC=jCITlGds`< z0TAS%2icSZNnZL!TL)PJP!76uf9w}g1hgW67y+#aVDWqYanZH>dLjo(RoYk2;-HEa zWdcn!?T+hRBBzj7#H|6Yic<5(w;~TC(KFph3v)#5THf^}uc0uOIdq|p8y+U6qO`!| zO;nf?Sc8Ng$|avl)03R2?O0wZtdSaWu$3UW>y?1%)lxoSdbPyynru)?6Yk%$3EQtPZ~?%g(J;~T`NPl|Et|Fl3}CM+;W?Hd|m zmy5Ziq!|LL$^@jSkW5gm6O5>Csgt`r#EkhZEDR|@)3U+q^pw`Dw@d>Kr?GwzhoSA( zr)|rJ{>au-#(-K$HT!iB`*of}mhBM0pl~7m)ifr!L<*=0D4?&buT~bN{zf#zWSmd#bIcnYr$%NB1pA5GvqPvR}FPX*f{enQQ-p!P!t$653D;*Sw08Dou zG%C1b&1JoKk>YxkDa}6tLjZ6HuEMrRG=lcHHqGT&iq?OU@-b6wZd{d!DiR`;*9 zlbZdMExYg)8{YXL?L*-EdMg{)C4jR|=N8ZKk_PZt2}toO$~OS6$xJ2o3(GQYelPE! zIbW)|kE^|eL>B>xiYD<5Eb8!M@xCA_zLS)alF++AQ7%RJOGjEjzUyu;@aEFuxa1~j^E5vtK__%mk7c45(fF%iIlxzuM zydtlp$SV?&_;W4*9Pk0bmrDU44zk3roI)#>$DLJ&AO`RfW_RbTL;5YU>O_Dew2DR6 z9x1k1e6%mu!Ic-qO7R;Y50HpEFCxBsO)>ok5M)30kKBMz0TojWO%P3m~y#|927-k z4qzhIZmfKVK$W|hYvw!U%WL+#0ch#?vW)P802KfWa0RdmEm)I63l?shAC3lpNQ%yb zsqNKoaS0aUB8-Udc@*v&?Jr7dVn?L!WmT(wU^7N6=G_0jf9|*&EpX!$0wXL>p_?)SOgHa05dp#?;(PwN09QBe$CiBr9CMQj zu;r9n6s~R5NZXJWSRf6opkAPhQV)P3ta3aXTb{d8OeR=ph4BMc)%KXRPJWkl&iRn_ zF8!cQ-tdym-1atWnSZBcC!O$0+ZFAHtf)c4JShfMF-7O%oU1fh*J$!D48dr%CTLBc zwgSl20=mRqp{YrW4Uz&Q0(vmGGBMwnG*MhEw4Vr)n*>Y_+LYB#+mv_uSS}5@EG1ASz~iarb)p7QQ_dCGxYUDB(b{oCkkyu`-|B9O z!fI*U4H96JahV;oVD*Ex{6~Jn7QOg&3l>T^;bIV2h;<$lla{tiZ$bo{7&4%a3eTR3 zEvD%JOW(0zd8`fY6ag$;exBi$OV5w8$*^F#RX_s8d$|c50mMABteT9&5Ma5r1JZfN zNg8*qpe3zA5ZG)9oG+-o%`#YkM((y?%bRTWm(5y#>Yr_zfY89(|Hy*DJN2v*x}AqD zH6#$AYhyv9l67I{KCde701K;D{T2Zxfg^#4jD9bv-EReyJ(wvWuDP*Pz-{g41c27R z&4Oj21&a(!V!9Fy`^1z57%81V5Vy|B`HMUDn8z$>46tBPcdD@YxIhC{)dgfI>N@SR z0M=8s=PPEXf6J`mtboJ%_gl$=w+MjUFQIwAz~Q~xUa+E$69Q}kFT~eWZFDdgvQtgs2QfD+?HZM6mh z^7TxbbG)07C{&69pm{1F!hB`kVu20n^&3h_wE%MK9X4)tIO^>(XU{x*v*c;12;Pw9E}zG?8xeH4k`74=z3VT;9zn=Db@ zVVTS%%hb-YB!!I$wy&e%{u-kJe_T8U0D}@p_{Nw83nl#qa0Q8v63-)^oF7OYg`q@X z=Vkzr54N0NSA`ZD4_nbO9=Za60rUW7MERDce98wsT+f5jBNE`^KlaH7Tlruq0$3B# zM8~s@uIC^tDNvV0`4>nN01g3{4R2Wu~$q< z!l_(LRUo9S@1SKDK48g(ud}M<@3XeGpR(4)@Ablz6t<)^KtV>DYDU1q1KRZr)taa^ z-C`nrn$*JrHDU^B%=-c%DKX8OumLRXHi9NG>p)B}xl@AUyiHm8j7?qjIteA+N9j@* zM8v6(Ivy4v)S?qu44ZOJmo`4j5-Dl9DKTgmaf7bWB4E|7>vibaTD2u9-|_A93MPGVP*($8PU;7qkj+P&+6q z4OjvuE6|aafW$RQZ#JrXdo^z{Ykx+!YHT)o4|;o?te&-!Iz;-9>@8B}Nie8Eiw^-- zXuU#c^UR@(a13C*0%YY#zhg1OEeTM{bRMh2q-nVUT^3o>u~#zIa|qoRSCJPpc@sQi5LKx=zBK(iICN#Lj)% zHvg*GvXB3>1uNcU!J=o3HZDQ4Kt8MQ9?o1?t@-!JZ!JB-IBd0 z1%%F6S<7)NqS8BnV(7dD^X{`XpZf21@>^zg_kPU^HoVWu7rkBJ@IFiQ31AK0<-y!V zI=)EvTvm6Rm1T)<61c?;*P-iEk-g!xCA;pjk|_@fxZQ0HFaEME{R6WFe`U7ryJpkh z{;Lwmy6(W)F!M6A#j5o^(SE?kq9j-8y+~lKsOP8$x)*g*+*R+ab+dyH-nlCZS`QA8 zTK5WI9S-|3whE*P01{V4Fg;nZ03%$w9`FuGuM1tqyl+5ujNXcR2QjTNS|O2SKvrO~ zbB~S{*uwH9kc7LfhM25`=GW4@ZOKpmgY6N>Dmx*N)p@T~O@D(|-=}CS4Xg>IcWWr| zUjjJ=06blv)>3|btu^AxqC&$^Lg1YW?G!7e1(4UP(wz6o>nI5Vfk907RDagy-S#ot zdj99FY1U)mJy8#=UHi96ST~CgHHxrmS7=S9*7!T4a|B@1+YB{GQEFV^L__F6po=1_ zHN$sW+uYY%^|WWLditBJdErY|zu;XK8-B#%eWyI8kAw_D2!agOZWIr!gNv;~N@iu{ zu+^jotWLtTT1sI$v(PHCtHqnxcez`zsFxR7uZWuhfJnIKVq(1yUoLDT@`yzIc}#K7 zr#zq)S+f8SkOP)HOO3m_swM0_1SQRj4*C0N0EDMEL=srEevK4DFP%84k@pY z4DW&O{LVg6aC;cw9v%}NhwR{fIVLL45C+MI$Ftwf*K)8TpyJjc0iMV*1mM9K;9y7c z$w3zJQh=K#&;T<6L-~M+ z<0H^@D~iCCPeM%s5AxI`0Bl8zI0RBm7HVM4)CAYLtEOu5=^m=XqIzMhR(`xzh}1o6 zqlSg6$y=>!3G@V6O`^(PEntmNvzSs=LcLr7r9|3Ei2zy|=34<3ey`kT!RTA9e&^3y z-IkxWmerrKp_T8kuHkD|nvh_~h6VKq(DY`Y)x=m0h9po|E=EzDM7trTfZ$oQZ=Kic zMQt*A>{aw$vB|67Xnl*Gu%Jv#ylAl{Tczb=zQ^?_?S{onwo0OT)Di-QlfK|5u7U|V>Vjy+PEG@y3t-sxpwR^NLF)q@)$rkJvVA%8~oBRAX zZSA{%&r&;Iw17-BY1ct6v&*Sf0>g#CS}y}ZQ|JnTMqdoKvrb&^1f^Nr1R$!LYn?>Sjs2>SwC>z z;$#mlxZ6g4`X6obH_Zlr(QM(z{->2}evi(7M9*{H%6recrG?lkZ!H2apdx(RK^N{` zK$Uyy7WgFFP2i%u?Ue+Ihs{{Q@q%SaxWhyj|mPn-?UFi%MG#c~$kG_p}95uUatcZd?4m?}YJ1FaD7g zZTXN@OMg@CEDuA^Zo2Lji-k6Ce_ zfM&12PY)$E1mtqoMBWWGuDq(e#?q}=?FXG0Q>?$V-AU=b67970*`YB8pb4}ycXQTH z3cCWf37Ri&-lhMy36$;C`0v;6Tipd6YZEvnhN_a7!}b2Yc=y5b2W{zR{+n(5f?0Oo zr}RvZS!MrYmhHXQ$_FlL?2cF|2?mV<<<)DXpsbM6vP@uRxdWV1%_pz=?xh!WACTsv zXQ;Mr@gx+AB8Tm5=83e<;tQ>Q_^ifFK(AoCO<((dyZypft#8?zwI208vGS2v(j?%} zKF9XY9h9AoyDXuw9I+RrfvL~jcotCP1^7| zs~`Q4*7vjGodV+|r-%mxX#p~TA2F!(Z57agH3 z$@rxaGyH>+5ySuyhXeqD--OMBN1Xpg@v->;E6P@j=w_fbmJye$C3Q1k0aT$h(%FNq zAQ0cj>U?QS*7=z7?_L4{gBtNa?T2ND^Kid(#fUn70D`!N*Zj%>B>>dTK3+6D57zI6;f2eJX#3jlOYFabPPn`d`McHV>CHO0IASoH4#O? z>wA%B7HZ<=PyTSSg+Awe^d6F~DUeiDHAxF@$hQ!|;~@x}V-;e2iRz`6l< z2#~b2$UIFgFs!qfLrHT>t6AKtvvp+ zbuD^QOjn>n!k*SD1k4jKNh&m!Dm2jwF`tAOaH3h-pSGB*Gtxj`0kFEn{M*D_nly$D z(qg3vSJnw6H0%~QBj{Mbs`r`&Q^>M=gKhZKKicWfnYHeFzm7Q|!KLSG+9vQNaM33Q zKCsP7x;I;_eZ8fcH+XmbN(m_H;KU?wye?S7Y6(XPTikvCLp^6jo3wukMF2PNC;(IeD3DUS+5v-1U9|lZU9#k5bjE>5)>vaXxL#@eFS4)vf?{GW%C4pM*hHT zjzGl1w|~cinNM5Mq=Y2%rTdcbr$tPY-T`jQ{(YkT zmh7Q7-zh7be76PD@3q?Jf5SF>!))qvzwZInMGKy_!m0OJSe_1sJsKN%iN6`E%iQjWZwf&fziuJ_uN656_+fIXRi<<$Z| z87w{2k=tMu&1-cp#2JcTP%BT$UJNU7p}>pgHT^JyV4KxXea<$V_=O zNem$*Kx@~tw#6F&5Mf~Ts9TPRk3t!OF9G;`e$#M1B?U#wP{*>j+t8*@TH}(BT73HZ zEIsvY0(kqyhcxb`i!C7~u1Y*8o#?Z&@)j#BYtnNJX^lVvIRX#?i8o&GQ}<7Tj(7tF zhzYOg2*PkuoDDNMA+PeE zM^S9HdzwUq5=Ec+J=(8~XV?3T;|b9@Aplhrg9X5f>-?{Ifc46A-e_UF(VclSh2W|v z*=q&KJ_+bPD@fqFoa`@$7Zrk?aN_3^ZD0JezxeUV6TOIutYzaQK$H6%By}F0g9&l- z#EPt0--{w`0SzHC&4wC7_6&jT+B2s?Jz0LwG#K77!MY$+HNr*QA+2f{6o_Ti%orl z)voxswQT#WW!Jt-faA3OM_ZKkQiF+Gj7rz0(!00a(LI+W=Ub^LmXLNM?J1@SOS(1I zGrI44<>QQig@kWMbK?(zzt~BG(}07j6brHxt4**{SCu!?KgU zdJ=MN$F1YNziWNJ{J*X3YyaE&f8rml=km|%+@~#xB?qfyt*B@D2eIfs}TE zCV?CJ118!C(B9`UNW}svoCgr?*_8rW1k>|dVckwEXg**Cr2G$G)-#;6p1Xg}c7Mxk z%E$iBf@Lr2{0~~te$~pm^ndMME9^dELC+q6>f5~(K_a`^5}8dFt0Inw_BQ)G0G&0RL zSi}xepH3jlElHX;(Hu#3=pJw>!!g0ePj((3}7AnD9PU56OUFdNxp#8^wXQc=okc3Iirz1Fqr1J<+t$E|Vn z0|Ij|Xue*wg7VE)Qaoy@vZn zAQ^pOo3q)@mjOOw3a$(Nab+5L0ayyHRXLdw0V@hzj*)(MfTiCP`VR43{G4OmVk2SC z=LnGTIr5~8otJaL{~-x~e&auY4PXb^l@H>^Lhgko&lPpJTK2Hj|oG1BJyX=Q5g0!I7Z04u}~r1(?r`K&NX#x#bn7m0W|$i zXpe&}z0=5o6$QDo#XX1>i|;{U6vOoIrB?u)8wt?D*1?Pei%Gh{(ApHmU~xnEErT)% zXl=PUkRS*!x>=8t$`RlBonW#EL`BvrwtVOJpklxQ(~YF#A`++qTons&6s5y^49~^O ziC!=hBR9D#G&vKzEPc-P)#F7|+o_;JFWpJM@iH`#co_u=?nV3Za`eK+5Op*G%JJFi zoVrFdX(FHnh1bqe&V`r{yxfEfCD=Dd&a5!c0=h!*6}mR{OuY1r-U|RL)uVj{w)7r- z0_xt1Qv!!Nwlpq45)%-LEfly~=pd^!xm=TGt=`QVJ(rkkOlZEkO^mBnfTUAf-48*p zlkT_V;*VSX(x0@>Wj|rHQ=b=Omyq%*$hv;D#*ZRwH5%Wnu3sYnRSOstb4tv!B3(Bo zkd~mNgqTUZUO<|443+eTjk|101r1gIKudMkO|JkZO|2H-w zfE7#^xM-9hqSv25WKe%l0)MYn)P!y|06{_HHr@YiVLTJSN52Ja67a;I2`t4aSJ1Ap zn|im+{ptU0i@s!*IrM1@rahr?6=MDD!a+S32|7|Z}O_>_4?cpHfZ*y z$IW3I8ZzXtI0YS|&f``%;{hw({%%`|d-Lbbf|-x$ziU>~BVgQcJdFKm5#XWJK&ymn zy?~;?Ou7my7SFN6uSGkTf*L(%i-2d1gg*d##bege&&DL;-CCy3l{1b zY6S`b*SLt8i~ZU*Z1H3W>ZBFu+}_5hQSYchbG896B@jR#OM=z0VCfxs9GD0&<$?F2 z!Ys5QB!Qcdm=|GT&XB^)SN~1tglHub(o&rdOEW}`Db2}RDHP4D8R`wKwMsy2M&q8* zJYVyiO?~#)t@UmJYhvaa&RVSZ4oeN_9aZUlR;)DINRjeiSOd6P=mZcxH?C|6I|27MX=UaJF%AI&K^1$o*={^G#JSTmx>KDK0l)RD5 z5|0i01;X0|HgmlKQF8HYU?uX963LQ~Ux(y@)c}tOKtIRQXW z4rIOJ9DobSR4?+au|^IQWyj^nt>^~%GZE#R90fr!jyP z*2f$tWS+Ld2qAHvS8hYujj?9pEf^#ymmJN-UHSJMj=_rce>=be$gp)Vl?SY%|HFqE z(#?bbDa_~-7y-!epkzvphnA{*0z~Bq zP$hr`jX#S9E<)%DA>>qu?pZ8o24f~xfrAo{Uy>k~FvblP(o83+2}5pX6lenRj)5mJ zm&hzyE@4hNg?QauC%*H0z7-4Nb96kG81~`XXfUB`kgN%jKtgF%uC`PqpQ+6va8jXj z0T4BQEU++JPaqHAg%*=L7XYhRAgwGhVzJa5ft>kPmYOGRb)m&+yedsCsF)+hy40$= zBped;R?()h?hq4`)?T*eEtcH!8H+9bajRPLvQ>0HY03JNmQ1a(q|RAUJ;P$n^TOcO z_GMz6I%l02O?JA+0g#$Yp}!y|?I)r8$q+lGb0@{P%4b`4=!nhU_JVaT7DJ?&DjGkQ zA2RU(NLhk3N32ZXDki2@p>YoZRtT72^d6jBDMl_qKsF!6PQ&qZ#-e?`CI=G?~LJ+vD*=SaAr_E^XMO`-OH{ zNmE$6%WFdE{g6=M`?Vd=c@An`9k=o+_gndfx7)H`62SV302V>?-FF(j3aPeF*@MD1 z32XpXn*f%^Ge*$7?mtz#L!dsqZcwvb0Ccy->C;z30aby}nRi?3o4#pXpZOc>`{KVk zfNMPU8G$c>@9vYj2LTkyJ+$J66M(JO`2|YG09J#3hp;jNvdE~TltB()c?_MD2Ff>3 zOx4RcROh}s2{=2gxd~w9fvg} zM01Q*Umhyq#Ww*iC|p|mS{p&7z-4NW*8E}Xn*R=)z42p~r9pU^#)qU7I!3@(1)_pt zftAu3meTsKAhRtd-X^}AX#rG;e~KS?*%{)iJl0C%tvMF-oVUi+AGEUB@35LBZx_&d z!RKF4to@P;G_M#V@f|6D?v?~>Ng*vvc8NE3T1BN~jrdA<-f?i{S$ugi!)c6{vlVy| zz;ep%GchR2kz2CzK$d@(eAIu@b;e`0ZUwS(0E>GDVCBdaekTCctKWvt#Jx?t{r<Kg5C+0W2sV zSn<09sN5i7HNu37JIx24-(%dYD6RqGy9N#b#Qs=@ApbA-fApLG&bbA?CInUyxDpj6 zq&q6*EGLYx1)7v{fw#UoiULU4&u`0y|||!1;b$DDpwO`BmTDRO&QS z6B{st89B^i05nB_3F0%qjhj6~kajb`f>>Oh9pWjt6uE=RE!1_wqIZ0Da1zsV#5Jy( z*kOZaZ83H8Uz$duVnAqP>=V;?3BZJ$InX1(#hdaO@Shih=Bgz!O&B{x{Ae5Ey{R$HcQfhBZJAEO4{Uz4ao z%(!-;gSwcs{j!>s`ac9$UgM{6wS?CifvZ&-mlgg!q_v{;o{>fBdjzl?TnVTV!$a>m zKovkM0$b%R+x0n2p=V1lJ6ULBS%-QT02sQTY{FXr0&zZG8 z@Cz0U-y>j5)$-$(>^WmJgr@qr2Zakn+!A0>5}@riD{R{1?RNtD0Iqt@Mg@G9{i0dn z%C}h|g*@9YSV`9zff4}L4l8dB%TrLg0QVT~LR@TN9VdY*0XK+d&0Yse*QS&}(5`pU zcFZaU@3qnuZ?Xjfa`S#g0BghB9AFXCQ`B(S!B{bs@hKzFyurMEO_R={>&5DBw~AWa zh6JH+bysJ(?xBE^2CWp;J#DFrFWY1R&)zTmo6Q!$n)miU4a-b)^1tRuFM;E0d<+;PEaLr?^$LfM0GwNrzMGATux|4!67s$OE{)zoRy+N~8|trdS~>sBt- zxW>F(@1x^Ro3sACHhIZ&;zJs*KnkhmG)pTCCh!tq z8TV$=Sd?86(|Q!IaMxmPsUuX9DxU8=VZe;&=Tb=Tkyh&!Z@u^ z?f{qoPVR=|Jh|*UTyKDv5a6Jg17<`3EIcRT=^;rLyNfK6kGRTS{q|OtooE~F7iP_4 zM42kyOq_EVqm0Z)u0?V#|K1^Zc_jPt_lfA{cqy*Owa4*+a7NAu6B=Sd@6{M45fJ)e z>3ae!2NpjJY=jeVMVCY(LEs~fPOF5uJpA%7ikDSIq{FF2aCNCB*CiqG(d(PcHrs$BQw50GnI~5`f~|0H%Z( zh%_*dS0dX+puw4*09aU%j`7s-0Li%i_x3UXv3b5wnfN6FQl*tWVt~XUbm@5kSDj)! z8ly%Xm(kc3>l_V7t!wn%*1q_YRy+UW*0B8J77R(-CEd9NE0M-V4532Ln@B9QcpPS^ z-(zB4Fxs?rz(7K!7+!k7c{& zu#ymgp*z451183+USLwfC!SfX_Y%4W0a>^Q!`40eEyE#f z>6z(ux_h?no_*CW0a`%YNQgzd#3m#_5+VYO%q9?Gu?vjl;35Ls1Y?4V#h4{_0tj1_ z3lU?U2$u$Cu*= zuZ)1FBp~S!qYWHGGTJt-QzPzx-QU z^i#9C-QQL_4p_s$^*RPC6WQol@ZY&n{jUD$*71OOYIk*BU`ZJU$@WkQzqyaRr_G)V zmEe8@)SK?N#ov0%hL62#vtBYg%-UKvTaMLrc>sBj4IX^S)*gA?y7oS&F>&;QJK;jj_%ctu;30N54<*LV4V=&pV(c!D1Q?OBzv0Tzz+^N@g&1sZR z@wwt$%MDy-b5J?J6%*yEXro)y`o7oSxt2MYr4V_CK|@P2aTanSWx*Wq+i5p|Qw3Mh<3v%yI%K z_mZh!8`UoQzjia`c#D==z;d|K+~ljyIs|1hw&J=@%nPxh9r9>{M{6=*@p}P8TUhxP zR=^Q@Ox7!tA!|||l7j|7G`&pd&*>$k-F&nJ7@J7p0j^lw z#cF*7X8{s})FeG8i9i1+iJcoUXaQLP?y4N%P8yA;8qkUv#2q~vFDDYf=|sYJP8cGr z%i+EGw4z2-8~aHGkQx6Q*PVy1@DfR~46xvh;lWIm8OYTtwZKXI9Svf_VJr>xL94+_ zM|&8KffNIl3*b~ERj`@>tg85c(BMl8a59_=4~>*=QP!6f9INKWw_(sZ8#NiQM;8O*t@rNVG`1^69 zUz%&w-~}u+FsXSG080;f9_w+fj!C_mwQBc9U%i&8u-D&MXj4|lY*{8NSPD$agsmtj zmRIawYpwmOEmx6+(WXAi_iMnEGzpDJDPUEq9Zl*-J;;Scx7z5sSFL^FPi$oDr#8Iw zxV|swNJ~MmoI1zv+Vq<)z3N_T0*EpztU=Hh!jH?W*mbsBus#lW7|1K2xG7N5sPA^~ zv^l3Aw)t!B(R&wZz^-u54jVK_i6IB7Sf)a$TZ|ePZZT3vrodQ2R_b1;9~`a#Gkr&6 zF0FgrnqO;${3cne=crGl_<$>~$iCAmd!DxQkNk@bfA*L~tJI#Jy$)6=X_A#A!4V+D zs>@DI%7x?#E9RuYIG@IihY1n=O~v9EuqY?t8|jwTOVLU3Xsj_#>QGb~BjIno>bQ6= zlI6_~HV#ht1Qb2e_NPgG-^`fK|JX`_=62vAs))s=ug5fTcd*e&i^aDG2ezcgp0;Q8~T} zScsR65X96CQL^FE;Gych#`1fgx6@uRn|JhWixwR6I#bF1YrJB)hwaEwqKrgOD7ebz z-GtdZ!CTkuo*u$#mG#C_eBhEgQov%=C#BeTh2{GMi>Dm2zN5dklLc6<*K2GJ-K67R zBOuu6D;{ZgR^XW=xty{Eg!BL%u0hw9BB@&N(AcZbsPwPzvl`HgP%gO5PQLqRHtXp7 z)_2ToiTbQ~`zscWXuPO@$luD5q_6&^TmnFq7`n_F2QRbcfgt|g;7-40-{OhdR=QpX zEJ1N&t6*9{MS?gIwv!4H6nhA}O_s3lTr9z>T`L$`K>&kBJ%5xI$mTTuvrAlAH?^;^ z7LA)M-Xp5^x9_sjl}ByEBX3ywg2&ZI`*fXpCWiExu8*8PR=s+z7h|<;nZ_#KWGOyY zwslfQKx5tk3%JslWqTPJ2~C~bB zZgW=MZSz*&D=@swqI%60c~&-W&^##^YtsLz(;QyN&r0eTO>HA;%aDL`mY$h~-WCc6 zH{tzFouz&jn5QL!H`~ZLN3CnqGnQER$5vYNkkt>#D5$6(FvtpOp8zS*C8MWX^N#?H zFe@PIkptfcZ>f3RDGYH$fW+KHG$RJA09h2y3`IA?s&5Kq0$Jg=vG>bCORqo{`i9a1 z6Cyq6TdwIi0IfrojKwNsP3Vu01FVmh59!Y-Qmfmi6OKW|h}0nRubYbVrBA~udH^d# zV#2D!+NAi<{t0o1OLacyyZpviFRHJRCPD2a$inF%$QqAud6X+K!2|%Rjeu0l0Mkf) zR*-c9`B=b;vij%$BGYtwt;8K&`+wZ&p5!f{!Rx{RW%uxm9{3bWmmC6I+yDXLD*#1; za^!u!*V4Pz(xv5=R!5WfG#y~o4i=XwAx`f^XjC`DR|p8?i0f0_GSRZyt8F70SzNwj zJJr8CH3_j3w;(I7m&E`Mv2Gp;4GNMRv1ag8sm+a@ngqJmPs*ps^=%gPtnwTzXgmff zUI7H&8waWy=!(5uJh*j|alq2Kd@n31VwOf{H1QStE)+0r_fT6>*WugVcz+9W)Slwt z9<^zYrMtFUuJ=4^9o%e%en653T!57x)I_KA<0(q%y|jKWC01Jg1smD$r1hQsV;flW znymAO_1S)F>AY0dp6*woWZCWkS)_uiGKugS;HwKAc2<>Rn)+?R`4{r#{Nr+EL(NI^2upA*IJXqw%K)<4 zsfk6HFl?zqiGzBot(SD2rQMdC{dtQ{I%GqSzG*{$X*Tjhvsr)kw)I{2vJ@#bqXZ6> zODv`Fk|M_lKohW$1IB8^h~#=!FS2cq?i2gQH2`oGLDIkuPh9s(>x27k7Lu8ICagZWGT%S>BmKAsuo&}Z&=S6)N zTV3B?%U5pDu|H>pr+#kp1Xx2~)O{PdDR|1tyDTNB0aOVE=K!n$9dkrL$Ogvhqg2Ov zdS8G==&PI1k`$;wHYK3O0~S@Tvfe9?+x%z#$I3^|X1w@;jXv?ZMJolPLwg<0+e_@H z$N~Vt6W}MHVk2!fVor2lD(Kv0^?kdoj(oG89UfwJkDUOkUhQIkJI@hpV>>5_zz6tY zd@(j$s<1R6wJ;?hkkX$lW0S;TUe9YTd#bfjv6_`~C@qcKg1{$J5yY^a%&Y@8aP4v1 z_|;!nWyh1cma8lxp`X1q%NIH<)d}p~>)IwIuV<@X#+aufbjT3ZeAys_xW06jhqE0d zHAe7Aa?R9q3*mZ!Aqv-*(a*O`x8@x@DKZGjH*;g5RsrX(wBnKn zY~HpPt+e`aE3JIcG7I#)_o^SL>&I$eazgRAS9Cq(j5=V^-^LutdiO+4q|?wxF=Qcr{YW)(g=a1XE+l{z9xU}O`NI+q z6;>guj;Iojld5>CQI!o45A#(k5=04LX!?C*nog~i_(sKl)6sM=BuiZo z_b6zhXfB^+?E9APmbD_#!V+?@a!-RMHxen+6CLK^U+a1fGP* zAO<9WgeCs)(Oyqh?my460~c7T_gqP$cr;3Mc@@KeIaS=x% z@yOv0V9>+midgN{1cnlBkuqg7R4igFJ+_+RJ3uV3m+RkS+1|aD?U6E|rjjObPuyf; z@RgG~7ZY1vzfWN0AGFyUp0jyde_;8=k6K~by_$RkBEA|*_e+DWsb$piZ3`@+fkvGW zYQTh*I1&-8Q0m2_4ir+6vA+t{0Qe2G$sJ; zl&sL~Vr#{VsrIEZi!CYPJyt;aHVTAa5r-a4((b9!eNnsWNbYRYJtMD-aA%i(E339e zO1;p!#WJjtB0NA%qnUz&u{&+~1AlMxZvQKbmfmIcGjEfnECtD`Bl1`(IuD*VJeN`~ zk*>v)YN-s5!VyTZB~L21(iaRc5&Cyzv3s6Xd6N`3MH&T5?!98XYtpW6*c!YQYsLYK zjcpU;v5_M}HTWuE0RX<|n-mye0{EcFJWN>4d&6@@UXzFK1QAi0)q_`C{phXMwDB>U z_riNt{QkSv`scs3;YZ%IXwBF4Jt;Bjdr@e0lx6zrpI$sJQjDBKpyFPquAnd*b=+~l z@*J$~9#ZrY5JNZE!n^*~Lxi0V{*(ScD5yVR&D}Z&A;5v{I<}72ex|XZFt7;3;c0bm zD~cR1T^C`!b^07{2-VPmOI=UzMOLrzobO=8;sL9B=rtStn-6TkSAJ&E=s~sNYHOlO zeBTZ!+KpCfS!V?nJoM|Fql7aBjy)F`p{typ8A51vgsWu;v3F!s>sBk^)yeI)#xowY z(MSHn3g7vibsc}-W*+;EMVCIR^X|2l(k|;PY}b6EV+vHF-ivh(0Tz1#Rs`&9E=?76 zR;Ts?SQlHpj2ygv02aF&;E`dqDXUKLqLa%Md#T7@asiSE|7)HMA|-o5iNA+ZmQkzu zfY3OKD&4WfS8jVgtdulf@ThUE6=xmPc)nbHbI_LG`I?R0^LG}Vby&{^9?8ANA^^q{ zB}F`>EkN>}A1J}%&zTI+b{RaLE2%k1{Z9TCA?lFeum0D2Tz8|M|EBy}OBU8xN^@;S zMl6uztDb%C&~u~D0Mgb4`)$tJyDd9g@ShhXv#+Vf10^Uh*rJ4fgGWR2Ffc<{-WRms z4XmzgZ0%-cw4kyHMX$LY4`ojGrE-&vZhFotXFO|#6;D{>$@d8;Z&7;%Vfr3@$nO9v zp4S+#T&R=|Fi2v+3L!hq57lj9e8Xb$-)iqo6|&;eJ3v}U0pa(|{|Nd<^D@S~t}WiU zKL)HIItIC3`h6{6c>*}PswU~%butcyPbuyJI)P00n{g31(?)MAQ3mwo6p1prkJCw7 z{UULPNL3QL=aWUB*GPl(S$#%xf11^Q$ZY8gWY$MYLt3zOBKiLXtZJxj3RF2v>7*Wl z6U2;v$8YTXDm>uk8xv5;a+hLts6ttZ$Q`V5cv?^_B>VE6^~PqKfB}lf6|INzbP*6P z;iaSo4HCy(fh=``OJ;Oh!Byz)L_8}j?{7QZsIHwV>3lkGR+D)~ij9X8>%jLva*_^% zJ$SHmvx*wHKIrv%)!T;Ws=2bxnx!Zx4vCP!j8zYnm9Pyt_1^mh`}sM=jYo zY;~y~S(HNpibYn}D9}vmflzrHno4UH93;hj^FTbdRvU@i<9=6DABfSX`&Tdj97GIyYPUmB($t z%VwFQ|7}eVy=6o9|H`6ycj$Wp&0f4V7g&C#6fNE`!f}F~$$-WGBx1X%Te7D?17-!>gj zLimjLsEUuUO^k<|Xb0Cs5z?N$mg^80_X@J^dDUjU`d$cij!HqY*>q`V$d^;!6$Mxs zN&`@jY(VEFOsMNfv~84;b+)cS{okYKr{_!uEEIVMdkd!2&N+8j_u*e!>XEmt{G!?5 z_x{t`Zh2WCa)rLL&swtThaw?OL7M}X;7V;{uSLq1;MMaYnq2~{Zo;pGEd`l+E&(h& zF)Yde1Y(Gq@IF;NQhMKI{QdA*fT*djwGse}amfl{JSQk}ybSDULCzB6mhhdg+-uYQ zspxr_d$Y~ERHiT+o|W7)p}_?XU(gvbG>a!s4{8}e#10-%=FmckfyJtVL!u?36f$Q+Ac&e2>( z82nl*E<0katG{i9)1SBWsZYod`9rmpZNXMsQ-%dcwSYANS)o$-GWTM6s8FEeuvA@{ z4m|jNdwy@Gh~|`u&>^s;YvA_|S{U(F$kPAr1)Bs{0kA^oaH#`b3|ZrP!}V~0td9dM zU|~9`ufEp8)F+jR;|NOBHat95jaU|!HQaru>|kdgl7v~ z?+fAtSe&2sObbq*Q2csMn1eON<@NhY3|VpK#o{N==tP-8$*|u{k43k$jR4EjN#YE< zpC>4Uhf?t}0#bm)raQ4(r3~7(dHw~~JMLEx!BN5?b{zsD>Zr*Q-@qVooBaQp&LHuQ z6@#AOjO)D|l7&$kSkCTYqG)DTbgUahII0ey1AILH=@d<%`aQ1FoUWDQNx^vna;3WW zmadIrju|N#Y8bg!NPUA>ih(umeRCJ4`X~-x>X^VE*TxiG6PfF?BpzrDWG&zS&p!K_|>lw?WLH)`Aryf<5Vl{{$i135ozmps+ znQ(9u<2{U;^?&&y%d9+N#nq2lT9$ECult?V@mq8cd{ID{EI4lM!^9-)6EP1T!fH<) z-*ezdI30VP2%p+UaGB-qrl(xst=RhwAi8t3hs%=4)L zqGIsSc`-&k0~i`8Ik(u^@617LqyNo&Y`9C&NkV?UKcN?s3<>fi#{25T4m_8-zj^&u zfRv&jsK%!&G!%bDurTv>ixzyr=6vm+t@}IgTl(qut^D|V*0ApteSU>+Rf9rgU&Pd~ zV5>u83y%_j1q|RN^F(*GK}Jcv!{P?NHoQ)*e7p3!A;HbUFWT~l-mp_&c;BLHkGq$t zv8;YA?=dRLM}&CrY5-6g*CCt~?nw~Nw<)}j;O&Wp{H)40LESEEF7MO%4p_ABSzB=I z9Xs`*f3@i3FX_Gg?sf694gvxSX3|b?J7Gt{k7b>YYXI&vSK$?jG&cZtw1Jh9^(b?J zcEeRaw2p`0vHVl-TK7}`W%D2SwMC2XRNHqNN%9W32)S;3f8d_F1e;##T7C6qh5BB* z9JVM!LA$8QlgpJ}eq@e6Ckk6O&fapw|Fta3`sZe(MA1^7jxacGLH?RA%@R0S~_6r+5^oEC(DceC&R<=tDprp291Y_9fxg#9U z>RwNo!0^G@1jz#-pM&o0N(yiwnE ziM6hJ!V0Utss0rBrcd#@clFF=e3z|tsEZ{7j5(UQsxiAYc9@5kEPG8ju#<&+h1%PDaF%L3V z1!q7AR|V)1YyrfAv#<(rss9hS0b9%`oP+r@(Uzn&1fQ9!(I%hf=hb(mEG}4d^ueEyiQ%O>KEX_H?ibV7qdJdTKG!MTvyqK{t zzta!Q_ZkxdrG^wC+v zd!oo~0{|}VCj0qfMg{`sK_WQwKet4@eY$Wvu;;C-Wtsi||Cvccj=ZFkv{x8B%(hS% zYi*Hz9H)6)V5)8{zkBq^%$``o;Z;#Xv0;yiOtI5r{~X8BpbuA>nGLqg%!VhGs6?gG z?b^I~k zppdG~Y%|-;HcGZZ3JVqTZ|v-RSSPjUFT`qrc)g0>60`Rn%0IrSc(kA`3B}K^KMp~4 ztTWYc7QPOM$L2^SqKy?#ocOL+p8x-G@a=Q%`yf|`2FX~R4GINJU`P|eK6OHZO8m!g zMs=%cn+z}kHdq-*Hs`AE>i4Gi_abtlTWi%qQ<6@@z!CT-qhFtTBz1N2nMeVmBJ}&E zM!gw6#iuBt5<)U|%Wijwvmu1b^|o(^Xm0nv{Pl1AQv=4RvB9WP7?q9~twfYIV1Y@S zJ*);SqOC?~8#5SZOA*;bhoxP+brXNRe#nJfcq7yZZ@hC7av@Yi*Qp(6OS4IR?l5*( zyY8>r^3EH%5<+-!-UuOty6iObtG@KKDdUiB>&u#XtKHvpO&rDuBZN3ike=7{sj&Qu zPNjf4z$OEkEUOLtkAv-P{|cgr(||39j^}f;!2{$@LVkd7B!n~X1@52%k`IIc3EcmE zE*0d`{OHZ$+5c;;fcCI9p+Z}=-Cq23YY(kmu?@AgyH#4-E=iAVw7nNx;~qWM?$-Ro zFJ}{|E@Bg^KHK_IvDu1+T3~)q%}enFv9|{vT7QV99(Yh+BvhuNTMNg))t3__b2OZ! zq7N3$$QD>VfBF;|%&E!SPuhNgA=q+Y1h#VsT`IUAocshgTv{9+m080uj)}fYSf5UFK-JX0wUUPKU~~L^xEA@9YTjj6>SZ^Ddcia zDfumhOM(%D9^6mMAWWU9&=Lspl22D0=q)tn%ccIzKh9i7qXk1@S%!jRpq8Bi&u9|s z5=Xz)&6MkGe+`#|PX4``*k-7e9Jc-yKObl?JIz8lLt~XpiSuGq2zO$*$k8 zegL%v#B6PKF$SVzfyIJS^#9d^sV=Mlu)|h!O~j5*AVdK~Y8~5;O?X9ulHd^imzNY**W|t6L?PyOs?E%_*Fr-`_%(m}{pg4vL6GM2NHe&DXqbnPkom+dgl{ zas(>K3ajFJ94HASo7Dc~&wU+;uWiG&*pU)QkU&Z$3F_S6?%n;EzAxzVo*3kfQ z{fk#@$=XZLR*zN2*nsHxHgCLCIZ7Gc660k(iq8Tc{sEdf)SH~;H1&M92a78&+wr%* zM>Uq7x}|*O$=%BLxa-2cSIzG^?tI;Hw5zH+d*u1M|G|6V!9&rj`&J(Z%(Epsv#-ut z^e{-9;U=1Gah#cHs00idI z^|jR2P35~hlqg-h*W&rzFF$zvE{~i#yadSr$T7*HDZ%+7DEUw}7f6++WlH}HK}Ywn zK#B7CB_j=bX&3Lu(zYGUUA~gI#t8PAkVrabu1=?YD;8;MASQ(D}OmF{?$fQ z#cIr{!m=es2(oVjabEuxkH*&b0aX5sj0%(L&k?sn(gNZxkI}ODs zVu=Y*+nWI=-L?f!E`v5|C~SeG9I0QC{@=*~^y4KC3+_jWOe7G2J=0xMYM=H)&5`B; zEwX-X8gya>au!gbWIc*97HK0mS7xtfM@T+H``O<$Lf(W**f{C8Jwt$|B2uxsMjVf@ zlOwUrIY=rD$JQoP-A{}NuZT(q^LMk-zb0~6w9jK@M>N+=!kjJf%>n^UNz3V;l=>$! zwwkh)=#_i6jynYf?|JGy_5Hm32^Ay)to@tdt0PaS*^s=n-^Al$g4ozlPmy$8wR5~R zp#SP@F(JfQVRj?TF|*#qH}}lWy}Un{X9K7apM5WKm4L$xqiqGtJP|iGSWFC9`zF1X z2e6Tnn`~VSgD&r1?6uYI$F2PMOt=7S7}I_f1ti>^ozAP|IdF@z%1|a6{qHK3>=ey! zkmpz)Om5ik&O~VrYF-o<q7+vom>Q?B8zywiP|Sr*|q%SQ$Ep^RV) z?l+nhLP<=6E8GJeu_9{=kEK~7_skt5`2QmC{IhxCjb}`tN?<|Ow{0b0J;MhMu z&}3HyXUZ0L*4|?JuK!oivUg1aTytw)AiT-;IG2>KiPgo-6!&|Mt-aE!c(*P7#n_sV zj+zT%qMpRFEerWz8Roj*5PhK6jh{;g;8D-#Xf?YkFm^LH8wbBA;ya(tN@#O$-Z+-~ zH*%i;U3P{dSSO2mZ!0EqoyiB8n6$I&Zi3|@@hN4j#H&Y(wUMOyT(Y0>cDt9>+QkIq zAm^#(HQJ{3jcm5pt@pV+02#hVgX6m#nHnxJkYNxNE@2o-JMmDJwalw6*!EUbGr1?1 z6e>|RuShUbJK0;VBK(pAQh%%V25_>UW;Iz#`(TH*xeHrwb5Ra%Ih^GPSBL?K>GP1B zQ03wPaU3FiaJ;qU5_jR?o zA7xN&7yQ4WSg5*g`p9N z!-mK10x_<}xRvarX?J6`h@|8OFVbWKR99bPS>B$d+lMnv>xVN*OKaReMTU*v2v3#X8Y>MR#h%)0aeR+i|=llLKN=5-==5gCU)$a+nhT3~Q@ zurA$NLl_r!pVjc6DUFPmL88TCowf`LDtNIU>McYpby4Q zc2cApRQHS=HB@PkgCYzrs!Svge7i-njERk_J7IGA-4gTWP7c zmGO|nS@VXbMhx*z0;EEcHt(prs-0L*DECjT_bd;_yNsm5n(KGJgN$H8%I7p&$GSd29;G!mx(4KGOZ1d>ySXsg+}?8dTvOv=IPUjfhC2MT zzp1N?hnUU6Puxn!coypJA$24ic)9i)Gd7LtYy;I9>=J6^T2sa!Z(a%`jLWwH(zaWkj7Ny}O~JIsa4sb}o-Xde+r~aN|nY8e2ZXF#HufPgn zA|~I=bPESk;t~2BY2D*JM#+z-@LXbO|&$57dd$N=yCRH8`VUt2YZXTVPJy{$JNm)@oN@7(M!PafIr@*#Z z!saYqtTZ>MPzaADlB2O|_%-e@HDXqQM{cQ663J}`LMZxK(~n|g1btC+wj)vNpCyKl zqi&X_Vm8;0?2QP>Kh~(ByhTf#lD0U4kRoYpu8t5Zva~e#`bfTr9p_P)$gnskGzHJ7 zj1&N(EG2U6kSxV+UlDU4W{@3S)xEUbs;_CkM83=X$hj-d(qyVPH>d|(cXL|61OY;F3dvFn;9QB3Dqy?^ahtwz=qH{8O z-lkE&Y#8!q(XG-v-Vn}^*_z9j>U6T_zcK~T2>Ue>&;s@AbT^1Ky7My3 zQ@Rc{Hd^A%?d1M{x~(|VbO${NK%)316&VzjvH)>yMWFR3avjUMTE4H!0R;56rU z^05U(!LnQ)E3n`qE5Do-SYQ?AR^=uc(sp3!7%BhGaU#QriFNc7Z-2g4t=KD#;#m|g zR_Tf4elI#LEiQtT(HMTGesiP6Zj^9@hStu2WJda}j68noamM&wzDnD42kkIu z)a<*J-wgz0;9SE9;Ow;V+&3rd2nUD7A56*ejc|!HpjOuXW=9`B^&}HmHW_!fnckp2 za&7q<+zf*ly#4}c+KIC?__=E@96#av$R;O2VfFU85D$>;=k*@oi z!RIRw#+wOF+0dsjK7zStyXA6vh66on6+Kg>4tCU`~K-D zI%)u!kkdfTpSEeky-k@6N53Glvf|k!6Vbax_IGbDh}?U(odA0GT9lcN|7Tp}QhLy= z#XNomG64JKJ+!1XEm8XD$P)u9n zn|6z&zy2|cm#h-Sw91i=%jO>?go?I#6t#3oG#2lu2W#%KIUYO{k%SAX24Wa)_w$rS zL8gF6#Y9OQVoI|4!uRgANrN_g`Rt0Pz)1ILpKK=}y@da^SH=kYqQWgl28+qU-SsvL z)&}0Ce{qs6*5{CYZfg80NjV|Gq%K|Goec7_j%O$iP}$b8?eR(Q^r);# zrs$P-g&!nn45x+h*?k?u{Apn=0BWbDpRKkUHk6JX309s0F>IUCZ+&oG#a@BpvS1C#0;(Xa7TamA6IG><| z?frHtl7$1Ryv2QHi-@TF7$$;6cf&ec6F-iH2bmp^uzl4z7l*DSy~YytC{5H%UN*l_m&ne1kI=wCep}oU1Tym#x81&>w#DsJvM5x8EZkPZ2R1=!fG451 z1Iy~^515)OzmDcE_0pD0(SU80#~=z!J0I%If9t7HzQU}L>e<15L5^!cDRnvLC9jR& zyEfG&9lUMdiTzH`b17H@k=QH0VspTV+tLsA8x)3?!~Qi*8OT`6xB%2LS-2@bE8Ryg zyR+VN@-@@)v{_!>KG-xrL38&POXoS2HqKTIpr+@^C(EA#&L!IpW~ zT1=>q&RcFjsIb{-FWcLMY4g1K+%DWkPX_V+c--7#Fy8aVP*adShfE@Up!=!bY~lVg zBG_;I-2k!>?)iUD&DI>QkD+GU=%_1R_?jt%$1t|>N+>WS`8Wv#WC>IP#M`ObZm>`C ze)gmu0M;Kp75j-8g59ye;+_W-k9CBsiv2^0%!X1k$ITEhFNsq9ATW>8>fz)P?oKZt zI*S=Rd8yccmjcmR=5a9C^qjk*c^$TJ5%!Pwp_J^+938qvpCb*KJp0a!H}8m2#NN&QBqA3zJnd2=&z==2gf4 z26HnAM^XYZtV4d zh}vvNIQ(>#!&3K!))Pi4Mtae8;e1Wi?8xT4=MnU&V&rJGZMO z*hWEJ)uyF-E){2aa$I2rqNo244$K?kk|l~#U&#%HLK{~dC4$-Cax2Ti!o-r4pD@Q` ze3Hfi0Pkt2rNUKf*6;-}YmJ>H}OW#Z6r!@ogY z&dtcpAqHnU-mrX&w1FH*29v^DrG{98uvaos_D4wtBZT6=+loWATI{43%>3`}6O>v& zaCmNOAMFL-Gr`<*?X8nWVRwG>YcFgy%ePT-)HCJo%p1f^w5%>&%`^04F)3?Tcv3h$ zeb=(p@t1FvT)qbGBD}Y{#t&YLyJ`nrzIrxH!+gS4Cu7&JY(Y#}!^9=`0Xroj&gX8& zY4&@SqsWqo3e9t@tGX4{E2^%aIac_^c&T|SY_#1H7jy;)k^%!9YV$5>n)h6+&?!}U z&u@w31ft1Y@ig5|K04#b)h=@Ax_5v1sR5J+Pkb5xgc1q>qK@E=4K?bI+4AlR6EsC7 zXD)J;JY)IzKVNMVJDG_5HgUU|^^LUq>5V^g4jvU;rS?}KqS0N8Rjdgrmy>!$~~pbO5=Eu&3rYl4=?i9|(K7^gC3~`*<5c=4P}A%^=giMx^0q1B zXi*62<+Qg95)*$=?Nz)GRXNRBoa3HmlRXJd4T+e&n~jU$VUy&0OK%gL7M`N>mc)UP z@An2)2UFAqb3aD+anYoJ;+mhwq}zZc5Q z#jqwKhp)Ns^L#*-yJ|N%xD+rO7=`MBdU=&hqKS951>CV3!=GFDCxRVBJI`b^Ba)fD zoCb=)F{3n&n$A-0{H%g882bHv}J$;w6xf^M}W|?^hr}LY0l-1!{V2XOc&ggIba^2F%&1n20v& z7rgJeu*FLfI0yLT;67UH1sBN57e_jlfs`)T-F+jh+dF-j#gs1H5Mwbz{U+!`R$84O zRe82dEBXN1pmC+ip5fw{fdU6>M5?af)4vSPp3CIT>r3>j>M#!@-j3g2B@1b-0 zvBi7=Hh&k}=ODSuzO%y;r;Pxl%+_oiAg=l#gCvl`(P1JtDjKetqMxj z-FHyYo*a}0BUVHKNVU}=@zh;K z7`c-r9LmLgT9X%t#yyQ_*63#EG(mIP7g*`++Jcg0Kx_2MJ%jV0xqySvzqs= zmEx<~Ca|$|$^jtR7S>Cw381=_+futs1HC<%jLg1$M6>aCIIYwZc(8)!-hUmt+VIgI`|%rN z62qo8F742k$x^y~ov1)Y){v{yqlZN00e~?RZbDX1iE%bMwGg;NWkUzA6$OY0EY{hn zfM1!rZ^KLYRz9zbYGB@2f*Zcp{O;P%rD$drjW8w7_vM;(TCEXd(}^F;51~NhNv(EH zUlIt)R#ff{l*8T_*~wt7U8hpGRwPgXVI^J=-+d)rlYInPB#Sp~{8$`ESq02EmyaE^ zJnh7cXW5i!`!uQYiY`Rj26peK^e%($WPAJuG^AYpKzqh96R5OKOX9axqI`MG+`6n1^q=vJg*_jiynr^eR9{8Lop@_#w$lWose6~9$ zuPLXXIwwF1ru+f(%mX^a^t!{Z2>ijU2MZI)Wyi#IibqryjsVIqr14hjxqtEQx==By z-w3MxNe^VEiP(gmVqUP}<3dx}7O&UP=`H$x&~~ zQAW5@x@;`bS7kbuvGepL+tK0u?XnZ|4XiY_?&Mx3&^lM!q1Y=OLbQy21m{JOHazxq zQxyTtLEthN$}-jC>Y*~)(Jmzem+5Ay$BYf%wppC{B9#(|FB<6XLahek@z&jIflhz7 zF%>8918R>zz{1eE1-71$G(f*YM&RNA*#a5f(BHh=Q|Qzz`%ClrV&4*V)fX^p1RWmJ z%QyU3YD42p2|t)}@Fc&L-kYFar)0T9&$sip1UzxsQth4D)d+HEj)@q z$cn0ryyEAZ&*ulnX9VtT2UAO&Fq`1nZ_h0x$(#g#avyBPMnc-TVu|{!#JA^603@Y! zf;w-&&`?f)=bCN^aEa;aEkPY8Ets{*+e+Gz$V$qxkF&gE)fttmOCPGCX(IerO5U0k zgmUs7+=Rd`&>j`}@L*-5{6}@lj=3wyS_WdV7+2)9Qk$9CDPJ*HJLu0RCp|;Kw(2hvA%H z317tqi=|Z@2*HO;d%?wVAc{ig5@;k~>`Yq{SGB%#C(v)8Uc(Wn9igr)^%q!aX{ZC# z0E0^h#lqcmiAD;4kmL@1JTRwdDbO&T?>DKaQ)VhXMB**c-mHvB?EjH8MC zCov1)5UZfG=;$n7&LGPGaGKZ%H5z6qT#%Jo*e`85#na7 ztKC+mK_A5quzCTuEI$}#IFef!mcW{84AuX$M|`T>k}A9xH|a{S=Y#J#xuoB0-=I<- zlPE{eHx{|azD9M<=-&859Stfz#>JMIpj4W-5@iQkZ}Tbzz8-*A47u3Cl_6+gV;cJt z1Qaav6-Pm^R=ELoe)1wPKTnz(x$v&WFZ>uFX68x{PkPuA>dB;~EM4zNxbzl)TJ~=- zLkIcmcFV;~!IQ%K7$vR68O~SHy>8p^lkWb887QgxKu;4-A5s0&p2YY2J~g*pl$T}F z>M&jOIDRBmZ*=qrb;(Z-R`=P@8Kmo3@gowV;&5`74!=jhGi}Y%ILJ2tHxP%S7$?3#D@hRf1=7W{K z>14P5vn=Z??s50Z5@kqMC@aT$?7#usj(hPCK7=RmX?zjS;>EQ+TiECnfUkw~Y?&7w zv++K=Ep7zknF!ubgWDzGn;-HMVJXI@zgdkY(bLs6+(J(D?77*!UGExrm8~fnq!`j3 zYo)BFXm3knw5dNy^BA&`a0^W@OlFuRSA1l-O7n3&uQD3=x4exi8>lcJQ_Ab(^VE;2 ztiQBss21dPS}WJ&gwl{0OjHM&6qnyl9oB!0;&%a3fP8UlOBq5mXpki$Y!Z$zwFUMmMW z?3Q@#X;4u30M7DydB4Lsn{6Jte-+|f=BGkwD$u9Wv6y$Ij8Zu3rxu=xeo9&2Jk~GV zvuLfCmJYvz^+>~_!jOI>TBJDp%CA^mJ$2WfwmKV_NW1A85_GF<16SzkVoIIUe+d(p zgcUeGv#_zd#hxe*gqBw$DHxV1mUKumMa=hvUPZ~@BP!B{ROL+DB9;Q-e~w?1n+|~< z$yJnzVK*@$-?_ST0W=AEDMt6rY}`b%xT>f@=8Ff}m#fr>VW3_}9 zXVte&zhkwK@0$8ECUV^OF#q%3k(jYrXqxEh(v-rq zhVXJqozRTA!062s%lkjjNUXYk9$cn_H>)?w7&*`{yf%2FD0C}(bc09#adtR%a6 zbvYoH-Q|Z)qnI&Yo3{ejSs{WGE+=hM+(RC!n10@^9Tj1_?;D6;oPtw;-gIW#gE@-y zz6^PNqu07cnyD)F8C!c?TcUl5_1?*9ph*6Dn9*Ojix?UZo7)NgHi(4&I<+w%@WY-;Tk??;h4m zbm3u~)few9TVoU_oH8$JuIvsF>IZ66c@}t45%*w#3NR;~cdLA@B+Cg#@CN`YbDVB7 zYt5|@=90xbi7M_&YjZz+%c?vFjL{q2LkD(G8Opc`Nt)c@qB7Au4PG}N)X z9tbu=s@S2pWpG+p0fLv%?7skCSaoy!49foSv%9HgK^Sh>+d)#3N1`WD|F%FP2cL~) zcN&ri`cPYXF+dJ{3UwHg^TY?hFt$>|EZa*B1WZ0OBeZ{?;ha~{q4=fr&y9oHNS zCL7H2!D4`=4Rjzo5lkcvv-Y%J+7YnUHZ`eY#cY|>JkQ^EYxtWQV@1@d$<#yI-;#{w#r7|*L1K*pVg3XjgJ zEXv;tCRIa~u(>GCkY&ZK#W%~2K;8wniLS}#s63I3GgI2db%NKu!sLEzwNNv)8?N`| zr@&Hxcbc@UdeV1_OO5FpZ&xaQ7!YJt^m1U^uoq*Tqf%{t0j$469LcCn;(yw)2NtnB z-58;>JkuRRkxvhLLZ)88V4;ySE{5@D>Xa7zLM^&^$JDt2(?gZNN0E_F*S8DR4;Y-L zXeqm5Ap5$dp}0n#9|ySuQ8WLIh~-^EH50f;YmlyW+jW-#dU{+YQYekyQ4*@X6`g<` zPOeJTKOvC@faVUPXK?MEdKm!s6-@w}OKS#d*;RvlnbTs8iCn;z16nwk&xNjXUpw=T zgTdI*>Mq9cJ%*i6!yB*p7v?Y|uCP}qdw6*{>*sEiS{COxGc`}3PBQ(xucaBBPy)F( z{T}_9z_4X(EozepReg~-oZB5e7Tj$@R&X_k(dKn~@*zT+# zpX|urjUKYz#s%4OG$yRFEA0a<+35`r@8||#QQCIN|K~Pme_gbhXug%2tU z$(tOi_f8)hN0rU~cK4;}5Y$FG9{gPn#u+el#Qcn39U{I&%W(xP5O8=4Vn|2EN8j8y z|CPSIdm)h&Ig!2tCSe+z>n~1{jrpv}lLc#7`2CbUopAaJ)UT;^ikpVU%l~GbifT3$ynoPy|lDt~(7Dj;7CpuZ&H(&b;5Xgj1OA@9W9T zlS1-NQ!hpXYk&7ggm27lv^}vt{X@*O*A1V8F;74e5lN?+`{c0#EUayPY81Cr-E>KL zpZeFb-1}!tY!b}jcS1*4mwsh~7~!jG#{0#0{mWk!>)(2Qg-IRh`Pp<_R?Pf(VKa#d z-xliQ^M~J}DhvR>SWVn9D>Ljy^ix%B=Tx=O0M6>Yc$DguVs#e3nm+%;n*5*(S4%}% z_O5J{AEN`lCpK`Tizf`#;LkdhYi^+W3T^}=3>$ZKHorOkGSP8AeRC)ei zChmtTe&A?voQ|ic+MrVYgUMoUPIlS6J0JGWHap?R`08)ziO??yP4LVNQ}@}NSyPs6VFR9pbn|$An-CcntbIxv$X+<6lyZy zy(@eDz01daOQ*kxHn}t*cA71qxzWxq^!d_|HTy4&EH;Wc3grKv`eTsufEEYS!nF)T z5-I4&Wi>4fa?$k6$b4zRaR_LrzUDf~+Qhx`zH0||>~hsqQGMm!Uh`!=x(oY2e;u@@ zW-bSp;1(z(iVL)^A~k83UXKj1CbF3iaHS8J_d)D9@e&|Jgcw&O$dRW6;u;F0Mu#CC zW~@1IL3jkfix0ni=NEtZe}~g$b!yTcYX-M=8-4+pn-Ui6Q74XMGRPvIVhCqU*9=Wp z?Q={(IY~{lm(jm9yceyoW0$Q(*?Q9byKfJBIi1<7`<ctX{c% z89nyMLk~W%a6xW5Jrm`c!_`9!-irYrlG>8ZoCCruZh|Sn!mw%tgt&nyEOn~^Q${qS z+kli2z36XXL(ep0lGu^5FpCujGEPEyQz#bigjVIQxN3uT9cpy>n7TIV`GL^|+SF+D z*>>Cgv`@QVt7ozyB^h*EoX4I~88Id~|7#4MwD6ovwt%(juv3>_`__QfARZW}43!9I z)EuP2(Ia*k@v1S?e#xiP1h2tM0TURhH0ERvs!7waB~2VG(W%{NPVbA_*PiB7;&O&N zeBxd2x#L^k`k$hr|F6GWH?4jLYJbz6+)Z;GD2cxgv`PDF9i@|FM9a8ZqPvt!)zc(M zjV&y;`OJf9tR|Ibs;QMDxE-Z~FLZK~Z`Li=K8zx_nMDDiI&;iXZ;{0sEU`qBhdiWN zk?PcG(VzjNNfTnT%~)G)(`ttu+U>DVhXW2+=di=pQ&Q@3%rV_gI&Fiq&gygC1^q5- zvr)TtHk~?c*5j5f?znHrLr?56WXJ&{M%`n=1i_Rk_j>KMgWh@XJ|BE=zt6rn?3?e# z{PN2YfBkiI{kIzN0lWbNlLsO69b?GBi)4Jwl8bUhybSa573X?;>-5&~c*|~$_WMft zvwkCfsw4qGzaTVk;(quGdEl&Pf1^wDK8D?W$+NZi%z!>NNa*xz%c6m}Hbi%VG;H}& zs#b;dBB(qvFx28ISR10lY&j)ou$W#&Oiam~xgE|@zc~?+yC4jABIcr~6|i9-8g5YV z;VkpY#=?PY#6Z16fmcC>q0w(+IOJ0{NYWWmE6Qy-^(Ls|OhBI~7vM1{N*-@$0<7m# zEo~KAU-jqz-Q4M0%^iQ<1T}h5wdn8^5(o^2x&(mE*by0U;=>Ao3G@a)tHYK6m|)RK zSgUs>FOJgM9C2fC1`J3K?Cm9cdCh1w-~(d9vHtj9cymI9Uw}HAR3b2Z)U>iZ4%cOV z6A%s9G*4BAnMdWhgat#HtBvpJ05fJFlE)5#98Dx#=poHkt#f^K8<*h0!tluRoNNpm zamFYOslW}jP;?B0$uKwvAwskOO|}h=3f=%Wh`jglTYZsL5hD=&RpduFj(6Myrx;+0 zPW9|+d&oQ24XYtZ!%Ve;^V`!shS-R6Cx}Z(4@mKR={oG7;>gsSf`bL+j!iU)2y{Y} z%S(FYDu6w6YGq(mgfD*EuoeeYtF+TyWO+pUV5Pi`XLvN=x!#MAIBEm6rur9$JCZOU zUX-Ks>dBW@k!QZD)I=ne^&q@C*wGb0X8H$-fj52ZNKsL4u$>y8$WxNOnOK2M;Oh|w zFPc?j_}jW5{vaWvviEUEmxw0|&A*ria&Ys+8$Dt$VpNK?26y7%B6HjqSef4LP@;qD zU2MG3wvSkBV+#g5+!_(czy%k~$41=N|mVJa7!hM)SZ${&=f* zbn|)kjL9yPb5QeTpXXe=?4C1%Y=T4x(h9J)EZ2fQHnJmvlRAL?o*)LM8RB(Hsps{U9cy2> z6x3KPU0<94Sir3%0(ZC)y=l*|R_tuUxDR;Z;6GA*#cPPp9_x%kD&O0?>}t^4LfJqS z20fJtN9Q;*p*A&}gkh8+b(?cu7xf%LUdde}*aDjJ-_;#1tj(N{<}ASkhe+ZUEjh^z z#7qxF9-X@2(sruG>knNY&J9%#13?!EH4F2CezOT#%z^mc4HR*k5Yqa6YA+kmrT4y} zhfuMxOAd`A9!QJR#aF8$6+ZPU-Z|(t>bmnmytaa##jhwc<_hj)E#}T$&x+QqaIb3( zF>WaYmmd%AMex?@=iF`V%wu*LB_RK_`usxlFVTp9(uRLp0*f>u%?pb$Fs5P0Sy-Xm zIVyHfiNz75nHju{^JEQGWC;(-EfYPXYE0n$j5G*pa0Rw10ss&91RuW+d?Ax2SVau& zyR5j9X1=d0WlcV6qZ@#g-O$KpLX8!Fns=jP2Okp$9A;+T<%YD=D}@T=f&7OhUKm zu_CRd@g#{(kVE_<0O8urBsm!eUqyBa{9r?5H#sUi|RJ3Xcq&d_%$(b9Q< z+K^tdS>|ia>J0;zc<&}*7C;PnL2afX5DN*ET63JO|Ai_fR4WDbwnd4 zJX9qy?=_8|O%tD1@Tp;n4Jlt^6b89`)Zj5J&@hUQFlf2gB8#}iow~g7S9GPMpqsH; zd;J8JQ!C7KA_hHo6ejsF@sKo)SSfgoot6dhRkr@#4! z5X49X!4hIY_6S?7*cx1)$S;D>TE~;XJHKtEThVAhcOwhKnFpt?Aqi9(9<|&gDFtz> z<<Z(CN zEK^vg>;_A^V*tj$=<>=F4BOsU>sY;^mo8x&h4rUia@m*Lvd<~PGt^m0P24ZpzLK}Kz1ZsNsbOLfmOA{R z$j_qQ<)IMHg=Uc#qr+A+8luf7#rmi42N9>#!QA9R7w?f$A+-r~XM5)2rMpU+l3c?o zJT2FjQi4S$;Kp>E2q@B=vnLd|LvR!lzk>*=qh zLQ5~2>NEv%!CaL4MJ~QtYsji0Q}OVbQ2Y$zjrL!R-x7@?>2kk2=>y{dH0SI=1`4W+ z#&3S*2q*WTHthJp|HBX2^Ni|Ej&oe&z_>;)Dh3K9P@MUbo`SNBU6+CZ7Z9<4G%$o%*-$`14`wG;!YQ}9bXv2w$HZ{4H@5a8vbLHH&nnWT>54x;nk#)&jaB*8V03aQ5pB4^#@50P!+50?*?Q!VeQxB zs;af0w-(#>+%gBN=m=ERV`|l;-rcOhz3LBT+f@R8R?>kG107AOts=&^GVgTFT@xzBJ-X!cm)zL!PEmklc`ph$AgXcDk|VhYSW;_W z7gT;)2a>wBV_CK^}N>CyR1a%<%*>HMh7z$N`}`= znb4N)=V7dzaq5aMFoPLrpwFg_be?pYg8h2>^K8eM(i60YD7SO!LKG?^YGJ@Y^;f^T z78RBqRnR6;9g&0tV7!tGI-*NZuTDoUTOZkxT z+OV)N)zb4jjW|MTQ*Dyc^;V|J-9z>&nqbXBTtOArJC)P2j{$#VF0;f@@25=OZ7sG%DPyptERe5 zPbf*ZlbQdf!yp232{fG^De-?Z!hP?;U&Ps&^u{T$tKC?ad31}cjdKYJ`0VK;W04c^4G)!alpYi**|$QUoossN&}AyTZh z61iUHItO8mi^+mjC=}Ciq$0;9vHHBFyPGa}gSnMSxg=tmo<#QWeLfD!NY>q0rWNfS zkAYAUr`(lbP2;kqDoeGQm;@>JGFX6Uq&ZiykN<9vgN2z$CC5SuXqLj-^} zu_7=!f!w%daP83P&R37o2|mbnb* zA_3qx2mZNm%R2sa(gBKrPKYC_Dsri@7}obl|O!?`=^^Tfifc6F8 z4Qr7fj?=dhbzei=%BIu52bW=BPBL8jh+YHROo!;jPH%Te4KDAD$F|-jA+N2qhRCv1 zeUM_8?_en)vptCRUy@GLj+>!2r~Pt2wFc116({c|kBj5CV)fqeh2h^W)41F2x#$5DxZ%`LyAI9`;|U~_H{wz@glJX51HfAE>NN`ZCw)u|NU;)B!}tgq z8x4R&4eK8#Bfval29?gsjgjIVpzh>3cnMsE^~@1 z9S5%ZdgBgSk#Za>7C?POM{viO{}uTewDnXS+DF`SU!mF zPoQ=(i>7DAR2gqM10klksn(OreDqbqTNp&n897rcUg3{b%X*{9f(`=*9m2}+cPbNn zRr&otHLo2Bv5 zF_tyj86ojA^fmQer{H&SHLN8K!yAdM&f!NUoo!fanph{s;W<|!cavUt`_-<Z>5Xc!Y8^AqR z4crp-lTXa5xlh9i5SFO$f#?DBgu!^J)@^3}4o;`ASj8SsIOE{g$Xr;C5ND-h5ZmMS2^6!OhjbnCKr z5m^~yiy`WIXUrO9!L_g&(T}>1uB>24WtDn(x3tOY2ilqr*&?C4XI3_#1}}&sAB0UJ zo13UE-uFDa+$1YO^n3Q0(eyzjR z0ao6gNP?`K7M=$t_#zT?S1^;zNz)>99Y&vCB8`H8i+mo5&+ML%6AF9b-BISPVhSxt z$s>r8l&$$x8PuSKhzj9k^2CtKX2T&xevyfk+sc9;=_{g;i7u6-T-^)NuL7S=z8uYv z?glXBvXSunnXABSojx?jT|SHJ?~;)VqKdXP{Bnh(leY>iP=7xJDv|AcxbFd_jeze; zs&{a-&DuV~FQTO-N@>2w=5^8j(pB9USz5|M1?wHKlo9nG6CCiL4p$e7S2O_F z!xK{Dz*?nhPz^1Luq+RY^=&p!cxlrhV1Kh<2bkRnh@yrhm($df6&PlL_GTo6x!@y& zv%RPd4r6*s!CDeL(T_# zo9dx~cKJ=^OI;NzP>k*nXGA?q`S}stO?-`I-Pc!y#bbMDs5rf)4ME3ldSBHG(cx7y z8apVWE>6%W)gAv=6N#$X7LgY);fOf>pIdHUEb1DO<5BED7amkP)tgRB-{GE->{BEoJ4 zqvHjp1{;Emc~yk?4HG_u7561;`h9&mMai5&oh=+^(wVTC_@#vwwj5;b=737Z$?4AQ z)0%aF#w}S3E-+Q2pib)G;ZN6@rqUh11Sr9R27l&Y#2ohW`Q(hfD~) zZ$jr{@8>>7AW2#2k8+_XUasrz&zbM~hg;`s z9Jn4{#;@eVBV>ZcUKK*at>$dv)oBfwv==L_QuB&rd3a<{Z3lFbB00iwwHUl;<<869 zb-l)Gq$6}NA_6qoccs8VNC0)K)njHiLZI9J3mJ%JkaRan3nWcMM-`}5rwi`Aq& zxhgJzD?tul@e!^^+$GxTnCHTPV@B%)b$||b@&0ov6!(s5Ub|Ex+;ItmKx`B ztOtds7<9VVLVUskK!g3hy0%X=$+82u=zw7Lp=}3d9^*s-xk26o{(0OHX&DJJ4dGjA zBlv0zdoLuJNm0&>FI#nMB5msY`o`@ZA?v1sHhmMQnhCiY3w=K|(n_WtF#Kn z2lRi7f1x7Xa~%u9Jx8|EwiY}PrKC{JZgOiDOvraQYz*an4adsnb6-q6n~zJyr9O{^F0BCg_PtTmVQ?;mfs&a3aw6)MRNG&F@D z89WTbS68Bkqj0&r?7N+HSzs?yQ&f2XVsDEOWoa$J6lj5ObQX$BFBD&Il(%j-D_5(U z(#|<}&9wDUK|xTslt|l>MDY@PKblXP79TJ-FLm$owrM z2fQ|=2sD(kQ!dj(-%|k>fh9nA3Bu8sH()HogM68-`em8wI_0oQ;e)OtLlArGQU@{% zTUi&Tgiy>wyRfmaSr$~#_B4vItlS4y`=|eF?LWNWGONrWT&nrVjh?)7n zgUs3EQyw~XA!?*sS(L}B3l%5YtU_N;)?_TwfvN*Fv3dfvk!tDVK70^ig$;v}Kznbf z%#{>mC5BBws;K05NY&g4$FSSC&W9mlq|@Xi(Q$@1v29}vzJhbXN{@EOZ5MXzbcS|V zN6o*q=f*|8iXjrv;DzA7Lu^u~np2!!GSvD%7?OKIO%in@j~L>mWCA-im_@kzt(rJEHkEGMAPpsID&s({hW! za#Fg51S7-@?gQ?4azJdz0l}QBZH*y9?C^Fs zu!+3_-H}j8_rlg%BT5`w%;)iO$kw&u> zhSj?zEf%#jhe!!6E6(7|EY1#mc9alaN^?{8ro;1R+?zy?J*C`R*S0qTK?Plc#FqJys#j9ts4$4oSE-CY_Bn=!9H%;KB#TA)~PyS!5siCb9Z+e)WeEWw7DfKcMh{F+;`J*xCR6m4_J z!jfAaH)JtOG~irXojx=d{S4t1Y}^HE0&E(1*~rk@Z?3nfC|0(w8C3R1mV-Sq!{; zzf7P2nE`MD$wp`Z#3o76;t9%}NlC@?R&#NfAh#U#o<^Qa?FEge(156Nt?TJY-B{}+ znw08EL%y5Lk#JOM`?Q^@%jX@lD(+rT&^L-BI7A(p;|Hp|vQYN)uP%N$&Y>PZk{;<(I9jwzvSXF>$Q2yKIF{D>wNH1gU7LB^Gu`l29Zj2;E=oAw`Sr zh*#9|G^^nabqz519U&@ux9MNXC-yB?FeXTf?lyv{L|mxlxqhB_^|SnG>8f591VfN2 zM0$i1U1%x9vigabKGw^+T$o3=^Ru;}8E|V1MAHDm9!BLL2j?M>EGEJ~`p6hz4}WBg zx*vO2XXM=I$Fpa1LuuDng+U0I*EL~b6DgO5@P3$|m> zJjX$mS6wtP;>bF=T*C&Hkcle3uYQ%d^Z)l$C`-=}m(2j{&fr#bv$BMeIq;CF8>(33 znQ(gPmePxPaMj&N>zxUHAqD4V-OE`tJw^5$APdqGG!9 zYQkd`(ciMM6ZR>&Am-TT^gY=Dv848_laq_lhQb@h2UBD}{!1rp^B~fyV>baFzqD`= zFNz6&nPt_4`6P>-^vT`KY1;CnbtAk^7UFe|Lm&GYg_@Ot*DZfLvDJ>-|0Eh?SRcsJ z%#u9_a!k(&#F^kmvggR-b?PhX(Mr@8RDV$bqF?aNyB?PQOgY#E^VQzFTGxV`8in_x z*cD)@7WW$lEr}KRCqe4xbz926qI=Z~(OCFm1t0}>>@1ry4K%QPxDt;=hto8UhFs`SjWO`tn-@jZKvsfs9lKTh)p)vrtU$^M*#K zifVU48F#ZuW)lNV9Ru^H`tGXMz?~O9K)Z!AuwG+(&jHClORp}@A`DzkmvA`RGC)XF z7-@4@oSV9opqwnOD^--Vj8D_1eoA5;N62}-ftlmhU8i5K+6pM`sa}q4*f^8wpo&mz zAVBuX`hApsEnnARDC2%`8FI0fr+*Z_VwkMn1Cf3(2X3i6#Elihx%Uk+jSi_MbT7MKV8`H+$@{4?@mm&Udo zYVp_s98VM(YbjZv?%^)9?>=a!SySe!R2NdO%=vcXD$PWC`y-jBWF^RRV-G8_72 zg2*8`a^P_*TrHBPWf-~QohAyTEWY`Up!p%zw6|bGv^}+YDro}{yGIfHV#6x>Wr{H> zJ=9q;2#6ZKt_R$VmH?F|{om)GWc^|VLqe^sWK1!nlmu!mrPxY!)Nb*C7D^*l2EUj8 zS7r!vLsF0fUQf2~|E$Cs%UZdu!`9=c8ZV;c$=E>~4eV z5LJGD!{eNyj%BL;m+)szL!4Q=gKJLvXprk)X+lg6eR{LlTs_Pn$6G#RvQVl?9%>5f zGMra(D&`%wAiYJMU%8LeAmmf(c!XSg+liujM9k3O8&Zf8bLW0gbdGW8ks5?(!;n`) z=X=2@Kp(uLpH-`F4zO2tU)OFQD(~eZ3r)^*d%yZq67$nGu+s4}I1QftKobyV;@jb2 zE)#WcPbp?(IeCM4A~2scc8Sc;hj+4Qr1iHlTaf`p;WiP%#csWA$dS3!sTqvEDR{z( z4b?t|j~uE)N^Fqa0=s+OsH#R}svBi8kt}Q#9iIfd+0U@@wlb0a38U+D)x(b=lI~fu zmJA1*R}@HLt#20Q6UIPq@~fdtIsF0IS}hIdYrG-K$fCyc=xaa!>`$>rRF_eF+SuB? zYMYHz_C3bK_Z4Vr*>9Qa$>cpb8_LHaU?4@9ic(?07g!tG9f5{q{3=XO=i4B@sZ?yG z5mSS}=57;KRQtDkw+qfZEVIr9)rN1s3;h!b@=xb^#fZQty`DXM8M3hHdA#<$`khLD z1H5-CE*4&5r0@mF4!H0oHCk`YacVG>3aBQz!R(_I_G)n|)}WT9#VmlGho%()-%9Xk z&!Pl#)LgV-p0`voS4*hO4Dl1N>k@Bd>5080KU#kY`&DW1UDeRwr-d6px7y@lkU3tz zn!I-9k@ao@<@<89JPMwTiA1q_o=BGH3P_i_fE3!h*Cl~@oY^@^;XcmDIgqE=4ApRg z4KH@l8h#*trJ+c|MIvYx=>e-^DcZUGbS!=y|pVIF%u*aA^?7<2BMvmO-5(Jo2O{OpwZlN{KGR?Tdpw zH>u_E$lcCq%4X~IKIs&o?xp$i_=wF}U z55B|KX3$E4-2!?T!G$S)o5;dd?se!|J#*(d>n_l6Scx6; zo>kYK9#9vW6`~%L=Z`NCVt_!#U|-%#KR(?%ACk|LuMi~|W&Ax_fKS!lXKUkJ)qdT) z#=|{dW23=$8AiDm>e%FYMMoDm;2W>2&eeK?v2J{eZ`vPqzP99tO+Rm--}ZT#@%pbg z4PFP9R|(x}L)skL)&2BAQ+v73u8PzDDhhi@{jijRym_7gqA)Cq!)k*N2mWbHm(?dw zgveBG+|QzP9tptkqetMsO5SQ*`YryYWH*!Yh|S;Ujf0r!b+!R3O|`hEKxQ~v)_=tx z+x~?hk8Tgjsil|ama4q!rQwggBUjxaXu*gKM|6*F_8^-(rX%H5vxWA*8z{jeUviAn7KoQkV$agVczVm*bZ&6 zeQcJh9*S!d26R{m@oJ-el3t38EIdNmSIp)+NrX#&jt9S#9Bp|c`~Ir4yfPl!ebG2z zow?#Z5uLjd%7et`I9;+0c<56TKIwP2w;NgYeviCdTqj*`845vv$Xmc4`Jm_~gd>@Y=N zKQaF3PNTfD)IA`L+si6`@`dIDQ`CdX{6W;SwtwZrsX@K2D2h)>dl6&KD&g7WN=cm?c6xRQ4KK2jeeSnku_*c-kX~Ra*VFQoM+q|gW zinCdgPC9)sdmJsLs)>TF@IQo>>|I(mO zwn;G@%-v#!_K$|dq=E}X6MVW5Wr}xra^Vw{IK{myJOr)ThUp-qg)jp$bNfivNwH@$ zrM(DvYOX@Ly#g9{?IS^7G8jgy$9YnksBb-_?pS%dl(8-8H8^XMc$lI$MSGcBym03+%&+;Io%7_f*u8RU-5V>!O<7}C6J&R$l2 zLAhm$?CcLhV$1ikJQ0I2{rO@vPF+{g6b~bjPJA_({UT7pS-{%BGK{EW zM_TVdPHm5oq0|HWlqurWcKy*5cs?jM^gDpYAhJ#+^MM!c#`h~wuyZ&ULv$1!b{ zSSiD*r&}3o9vM;g4P9yIS=zN*s$5rNoW;2IS!zkIAWC1Uk`SE(4fK3D%q6OZ%ML}=Cw!a;5^orv~vN0$u0n@o2 zB^k8*sYWI@C`^@w*_S>m90O5=?9ywOkUObL;UeNziJ(F8;>_U=8DNnTBE{;R44hWEJrvG6*!_z5r>>9JJ+h<>kP^>@@r8h^|&@ zxLOZ9ZB!1*+tUl5vDYqNs<$XcSP<(u~l?eW2u zmbtv^FC%V6wqKLgUJ2dGglrcmwC$cU?Fcg>9(?qETJ*Qh z;d0f5MZlo>>SarUOLe8S6QjyQ?tNGiit2f5X$9MgQOIF71R5NPQean+cD4#_&0-ZS zt2SP$U&RUx#YI^wum%$6hQf}soJ2ZN1vJ)*-MZ=lE%JSV0=T{ZTBLs+2V3h-%1ef$>Jr+mnskCyNu}t`^X}n|$uI>#l76LQ8)bwO87QrL|GsOxc^2eNa54{fgo;75vLveuFE5l*#_ey0K(# zE{;7Jx+(Qo4sZDTmtm4>D6Jz<*8#-|jS6Ebfg2J^7P7ZuqR*KJDOen|E(7csu$vuTWAJyF@Wt%ab0QBIhK`-~0%MbJ$ru%l2f)UKW=lW|#f%K7rchn@?J3^4Dc4BU9oEiqXo5Z%G(y+>alhkz{pssLWHmX+#YnuA&C4vC$c7x$H_@K;Ns}vr! zVsLBjFG$%qQ(@9AHgN@-{A`@J+V!!-A09XQz2oQ;Ex>^Mcev6mJ~VNi(|4Hhm?F;YXa zzQTk{Rvfs`;LgV>KCL?5CSsR<6+!sV?F*#GnRCd zDa;hLH;KLIG?Hm;%@KPW2skCC3GK4$)L#t47$Hbh?YVx-;{!m26N=)J10o0=^ep<8 z_hCL=U2o{766Aga1Y}cw1D>}_XCbmiILV0td#%W|`YB0-d))UmlA4tgh?OUdG(&7a z8=1~ZdyL_2bh=QkYbmX1XZfmLygViR0eygYdK3fD{SeoLz5!3$ z=15C-t-Wfwka>J#H}X4incfn4056)GQ5=+^E6Dlu<7ZDld6u6{r{+eoHq{>Zmfd#% zGTO}}l%;Z)YPguAdMtKRCl0x|U5qKS2MLAb0@%Lny?Ltd-TwD^1jd%J2ogXqEqc8r zXNcijL@AZj7?mKLDD@J>H8bfXHvF}&BpJ83E%pL9i<6?*%RX;x7Op;O`*L_CkAkZ> zR;o;AFX;U;@ za+H57)#aU8BuV}$MaL)^*V?^ydNd$LCxrOqcBkaT^aIlEzJQdvclB!RdU&JvYjVd~ zhEcuw^Z4ywM(rj}gvXJ}6DveE#Css^9Uhhs4*(05SfY+-LR4*B3gYi+JGz>mr z{s=s-Z-j-Z!xrQ0c5o~1tRscS#85G|EOpU69`P{@IGcWtVmL+x7Vepaq;i3Cm}51; z5SVh7_$Oi{3URQ0b}5r)!${etlfsrmEaWl(rk}s}yUgQu+=Cb2KTAX=@nvsiIrD&V z{>(sMGFPwqVv(g)0D@*KPBfH&Qg_fX@VTZQ@XLMf)hws?JhRyc+J7ZQB)&^aHlhGL z;>)(Z_vkicEdhGUBDu=s&W_0RjOAl39&;^GY z!6MUYuAn^Q@LUWM^Nz9x;f-IA?^ilTG2#WKmTGE?{-Pw0vgZ&K85ZKC0UWz;@ExjyAF-uH2ep59u#$hm*|n9?4I7?NiY=4}hm7OFzq z))9U?cp3YhJgT+;zBn6a63*3~v{ZQ*F{Pqe2p)ifYcx3qEEk@j{29(}q#7Rev{!5p zW;hN6A|)uE2&=R`uAv<|d)8WEfCR)*8mkPUV(~krqfx8{KM#5~VBlNDQ5|)_Kmzz3Q=I z0%N){6QNJWheFeCcj~QGcLTJ|qO(3$%GSNGjGmWn|hz zW7uov(~F4S5lKjA>|<3AS&CG*p9C;}Ha`fwwE|g3jXO<9bohwie{Pn!H}v0*+Ytto z(@EJ#OC_{k)$R1Tz!;Q5KW$+vg>fd`c=(F-u%U+a?BPQ6d0&p`G(@5HbB(A649PX*a^pFu;TTeDIEa29|bOg|7g+-##Ht*q%OcRNm;UA_@XLJSM_0l;a5t z;Nv=c)9lgo*^7W`&NYXZj`#hebA65Oc}9lCnEN2 zvTR4GmXStzKG1guL5pm%=;*S8HX{zCP@na-8mFX4g!RvQjz8#>vI!xh(4u3TZ3grc zahL3i`$Hy&{n=8}JKNVH>Lq=|Or=4lg2>aq?fdgijpx-07W-uj!WP?5G7=|lIpGR! z(%buh7-rH7y;{-Pgyu_mCr_s~YN{qMwYb|=y2;KJ{+N@abr-+1{miPm-oiilXW^rdpSuGjF zUaVrT$T{DdJt8&l;Sx_RV>$ECc>mh;)RNLuLfE(}9jdTGY!h@MN(Qrn?Ix=e$a z15FldMKZQfn4{Nh8b$Myxljm<$gll<;6YwWVTZp2-6i9doP(YRI?W;085EG<5RP>0 z(+C-{L-uC*)MN@?&P3w%)i+Gq)+-3oW@dt4h~($4&HOBVuGE@~k7f}b#3$kgA#kCT zyk*Y;gHC1tj`U>M{Rk*FDXH@71qixec2N-A!lK_?s5#{__jYjDVYGXBQoOb;idY-0 zHCCE0)ypOdQ+IC@3du{zNNnKjMWBPxfj&Pwf8=V@m@~b)3o%pGwgbvKR^&6WdnNGG6aeyYBEHlRNGN1e&7Ek35R1Ki^6iyIndw3 zZzxLA7im2|TagnXl&p7AKe4lO$p)`m&pZFkIQn^@qf;Ab1f4 zwKp#l1$5yfUqEBU?-0OC&~SpF8}{J&H6Ni6Os1{KP_W1z;u_N274wX8 z(+4O<`sb`evH-4-eb?Bz(rg9d%Pg=Zs-cjbWmK9+-WRq0Jh(Lpb)BiOQ<1_5T!@qi z$J+~dh4<`}FQEO8qa%+yE^LcOcrge{FX1+__}w>i(rP<*2O5dPQ+9_ke@e%d{cS}L z&y+&-owaajGN6~sP_5F{WTQbR?=FWK56)v07g2k1E6Mg47b`Ip%Xs(!0Tt_v&91h; zi@#}J4zIMn1;(SQ)OL4Ig#Nw}*hF5Tt5)$Y+yK*cG9ic}%UaD#c95B4~r6z){So zD0bl8fzou>XTBHd%F%Vcg9mwv0EAtFFdi!gv+1HN^;*nar` zqkV{_8XGYNur0QaqTNStX4S8@t&4gaT}0}@NNaGFC+gM!cijApvv%#r+NaDDaov~9 z=7#AveyV?#<`Bu+u{OG;T%xV4Lt7>uqD(@OtU_`^Um0v={5LUVib9G_-kY*bJ$yI@>oY}sc zTDy}YgMR$o#ruWBE;~Vk7tWXiDsIxWb>>@z)bwy}QU?+g6`f6fUbL*`z;LF1@4AoZ z=_@IA37{x`|LAJW~-JjEo(1B&AVuwRVfA?%gVHNl4<;#*Q9E zt%J^TFo7@NC+9Z5qXG~!D&z%!;W1pUyL$F$OD)ZHzHWWk{G#pM!4C%Ok&z}4CLoDF z(XZFx7aJ&=Ef>6Ywp84hJta8&YL5^>o)`(X4`++;nOBt>hpYjFmz{03T%~e%HrYHy zOLnez&un~pUGCzR%io)o9=miiy5%DsKS}ss?Ub5B!p7Ecb#~Ex-qt)UGYc6+R>SeD zfb>yF?F_%0K$7Lc#WWX$42uy_Wj@j9w7D92f!|9VZrCBmilm&VjVo4a@~%gS-JAFJ zV)MQCP3Ni+EI;Cv1PoM=xr4Ie(vo=z10EPj@6LV9X3_&cUh}X&4U^e!%8#V*XN#%S zFC8Oa%0%+fPGe`M)A_zAF5D3@wt$G2L)@9-YTb^w@B!8lvbYzIvlt&X z?H_1^H)?T=Waya@RMWx`YDP_A2! z$E4?Wz5xw0iy}0(rkJqphqdL%OGPnhQqLN<(m35jlR{ts3gt_zB{x?=e)@(wZA`-{ z0zSOz5u9QvYJ~0(f-)Ha>%rdc4$vhfv&Uk%do^3?6stWDFNbT@e$Xv+pxoomv|>tR zTAW>(|6?DBZ-LG6Qwc3lTG+hZ3ffh5YvO97AS=ysZ(BrxL%9P|MmDq~uj@#hC3k{B zfs?%&y|?`Etz-tyOIjPr9;LWNvS?ZahwUcUQa~_8l{^iEKhzWG`Q0K4lh*hVD5nv1 zOuG&&kwmeNmaRK46}2!czcylqeIb_kEeq=jmhSart_*Cp%h0JC(W--EfgJ6FcZsx* zCSFE{YnMvznEmhKZ_?D3$K--;6gn$$o=uL_A>ZvoTr0Mw&SE^c0_^69sZZ*(7FUD? zl_;-f$hxy92cLQPVCFJTIB&nZy3{{JXo)b^;;%zIvExkm*r9fN&W<*)bgYDt9sF=I ztW;Z?8L(4Cfsy36*^4f2rGgr4va@D zZPiD@PTHiAge4H~k_tajB%h8%w;^OpmGL&n;B^6hK*>fl&DHzFlVwR)$^XU&2&azNX%iWy9p@g7z5R7hBmL{Vpv|grn{-u%Y zT4S9}P~U-$=3QwMNyPbbG@h#hLjUK%Ea};SJh_By_-mP7pxR?q;+)v3T&6_ANXcBk zmYv#hb@UEYBIIe{QIr`3}AHc($FZ6b3r5Gatc$GQx_VAHk-%$n!7G zGtzO*IEayr%2?@%rSl3zv- z`ddXEe=Mt4h54TZCx1+&8nBDe*ik$!}QN~iG(L8wHALrZW!Ws{_+tlmcHq!e&7l8wpW0>N4KCJP%YoQP#v zuoep*0TWCR!P7icsnrJ>&*|=2peVG6!f$#T!5}*%4Eejd{QkgH@;}$eRoT#Tp6;&B z$AvpCj+`Fx8jY9Kul(srfo(^-{+*P@o zKbQI)_w{{!Vq4p~W%jAFV)trx1ZpUh5}x-T=kHktxgx`-s;BOY24sSz<5CtJ#1&dX z%S{Lo+J`?W4Wuz4NzNr5gCVfVqgF@>gE7K|pFlAXAUEPgEZ}(tyYV9O>V+L1iy1j0 zLtn@gel{ITG0a&TlxkNaKUWkO6d*~js7~Z~dU>rh+vQjs7?|s-sFkF_f@LKogdT{Q z&)SshjoY^`XG(dQU(paj#EA$3%OVyLW=3nPur8Rx{X~Ct`-_!6U|QhK5bF4@!_^Jy zePsIlY?lRw<9sbagvIPGhhZ?JC7B>HX904Up8X?)_dBk*Cr(99#PBE}0!Z#WhV~q<2GCwj)QV>)B33mJs_N}ERrU2g;67dz)|<^-RL^p{5U%-qdHKxn z@XV|$eo%{sh7Qp~m%4ekZuP==vUfoqp&-*)i(p7Aud$F;+g^u-^x8JFYd_nn+t@9P zzn|W={Um%gvRh7XXg+gAwV~+@tpX51Da8SMu$#dwMyo0W(=SRqWurl8Hk!$m{|~!U zRRw7AO%*;;P-r}`+zXAc>4JK1*G*1t%A_C*a}{gYmVXMvEHaFRvfF1650wwTCG6QF zR#dbE7L1Z?u^Yeh`3_aqYyn^i$FUqoREFY?7d!q9WLYb>UJVF$%#D=w^@%f~S4<9X z=;%1s(k=AAT>$e;eo@^m9UUH;Zp?1~r&t?IurllT8qD^0|JV?x!%f~_ssm%H;GvS5 z7t5w9?G8Gm=jz`5oKRCt9n6ZLQH#iR#e2psD)k{Pd zk&eqp#5W(`G+B_Ib8oWSc_k8IkN0FNmm{d1*x?CRbOCi;9^$gvQuIO`RBW(PM_`Ey>D_faF^sagdlXv%aOAc=zVtMlYZ5{83 zo;~)l2E!LX*D~>7{cpBRL_0jZz{PE$(Vy*||IFF)*FNDt1pHgs^_ZXXL43VW`vSa~ zEoYFH_jU&uZIpaJ)k8HVY+Hz1*l;um_&oc}*w~5g^nXi@W0h)M#;ZG}@kcZYs)BV1m`a&%w<*k<$%nWmHg z#&0=^X0V7o?_io2kqE9~0?Pz=`ao6Zu-oE*PM2#k&)1Q+D$bLiDIm(Adn;_1o=`Fc zJ~&|4;m2+g-Q2xx8J&i$6cS3GIxW!rD=vU$k&ED2%!|b*DUMkO?~2m4 zc6jJ#N{0!U>%GcEM3Zk0e1Qu(Sd^2K0V^YFCb0Q0H`YsMHj#UirHfuj@|V z2+@Dw1kZ8Mr*Bz#Vf6a-(S?5x>xS+POrqP4lHq2vWo(=r!(tvEyUYdj7-RGtAVH?x zPB#jRO$hms7#12@X3G%D3q?XedOgMAS8|xh%LBY9(nfvD3K8(BAa?OQaUZmB%O^Y*8xv%H+t~bU%fQ&Ak?`o-Pkh5 z^WI%MNBAHgZ!fI|o&c}QWw-ZWrxW)K4+G!dr=cci0fAxs__OHgzCOt976kZqV1Pot z6!X}LZ5YzV?mHwf!wAO+0Uo*-5qJ3sLUqGp*ruIZV3_b-1I;P`AazW2g3;y0sPFkA zVUZxZQf~d!~YnEtgOJk3Z? zNU?NMO8kBz8-nx(9+XZ)g3m&4V`F;t{Qq`fuz zu1$lxW_F)j;dvC^9@((u*Qb9;C(^3|_aB$Nc5SwA@@#R26m(~tkzak_mO^D;pLptY zKn^-7U5Zx7b59s&QF2=8_3%PzX8nLM)IPDu{Km!kW!T-9xTbCY{lli|UcmC;vdM`F<`ihT~ zJW>SKIR)qb`4BJd8pz(P*>zgU)r_w6Iq%5Hmk7ln6)pG7-12q!9(Wh@pnKfXF{vOu zA@zV07{IM--S=?gXp)^sz^2Fyp&iLmlQh{OeIcnsnz2J5mFpe=Z3@L*J<7%L##O%5 zSt^!ZC|$s%GmEgLvL5ZJsBm#(t|He!yr{7v7oX`qgL7eS(7Dr&Yo0FlvX~IE?vg1t zRXx&Fbz@8?#!NoZP>twhjGc^el?)WLI?PNXJ4_H0G81Z{vFRnW zkKro$PZQt`Sq8;R=Mbg9IM%bH4l2mhSQDBlD9Edfi7qP}vJH|C8?FL2(NAgpk(3*` zslL=mK{EdeVbmkb6Rc!RRN3_4GsVkECS;P+{=w<8C?gyOLrTa*5}Y7hTJ|YPB!7#~ zF62frX)*|62>uEo!YAHT-NSOHWhPo?5vql}O;MTysdAF&F;g zZ~iz*Av&C}n9rO6(IUqZzgx75R`=snTo*_KpGVfF2s~$+IQ9?>=|r|$<_;YE?&~it zAphr3>HjU?KJ$z?c^@XS5t%3IZ}3`aZ0FFBiqvOHf;f3wrLqxODwtf5B)|9rjm7W{FbZNX~$H|jBzK#+zCNsn+xd?l`KDCPWy}W;an@a6e zrStwa-|AqUDqK$^Ib6rf?@OC($kz6<rV zs#tmQC8f@%TSBgf6bePC!r3W)!!c6|wPpUpS%>{IbBz~8IPO?jw9Mgs)q6qnh^D`Y zFbteoYkpxidAw&ldG^`$uXmCY_*hN(V2h?AQJvKqj#m$V{I0Vw$bm>Uwj=PsmvF3)4^Q=_v1`#4VqC%Nga3Lhx3Y zJhCl!bAwwD0SD&(sV`;LPy+RMZUc(lqV*>Mh=^tD^79Yt&a%VZyzq2u#)7Q&`LS>x zrRgDe%HW_Gv)GItempV+emsP|tv&O@oC5T+rI!6(<*zmEwZh(9hd@%a{F9w8^57?O z5ce`~c-=R*Z@;ru%;4AG+x!rt$!QJmc3&Wi7x99d2E(P|gs1h&FxVQe>}ksG5LIS{ zLUI2&&54u~Fk^q%FSJ_{NWo-wyL7Ak&tQ1pEB`?%{o!m$AjcxwLnHP{{yBRVABt|4 zvY;qizP;yH^lJ|^R1P#W3=kQS(iZ%Un>QO83K~J;nJs4qbnMVlw;4#eV~c0E(@Rhc z7!eq27qDQT$1H|RakqP7&u#~@&4M^qlwV6(rwHdvia2ZY>Ca5c=Bxj$czi@uMP;fI z&%geM#;O&_sNxU*Ta6AU>GcK6J%*CvhvSlptE@q!fRy==c*p8xH;bM|s+7om=x^VH zHh)M2@^0*ApABQb6acOIWV>Yu%L0JzdfRm!t7YQ`3J2mszLiHJ3NSkb*<#P(n)m2J z7M*0Not>?#{k1fIeZ@ajRK*~vAwUr!B#Cdb2gxLGHP&(u@<6Z~Bl63o9krWJw%Tny z&{qa;aH4QT&zG};J8|gRfsHKHzkHzeIIxzu$=-RB_$V=pVL(G7-U_x$6g^?&*HWfs z4x9-2BI%?=L>SGhGh_G=o;`jW7hxBG}h9M_JG)r4K<|7?cB1xS)YKG{K9+!mBVMhpO+og!b>WM#x z@%uwi_{&ZvL%gLo?}cyj8lz=PB)s+pA9{2^lVY?h}HEd@ge zOtz8`QSP?rSq1YSGolyhKn{Um0%pg~#>UkaWXTw59LWe3&-ihu!|`YO(H_-?qru&_N34F zT6A#?S{@XUobTJj+B!|rL{nEQUf3pYY8tpG9(eS)0rY=|y|0PJd51qlybC+1=y${v z0t&RDEzG@Y;Ja}20q>Tr7rnZ(4?*)t=+{5>qLo%>TV5IOm{!j4-w-g+EWPN! z0$%iYJRvQMvHVN=MkHciME_-pDU+U%z*`Os*TG^}l-rryJAK7MdCw_1m@zA&1(i=7YA}9CpScjq$6>J|s3Y zhK1~4`QJl)`%IW0Mg?T;&|djOgyB6@i?LCDbP z-Cz^m@`~60@J85&DEs+@8#*m|w+aX}K_)m?@C@QcE+PUl7YeQ-l=!BH#tc$vkAQ(h zWi_;n#x;l*k=%vC3ST7$iPEv)Em-B~_vn^p9nx*>?fqf#{V;iJ!u$fnIYGsXpzq?3 zKAM$NI7@;m3pSGS^Jd=dFE*f<`ntI{q)q?#b0WiMcB1INZ7exa!?Va>>X$(p>K0*^ zpB9nGzig<25vQl&m9CI4awe#odhTZKDnwz%lQa^iB%RY4yFcc}cIHUOrH;^vdW7HG zv%$rQ2{aL76TIWCjU4=Yp%^Cnp~}I$q5cH}1I84H!_cpH+pdvy&c6DQk@_XNPSnWL zz+R&$P=rk5KFN6SOt{Ag?r6%WOp!RT74sku<3~2CJm^L(-jqL#MpsQs!iYj>4V~?w z%}6Glj4TxQ5}=`p-w7dKTN)cb>N`Ff)FUvOt=vN=;wDEAk1Hqr{>kvLEvrVy;>Ys6 zS9g#6>t7?geO{>Rc9pfD#(Fh!bhY1)j3-ZmT5Zgfjfi`qq0tv)Iue1ke;y0fAS zaE2%qnIf;-V>sl=Y#w|iHsET8u34@m%9v#ZL_cY~y(j>m*7+2`8>YoSNr51ItK2^) za$<8IY6zmpm&e4!!ic)9+r+7T7cU+j9qixs`s*Owel1uQm!Yh%%DnCuJ=5}+bw}?O zS>Mfi*IIP<=(@kOFz1^jnRDZ{YRSKVAbiCjl~4z$HmD@M#A;PmefhWdbv!tYFk%d>$TAMS;glHGx?bmi1;SGL-@ua{&1MWaBlx=E5wClj)FOw2*V>CRA(DVFH9>UB;8yNM=GB*0>Tb2&(ye?++`q0a zSi0xH0dev~W2315tKI6BK<`dIp6F>AJLMku=-P+v$0jF5qiRT!UURD14AIgzX`ZJA z+D~YfhC!(Q*$%ge(U=>eCp5{DzZ!>vtLm%4SGhC6*^b*fzasOZ!*5;5)t}h7&S5Hx z&I&xj$u22YJr|iW)2k>;IPpssogE}$nDGmg-^&t!v|zjVX(6nge(Xey0f0ydnlbaU zsG^J@_`zuzn3+|W#sDV6dLh~>lc!N6rsd}xi={cT zZC-?`n4~!ocqti1KmfEzxE9X~-bq!=9LjSWbYE^D@=E5{2Ju&hYCdEL%=$oU2(>Ox z{Cbh_L*_&xWGOXr$N{lAJ|G^GZUG6xT!$19in%3=QqHo#`o0{X^Mf9kA#r`3RYYEW%$lOViEXR|~u7`2x*{n#b_r zlmH)qgz5cB4OhR-pLvwYFA#U{R@c$_dmnui5|t=Qy~LMJYR08up4*hV4+i>=HcTo{ z3=Uq~R#P%K77<>Rvqf_Y#yzxhr8wGdh@vLbtd?F+B4p*Z= zl(X$HpEGEHM5!2&8wu%!d46lMTnr-;>fJRVDf+Sd!D1NO-GPCfbV-$%P0tMoqzTMF zH`Ibr$!>j3jk!iIc;YRbLI%QhsPcn3Qh;z|$z;l;_#~LJElvz5ra;1G*;b;U<+gNx zA)S#jOo3RfOF^@=0)=2W6#|fHr*oFmC&0S-fHc@65IA}cAzbDhFr+1P(`S>L$Vnpt zR_eg-;HCzVqB+Q_DrLjjV7U?9SB!F2|GXJIGR&Y+Ste~t+==i__9Ixp6t*{E2%`;$ zKRf}3lfdYG22J-nc|dic^nxm2{aQvGR!(f;pdnq$i(+(sOq)H(gD2|w5%;`2yRVeN z`vF1Q;h{mh%E|M9efX0zM4mq87qd@xlc4AF@+Y0oDvCZImpUs#%( zBKaUFz|~^OphUne0s3HY=QZWB%2>%ag{7PG{y37EpYm+#3ij_`^N9hL&|=lpJ3m_M zzqqLd2P|g&B10HLyOA55W)bV3W*CN{S;ShkZWNsFx{>e(=sM5C*zd{cCPPJ_yyI4b*z96WaH0S-GB-1;0eJ77-#JOxxC7i%P zT?XMCNV!&ets0Y4eEHy_2YUqZ8)DCie42K13fgA>>N#mvd6@0&cEy3X$bD*=(J1C6 zv>IJ5k6YD7J&+Wh%-63(8RZdThau70TLU9{2(qeX1(>znq@|NwzjRzmJ7Qew=WiCE zTY1L?+oBCXV^$8fp38A4M2trEIu>E3A-JJ4?Iz5k%{T9gh&@y_-84&?wv zJskqb}d4$Sya3XR>5x7Ou6xAg--3p?cipxSu&S7CLE(tn$?o z=z#~kTer-3r8U{F7Kk)q3C(d&Oefk;o7C!AA4NuXb=mZ9cUc8hHAzXRdo3%k`2x~3 zh*BMD;a-s&|HR!**<*vSA}Au6apRfD?9+-bKV>4#S^06%EW5*ANsL&7zG$}_h=BY% z7$Oim4S_}Hk>g}2oD{lQH}Qw9LJ)yS5%pZbb5V+ZQ8TGI!G|)mr>G9Hd^3s2ZB+q6 z^=DF>4dde*aO3uE4Y;(GEyX&Y4l9Y07I~s>NT5;wLwFyu4cT*FDbIO!m#**nHkmle zVc@oa0K>O*{lFUOgGcc2ev-*Z$0 ztgvzW+L7Oz&x0*%!){!=Wti6}%ToKu2Oj{oM(3aw_JU}Jh=v7>@F~zPz_d(tsNGlV zw*)~r>rIr~iV4Qr74X4|1xAs=uYA39QrRdQ#*2!FZ_VU2S|DDJ44wUHp4&jN6!a&C zXc2w{KIBM8!Xmp!5xE%1)v?Geb~++dc{QmjGa!DJ#tW1P513cDz+y+Fjd^N_2c{>= z*e+I0SRyVEac%uEFD{#aafrXdQh4>zBtHo~{(YQvUWK>-n2ek{r}OJ>>wLOvCaFng(wGKrX-=e! z%A}(ySrw82Nxr0C@|uK%@vH<0!6-+)g_R;*r(9SCq>x`#KpIyk+kxJ`0_NKha^pQL%x9F5s8<6m}O1LlAQnpoz$h5~DK6B|>>>R|;IoO)cg3?;SOuIqmQ4*za5la~B z9W=QakS|Z=#O6m};It^as9V^#E`&~V_k*6|_f3XD6DKs#uvAIwWuf%1@n+l^*+to$ z?0=!_{Y+n%=cG+TXvj#H`Sz$+d-c$SMV3yp^Xo7$2r$P^2W(Og|34eOefbTuw0 zbe#S|r5ZH>Fuqsh>KZS0Bv6d*xX{oTKt%L0R|sClX;G@em_jDw)1H|VQSmYz+_?Wg zAs>ap(p4X5r1aum!pD650wyJ>1v`?QUj!(f>m269-*h=pW!iTd<%_^I2I`^Y({`U#dRi zvi&(&>5Ozz@H2!EyBF{<4RmB7G^`;q^443T6T%lk z(su|Flb%%E~#HnIlvtO$}{870{b=P*`^vWoWy5*2LFGdct z_MhpPlE=jUQ!j<>XJ99_GRH%Zt29dQ3>r1>ts4302MS+Fp9j9eD#uUw{g^`>ru}{U zM9ugRozy5#;vgtZkulAQX)gPDXyy>17~3nZ=9+FqSgUw*FeY-5##BM;0rFr4Ifx^} zDNH&E1PykQV1}9RB?Ql-pgB*z%qQ&i5rgI+g>D9=EFXb|^ZEP1AZlW-#3dRSNGeO~ z-%@I|3a2p`B~8kDoyp1^Q@1hvnb`l>u)ViRcT1NV!DZ6FFjy!{Kl{Un$H3_vb2{t) zb%W(AD@DKt0(ica$Q)Jjb=Nm^-f-Z;XLC zC*!o<(W~fn=uc;?UiDCKD7O2R^<3`@9E>ar&*19m9CE1%d^Vd2nhQf>g+9$jmSiQHV~#n zd_RKfN<}X>$OsWB%M1*+xewD6734{H(NF}O`k$IZu#4mDqJ7!{do8|uB<5dg#+@Xt z?4r^m1x6hn%iDiBxj8SR5FPANobIkUOPDuc((i_~r|cH!EMvd(fkBtw!;4*fOmX9p z7K5pMbrcsK4gKEfR>t=`xOeKY_J`SbdTZ)jVw4vL>UMO!=FN9J?6rKKNmOQx!8hEJ zUGVXTaF*sHRo6*LZ?pQoLnpgbA8E31LZF^_b`~WEY9$P$W}B2Tr+?#L>dcZt5Ve4W zCj_t6pUw2)`~EB*t1dh1jK4=`dSYkVu`fE9Xaoc!`{%{f)fipcMdPB@=)!KsMeP1r z8o;bLdp65Mra!dTH;AomwFhVE1}g^?j*NB0ZzC&38|J6krFrwb2YL8oLnC!3{pGdH z`eQ&*6Z`f}*IH;DDXkpBxm#JffH+&$(7`(%}F^R3knla1;97I->QJE=@ zDYx+hcS1?mVoU?hseC8RGiFxH&mx3ptxwh6-HjDKi+sOV6wT5xsaa$a&ulnlgHNAQ ztut5_*uYNUN1o12>-Uxy40?H)!iFAw-tbdTRoD2fn)|C>QC$3seT6?GT*x$@=~{tF zDAcv0G{cgwgsGNP=;ZMjI3Sjg)QDfLJ-s5c})xBixFBpv#yTM2o*|M#}xUaXxlvDxMu>{)HZER zW@&@Jw$ajO-JiN%ou@rBR)8#k=)l@dO7Wg;+Zquc8We(9h+i|@c2tE6&UTcQNyS7I zR;6Ny@wI2Wlyv)Fv2#d+DEaKIXN)*S-NqTqR&4hu)E8 zPf^pm4a{zg5TNnjHv(m`P{kjq!tz>M>+n)FNP}Q%Q3Kxa$AZ1Bt?TD+Gr6b~EO~J2 zbZmjJJU0af_vsXftSKd1;Ui5XGvMs)x)do5ITm{=@Ktkp5!D7 zTv0OB3A(;T;2*A%Sy@f=rLC>|+1ApPwFJiKc$rcLy)9}#ZlHxmgrivbxT9H&c0#N0 z@4uA?GoU4yJF%N#=37pTHa{m&0N#2Jjp0KMi*RHyV2e1-dv12_65m3v*F~>uYmWYV zQ*`^12}|7HqnlqA{OE7WW6Lsmka3={>%GC@YXmRz)Y?d4h_vi5bvJ7^$Ee`8@&OY5 zI)A|<;Q4%hS_CM+&(P#C+;TQ_Iqh0WK6x}D-Q3Ficq2_phS7_IP``#?yIDagZcu7k zP$RWkt!SXbxh$JDE%he478=G>Uzx$<5?C1F>^PZH>lvcLekKa)lp!@R8 zy3UgE!Xx9L*Z;_N9W-0~h(9ect^dOKw55A}clUuEzV3Pa^Qs4HfAyYSN3V}9!fP+X zsLg?Ol67ZyQ1jis;-4RV6W0a4Z*Q$^rY-p>E@wLB+Z4BQ9K#^Sj;`yavwIc!d3tKb z%)X;Fuc)G#^cw+a#qwuULl`gjJwZ2zFmnB@{%m!V`=6u_t_Ypyr?30vMqd8@S+IGt z?I{!r=XE((E$^`kR?rZytufb(tYL_PAr`R{3Sgo|FEZYl<&P)Ze13@Km~$F@d?6y_A@V`7%g==jduy{0WK z+VsxV+O5qkTjL56qazH0FWsBE^Rq#7O{l?@*JP^${b|OmI8IV@U}T6pqiN@PU3A)$ zuSt`03`#^rz54pO&iNnFgY zVtLA|rxTvkrS9l8f3Lyv=iis2<}77WtopD#)X-4*Xlk(7^xw-khL2V&Rpgymi6EfLkA z>mAM97VmX?d4QVfC10w~ZMHNc>TdSR_{x|@csfujyJDN+Q6FKL#rG!U70wX3$h#MPc3ENJx7p*K|T`r|^S(cn*S$0;!1T%pgu;dUN{TF@d z(zOV_=8Os#u24xR2x>IKu2j{%+#oH++?1bN)!X-gx^-1^wj}nj>agZ*pbb|GjII+f zIG>`{Y8W^3OX8KkPh*<9Z&sU3vRrMlc6Ot%=)yF1-*rKTzcjO67P?QGb)g`iS!1PF zs;YaLMI&DlZ-Nc#xEQOHZxR zm`sQlG0acks1^NsKs`Ti+& zy$#(<+wBg{ST_Q&M}k5A%!bkGl~;<3QP3AVEs9g(G}S;TPQfYq6goqn!MG(HfBe+c z^mGrWEzUCEhGr2-YZlLnsg5UiMZ3OY-Psv)a}+M9&>|4h@%qEr2_skc=2(hxNXVn& z&Fd0^Ak6a0la*Y5!U`4L`b#C7bj>Ry?A1qhAxqnfyE$ZTJ33UvT~1h$wJCYo0FYD~ zm{ZdXEgqIfi8TE)8FQ@&GFIo)-PZYahvUo2yyayNDKj=UvbQXy`3nlr30IqKfy%6I z`{!`jzT76kV8A%NO&}>uU!S;VPb#XH5qR|~1opY!r=GG{yjsFzN={|IxQp#fO5Q!_ zF4S1dthbS`3&b@0hX}$YtbeZkaQis$;)bUT(y`rfz9JhZE0*P+autbN>CZeLY- z8z`}KW^=Y)%5=Jy(N|R$RQ^zC;}1(*%?C6bz*t9LJcD08V%4f?`DZlwUrlg`@_%t@%iU( zJSX=Zy!DN8SJura)jZIDXfD_?GfHe7sqS&b883-LYIul2Z2zzW=vBT7p0SB$wIOw*$ohnCwiqj zVtS-bcg7{rB?ey<5Tih;>la0&KW34iPOH>}BYzj{`H2dTrm4m)GpEgdGLCb90&gjkcw z#9nGClI=iLgnI&7eURDHqF3`@!7+|d+!&04#wUB%;7rPl!{L)I*NjY^EiIdYRk;2Vhyik2=1$#jCLoMUti9Th# zn@AXmouhC8R=J=(cYiJj5`h>PO27gUJOYK~94qJKB4#m( zG3$GqGL|yRW6*uD==3otkreBPO103l@~F(|N-Q}aLnjuWj}7ieM2w2PP@G7|oG($} zQbib6B!7X#z+Z>jeJ7w%+ zZkx*Uj1mO+rul;p>%(zAZT_rVIp0KM7>yO3k>(Y!Brq~| zY-3L0tL6s$ZhEQd9@By`yP>ghuHO2mepl6%!TH_)g`LnGn3CX)-4S zP5w{xS#3q)Q;`D#kJ{w_nodA4{e~i4W{UWQfS;PV_FffA2zzPqhuGl6yv#mS)zw{% zUN#V`Q;n5rL+XNds6!hAZ>Vn}o1mMrs4Y~t+Lq-lx~P%5Axv1soa% zH@9+}Yx5tk7zF8pw}pIjX=`igs+#83^0<~XYy;#+h;k-mUqjMDq*iNN+x~s+tyXU4(brA9%JVRRLl!DliL7YgSp|!DGf|WV zQ!^3!5wVECahlrQ9BJbNo)?UwIsa&2jh2;`c}45@hVKQC@o*eSV2HS6TJy*sN?=ol z!pm~R0A3yl$}ye!j3Lieab(_u5mx1q{dxd5m;PQszigz@1s&rz) zXe0$D_C{RNecD-7tmT}SXo`m+_ph;9VYfZI@+$%|!)sn|;2qZhw=bi&hKJ=AWu*|U zcko>ghC?FgHjp0=+=le-cMr3HVUY;@wxhIm40iq-zx|pSs7DrP#(v)P-bp^W8D`dh zIX~jd7oLa9Ef3Dz73!?{MRv}jKnly;oCM@%KP-<+A&8W++=_`b!x4CActTS>`&HpGOJh6>AH-Qe^6R3Of4IXqW>gMcFqrW1mc=?C;ifCW*vfG?Yn(Wrw__g14G`qkfxk8PQ@u3tSE^R8;r=lBG2@& z<>u_K6s+WsNQHJ~BrV!B0SQsTzw1!I;r+6Dh|yN%mn~{RP+PjXc;0At5G5bB15-mq zv*-{Eq!L3EgF14EV@TJt8=@;Q77Di=BP3THmp^=he%NGrW=%zcDIt66?kz1vi{B?K zON#XkqV&L!Zs#GVGlU8d#r=s*j@u705RI^n5M45 zn}`aTkIf;D@cI!tG#ykM7RW@wu9!zSvgFCqV%EhCV`Dw2Vf*$5PI_PhyS_6{c_-{rl@U zkQKFfe;Yd6+bmVEZTBh%1-BwttoG8B##B$dWsH!X3W@YQSZhU{gJAh?U+(39Ea7WP z)d@;zRD7%^H%`eHi%7sC7N)I;5@wTSu=*^AOe){nE|Zr1;BHtKalS{gf3!dHX?K!F z?9N{LlCs`p_qno-iLtbTM+qJeo}d%FkbMu?CePI;SKA#*qI3#^C3LQDm3{Bo(W8C( zUS||^*LAZ9@))kmPYRE3guymBKU2%c`+OD#IB#u&iSK2Uwr8b9#>?c4koHe>tvxYJ z3i|lHUH(SHaYdaz{y+c;LKpoz0FpsyFZyY9)~_F9Y!8Dc(*8=cA0h4gg{3j2ve%l6 z(?0*Arx>`W&ureTB+7kJb5Q}jnU9u?YGjw*(_nr}UJ3f$b=m@5#+eLsO&@IGlyto3 zzCku7YQKS~qM1Vk!36BznV-ct%beXp3$*^J;vL~Iv%qN`L5D2ctsc^7eXc|5(*W_yGjmhY zg@OgCD4Iq8;^KzxsP1mDq5dm39~}4D((F7wgf+m!Z&%90O2D8n$>xh014MtnC9Q5T zK99KYrhjC5U}^D0fJw!lSj(kG@+|`D%5Uw9zr4oLg*TxCukNu z$W6Ld(`cSn^<6l1>VlJ0n8kV-@l@q67syHTkTd&;pCSUKV! zx01y5>!%$#Z?VGo!_?H3EBd{T373j_`sXxhw^#V{&(r0VCf|k0?+Y!wT9x0g zLeCA-ED+D9iO*~R`;8(iHX?HrIP^zxp$YADhGbaI9^~eKeR7%s)g(c z^ps0ZX2NqX9=^X_AqZ6G`2EsnNl^_-n_PjGESn`zN&LcZg;&vAVq;M5g6BjObcOzr z?6PeGQdwjqHGl9{89D|`^(7ThRugsB6Vu+aR~Z6ml|-2&9n;Ks zy)(%(ANW4am^A6QlnoZs|1LilSlhV*k=Ta_|TXhS7 zQ4n0*3TS;o6?}L}MCj zj#b4JJsWaRY(xh`j=GsX%CzxzAYX;4NVR5@X>VeFT5#(d9cjN`c)<87r2Z$9wCT{u zw}}h!3%8Sd)xnXV_0)T`!aVh0ZC%h{5-%U{{kQ(2wo3v+pkO%8+Om*B3I6$b-|F30 zuC<9`Dka*qk(ZmHlSvtq5*hiJD{;ArDBSR_x7n~P)pG1zT|?HrEL9dm=E5{Ct+=Rq zHuw9Bs*I%i7Z+?4A(V|Eir54{vl?vlibadBa8xr8()o13nx<=l+L?QXSUvC_s?(7=;bK=PM%p4>P|_@|T&Vt7s8U{0IM+th zVX8z`M(#-3WZDT{3No|06cqZVqboqXA7&L9CMlkE|FsHz5&3s8#Xb)Q_ajI`DM(<6 zqb-!llcM_jD`aJ&6NTazc_+5JHZ5_|W^dvy*4}t(!1c<4Sfw$~s0<-AMW|z&@DZ_U z2OGQm)@Cm@CfCs#8=}6cRRzBQ7P0P6f3FB{wTT}tKl~rFo#`O|g0tD!v_iKnN&SFE zzN-|ZPEq6pwd&;*%_owS0CB9@P;kxcb4HQ0sSs|N16=|ofUu${Rr7YT`wVf7p)8US z&RTgW@gow;<^Xx<&oY-!R-cS+Pkk9L=)CISyD@*H=BVdob7Q09Gh5OEd5Oc)acOkO zk)1bDa6dAO%ptJjV48oi+$;ZQf{*Ol9mwUn&aS2|=}dW|Xd5Y(c-uH{yVF~!`GSlf z+8E@a`x-QkU419Qiq|ne^O4V5foy5WmUo!etP9dp%$G0o4G!BG%Nt(s@j>MsDX+bZ zmA>PLgL(vJzKA`=U}FQAo4e^jQ|g3PTT)oGa!uUx*L!jj6a98}n&& zTRpN67YM#8rv zjOKKmH|2FEs{&^}*1!Ghta#UB*b13e7gZ9N)Y#eqO{9)0wKsLapHXJ}6?JUiQTBYCh>3z_s(Gc zNWe;_or}2>+2^KVm@eTwAzUvHhoe`_EKwKi0ISX6?3&N@ohXnfdLKAC;2nFHc&P6S zc}59LlaXWkYa;R1_KIx2`lj#siWzCmX9^_l`rG-lVzFp(J^-bb8x4atRGx#U;E-3}g z&2PV5+9>h*JG9!Y>-2YaHnoP&cqNVB0t(GAgt5iE_K5GL8FJMR<1O{i6bR1~cl5H+ zClb*;t7P7so(5``a_vWsqC%E6e`7*DaReOYZ5!;qd~MH$9{W2zYBcusFm{`K?0JC| zU?vSgd#B)pT^rqkuy%?f1A^xrXl6L(iUE`Y^dgQkX1LKMoyzz+JVSQYFNL|bIx-CX zev0TtgoP?3Gb_yPWEuvBC_8Zw{4-yF<2p!v07rd2v@GjwPq^imk>OiyZHM1EJnD57 zbE1_tbW(&{2%(^cd|O!BP4wYL`u9w@u(9!_ml`o6o!QaJE3|y>TQTId;;!zlLXFcq zut^;w$&tjUoBB5em_v+J8*$KNjcqQ!S0;s(iOcFMu&W#DHOm=ZHD^|EGk#a$XLDP` z!`Xmbd9&g7q6#)4x4a^+Xzkjfys-M*^!%0&jBB7|*YCf@)G5@{>R9Jc#*j1C6e;RD z|MnZ&RX0s{0{ca4CqVs)bVd+}FEizpo!I!`GbtbU;Gve9Rin0pB}T{Hel4hUCx6E=Uu!U?c@X& zB*lbTM9Z{mf!oA954mei_;4?PVbH$8VgA1u&T)CJ<|ICA1R|Pz^Z}xPgl^FhC#l)7 z_}u~PEELoAvwEqu8APT%$U`#>uUt}WI~&eoR?rD7<;wGv0s8iKqA##mUi`20!QS4g z1XH|G`k-|8ZkRG>EyvzgEUrxEq5>RQI6C&CC+ybqXVE`YcP4gLr|2?{jIQ+<9*b$( z^prlVF87`{t~Os?<-Q;p-Ta>T-saK##~QRfYDzB?-x&Q)N3dt@sN}+nX{8Ii!+~o* z`pD}dwN~v`?U3JuOheuH1)WT*lNsXGiQBa&ht31LMaF5DX4bS*1lkvYa?braWV&{GvY9qy^ClT6O-`)g+gXjdb`|`-_I!735KjAPPX-#eSk5 zxw7Z^aMB+RGaji}-PU+M1LITD$$4*&sv_aWpRhft8>(yF$c?D0FqKDT=_u#_%Kl%D ze+<=6UEPKdkOntW9E2@bGYstBz4!nbSGNenideLZFUZ^#_K-yqWV>aHpln96tykGe z#V@^N^GC$`L9@>@VZ!Q)3Sn-Q?hy0I0NF|1SZTHT-MLChV?j}4!(e0MU_)aORd9{K zo_y)d)i3x9!IzS&QBC1NWBvCdF)PBUYGvtR9+ictrn>J^U_5!k^9SR8kT3h;uK#OF zQ~mpAS!($#GAZKw;rcTDC(wF1=f|=i55`$e0Jq1}SNxj#p(!JLpIr=^FZlCe$d9W~ zG&kW0UzOi9SKraK1yK2R!b>NPZge6!I1WZ_{n7FR*L%xA% zuxQ+&XP%V(X}l=Ut)ksdrj($se}?83l+R2fq(Hqw`V1u)cv_@YOrU7e${1Yd4Jv_> zR2MUz`INn8XnoP8@$o^avG@FWhi*JZ+@F4b7U%N`p$c~8Vq#DM8ip4vm3eH$HZ>wEjN14XkzIV zji1@s&En}jrE`%P#rL#vh_6AbIN zt{VvMM;T52iTtFuoH_0@8dKZCqF&Yb5E0d)}I{Z z?Ym;z?5(Sxc%uyuF*hFG&1Y_wXSn5{4@M6(7&omD#btDF3W|JoRJ*=4u?q7JvBi$H zh&q{^U#we19t1urF5|2mhd#QuEV2nRH>i|3i#bY3SB=kxidqMPiGjDNi48aZx0_+! zJA8P-oxpfWsP=k-iQa5Jb>(4}uBP=)^Q3%K_ylH0L4N-sgPdXLSu{(72e*^BJ7%v7 zHX!a_T{_t>1jl<}?|47qxP45nR?X>RP3De1FfbM#q>?bYIpbFt$sCgj5Y1!l*~y<5 z?*D-brHUqk%UsJE%h&`XQ>Oa@w;?S^96{B5`+f2T=1c8kUu430NhT+P8m??agpAG3 z+0US^EU;%L#1HBcFA6T}`+uruMw~cza^PXhp`Qk)fus7+57XnDL zqocJl>eMe@Q$oDS2tBA$v$n0vkNJKcclm2=p{}l+)w`M7H;Aj=`eglWJb@6Jz=l(q zjaE<&Vbmywd6EZrF^0MSe#ogHj*-BHN<6Kvdi@gEGS)WH}qx?bN@sjkYqRc zD{OmVA)skFhaZ#_k=Q{~Pe$oc9XC7Z2?)DC_3w76hC;b)r{(!*olh6N56;h|MWAZa zgt%vqXsqx)mDe!c3e&#E8Ry4^@^tUktcH8uQhS4k3gzv8YUD%4rgZ~iK8MIdq80{K>Tb0(yC<@lObDUQPJrkkI*1sowC%DQ z=p2J6umW9ZzBtXtO^SW0*sVY2TH{_mQsmm6@XmX>lFmyT%O~&z?7Y7H@;m#~P1N>; zSX)lZkEg70ttXBgAKQ`e&gj=;Z49{TkuS?6`4bwkBx@K1I)$d_YnagO(ij=)CqrsA zKGHdM$B;l!183^`=e-f%mC__QDcU+E-VXO=z#ryozp zDVf4PrF1myF=TNF%xm=-|HbLIYFT|j%|K73vbV5BDLs)kCS5f$GbO}D zmpq=@uU&EnIY?CQc_kvFPE!<0r`hjarcwUBu^`)2(Pyg24#8i^fNGm=VYiBR(kU_@vY zpW~mlta44EX-#EWgNu=k$ZW_aK&i?(=tLMh3@gJH%3S<}ja8e@RP)3RM6=!CkSk5hDBT}nclE^Rxd zBuXmC=61~EYXhJ}#ao4WXjM!NG3P-;h_gv2rJuvALN<16KZG1Sp`Z2zayQXUEh8F6 zl?pVw8cOKXD|aA=8oU~01fy-WRtFHQ`tRW~ZEojc`d!p;e<~kBx z27uz1<$-?t`D-VFYSV4?fkv-g=T9vB#_!+3>-4}{(IbH;@`xo2&nuX!08xzz3i=u9 z7c3BDLq8)9LO@fC7jcnxCUGNcO2%FL^ zOK#5G{r9UIIUS-=*K&o#T;m5Cp&23p6hYOXmJ9b$%dym^kl^_4J$#IxkggC+o0d?~ zYF_8V3V}pzF^|58kYb{1bPFAY+`R4)=geN%-sy?FC-OhfTab!taKrG(>5<_lM+WNE zQw!zTz|2@%n4FaS_+zo>#p!^48YLtq|898oVoli92q|A0(T}}8 zXr0H0vu}f7tMfOIMssOT)k+I4TdqxVl~`8xRFx)L;#4h|sFW`|eg@ zD3qb#0pxAXMpax~+=h7V*DEV4^UBJoGRKkNxl?}&h#vj(Cp)vovjX&!Qw=hILj1<~ zgpKiWu>Id!-Ssvv>&JJ-W*eN3Lyj((i>;Z()XWcpx1a-c)Te_luIth{T8>3VgN@rB*U8xt#E&e#=QY2QK3Pe_HH%?=x z_P~J*mjS!?Y5SI6x+Lz|Gs`fX2xV;c_{D{b-Z>W32|n63Onws|ygWOsN*P@mlp^>os%j9X*TIYG3A+QxCIhbS6Mj6l~{bvqhhRo!o?I7gc7;(4Y%&eMVk;RijeeN$F~Cwbpuh-wfZ~j7B-rj#PzD2b?paj4 z?aSx^6Vi9@B&@i&X)&qX;7z@JAWqMgWPe(aK*z{i8`E2phYm%?xy!zCKh`OiAusw8 z&7t*6g=N3Zp_8oGr2X$%0zU1>A!3>&^NB_-{nTQg?py9#-NK)(>)SY@uQ8pw)3=~2 z|cZ@m^|EkGBo~jbqTw=E_ay{T89Fw$>HRMWQ}HJ;F`GP z0y3yRxwTF*DOtmD1+L70tt3hX#Nb=|_v~B9AbO;ljwTx--S+Npd~m9nvVc8&kD( z&dl+x&ed?79R?AFLvMp7Vj;m}))3M?jbf+BloQvB{XqKqM4w!{ToT?z`07IUPX2l3 zxz5hom}F^k%)2A=o7&ozZM(ro1SyOdKYu-#T2%ctuKP)XMd>AouvwB5jm#KheZd50 zwbZOTT$@6N`e#@tzzK_4TWYO#N0LUgHQ7Eqj)uMq*dSy8K}akQU-(3uP{nDuP<8^e z6}CS5OZ*z1fKgy*iZJ4c?QU$O;Q`AO!Bj;WL2~5Kz}Px}4C*dUhV{$kQmVgXFFw42 zEybbbGPSx}?q?S(IHji5P!`md$+-X@S{U%-D`abSO`lK?In-+j3$o1RSSnJxH^0qL zy-NyOO;g=x&G2qK%NW5AS{qjW_ubhA1+`a?_VCJWMJxhZfd{0ff@=w8eLa!Na>tzd zm>6U12ywMuwKo_I+qGz`^O;cBqEM?T6L*o0g0$mxX~ds!Kb7le=g^TysgVK1EZgjT z6*j8Aq!Hacg2qqLpz3`EG*s@99+EdJ(UCuLMMA5Opt%VJ_fOe9io5?5^q^KfZ$cFM z?_^iT_oEF%YK6AG(ND?YI{$k}`uzo;`P9NMw}GbCwbos@0*+Z=q_sf7R1vHFTf@hJ zf(LrvRG{*#_|Hag-@Z-Geqe=t^qbS%kNhXDVzgt5zJ^?HIjpCkczjneDX$!Z8V&zL zC+_`ncdw@JG+TZS_=uu&1fyMso0?_m&4aLoQ*oJwTyWW_jC**ak)QcYx{%1hf|p)1 z!xhW#6?3J%#~(x$xzl{U!J(g^G_%D!OfAO{$hb3djN`kOV~M@mw?oZ>RS8|U{baAY zzX2Cnb_xYockOJ*8@I!uQ$anM%6zvCc6E|AES-bxzuVpyRnRcck(}=Lt#LDgyC@$A z+Z|YllCeDa0`1G=vRJ8MFHSqQUX37V2aQEcJDi~)Tu0n~L7xy1ILxJkJRzi&N&F#3 z3AX{e!OSO1kZ8vad|5x02gmOrXF!G!fT0V8k~BI+o}X}1h+F$4W*K8M8l_j5(7x$m z%u56ja&{^l&p9Z{c7SNZ^F>kCwp%*RAs9gkd%ryA&@C!3q}9{^_dYo>`Tn0^Rju%T z7}|2|-LbJh7FDP}pOVIUmPSNDL3bKy`G6lWVoB=GM+jJ835n=;EV_X;wpLC-rzF&q z4c2%OAD#^>7=oGqKp(NKYxFgwDqrlC3eMg(_eI%g%JN zs6a(4XmIXa=~}3Yni`9ebhmUW)tpMRmUHB&?)#$fLW8X#-c7<6T{90OeY#ZaFY)E9`Q=sQM>eO%k0g-3%}tBVFL3D z=;p7E9sJ%-X79e1&V7741ZlsVOj0HAByc#iDuOWI0ACbtQ)9;(#>Wj?w?eflk-`wi zBB?C5WeKNFz2ViRxdqE9gp6; zoJ1k1@|H^QCB_hB3mNcN8;A#i+thaTNyCN>j}1Th?;;J-j$LrUlyYR3bLoH1@gk zx_dDHQxqzuyL7!LA=OA)l$J>1I0nW7!!{TIRz)C-A;lah-DTQ zM8(^AWt>%<0;tZMlU_3BD|lTz@_={qmKpCNoA5|*gq+w}aq*FH+D_M>=K8?r=<|(W zHAa}xQpyI!u0A-j9Zk<)MnMMf5h-g-44>gb+_+g)0d+Qw`aiX5kKsu52jf#cPX+Ch zpKkm+_?IvBrpQv8&r_Jg1A*@oqOF_UcObF7J4F+2eSF0W7TkGQ~Td4c*B&(6F+xp|n%N{G4ihboDb~@0t4@ z9v$6e6x>A~ee`Mv$uA#GA5YhpH?K=>Nb5Y3emK3LJpP{U_t*b5YR+vcJ4Hm7UO4K$}o?+-kf2Wc^u2CI5~eHuPamIe}$WB z-);}^_hl9Y#Ic{J)7eSijjaFP@va{A<~wg?{KYp`@><4(qwWC{j~i6#8)c>)YqP=l zlRiq5K9H`-)ljz-8oy{0PuOm9@~bp$L$=wh7#Lo#T1$^DJIAW;!CgXx*n&qkaXd5o zyK485?x=m4^dc=2XHq_O5-MNMxo<1_}{d1AmYV~f~I5s@&ZEF+%v4-*LnZZ+Q z-*}^|YcStMgf+_N#p>!+<&iaQktpU54L$h4NJqbD%RB;d#?ALJI@+p*-ghOSy+A#q zP?I5)dpj05Mi`a;FU-pAtOpolIvn$}1F{+jH17d4rUl4VIj_+rXI49EEUcD#f>=$3 zq^RCPU-Lz2*3&KnR=cO=-2vD9-FyC_p_i%!;tzf|uu2D93c4YV2 znbS|YqbiieZ(WYbh`Ib$F+t0kl;u(D_T*-m`g*If1~LY+v{4Y<^rI+xg0?znyhd1h z{=ktT4-H|3Gw7O6*M=V?YVY8jJorzFXTJ?W1E zw{4^N>ABKCMyS>4j-;%J&URn?;HfL5Cq~mKd1B;WpUJX>m%LY+nmH{`wGsr zZJ{8S`j&2qNygiyt*v|8+ScUPmt31FbGVQTISQ^+`hWY4K(q?VZjl^Fk><5k3;n`~ zKrqOe38w8PEazsKYf;Qfy&lW7dFCO;4*g?1fms*CSzy*ZJ(L7zY-p5I9aZ=gfvz>w z7&;oFpsmHqU71aEgGwr#E-hzO#2_jQGy8*-4D*B7rJDVL)o`$s{~{o zv4&&zVX5Nkp3qTx*hhM@I5f^a`@YbRG$zca$Av&%l!x|!6UQu8QARmmEWEMH`dp|9<%b#k5dwb;3EtOf7Eip3a(PMp=w}tVm%uC1J zDz4ANI6e3BOHZn4-F{NMk+9m_OET8{;|G-~2B8oFdF$bLGRV_oAzskhg)$S-{aKUE z*?nF4$U8by2Da)99anIcuD;;yXuoBChsel9=;zKVb&g^%B)YxnU$652rND?n`2M1W zX4x-O$Nhf6@6Yl@2aq6qZ|NQNCDm_r;P2eIQ$0O1d2425#Ot17!w*kC9od$)u`Tj@ z=)f=I&>2c%tUnVJ`7Arv?d!6+eXef^T_C->*~LLyXXs|xwl6W9_I*M*VSAxnhgR8^ zp)~elbF&*JapyCIMN272A*3eG+YlAFnRZNCCVL6iP zQniFxLSEE<0|jtc@B=FSkmj8p4R&@6^iSSq@l-CgG^+R|l~$U=1~TX%KqY>VDua zOi?0AWQzXsfZKX_JXfxz->YYIu);J*dq?Iiw_1PCvLS;=n)S%1hn5_Jja|vGaIH7$iXFa*mWS{XE`*cspk3rLWhSA(n9KM>U$y=Oy0jWbH7uSLD| z$v{kNv!T?cyV4^0UOdS41Tqf$iWNbU)6i)^#PW)Y!LH3Kvv){O<~<1x9q7y%Xt3raZ~7?iI>x?4Ks zexHX*mL?;_ZJTfZ%1f5TjYgz9sg}c!l}OJ$^Mj9&KOdcQUr$BF7K0y^uUmJhxV)sj zey_6zNFo{ly69f%=7qnko>rtYb5e*|{%K-2X+oTs5D#!fk(^*379hmW9f6ia%|*%m zv+VifF9l6egFKYcOX*q4*F%>FE8)^hV-1Fsk(y@AGL|r-lC|4Av5E*kGMUjT-1xT_ z4t%z1mO|9*ygl*g7YD{U5381wr~>D~ONIBRn<+W->ONiaT8t0UIZMRck(G72rOsrE zy1uta6h#Pzt(k3Cz@5-@BE+FLVQN>=fQGiwJy5o?Z1JBfK93+4Z&STw+1emh{RnN} z{R+rj=xmNGw)<{wUH(c<$P=O1UN>aUk{m|HrY z-oR`+7Nb2cmAsnzwP&oXI-F{`B7B8jn6M+eIum8&H5gu9`7uq$(^`6S&#%_kL@;0Xt46>tiSTZx3`CvV8qx19#cb z2YKQq+&zx`Vzm?Qww3`SS;Za4KYQ-8zpiZAq_w}gh4)pmhgn-*1w*02P~f*6o)?r~ z_Wt_+Ej+kg$EXI?gDT86hpL}Fu>Sr2lK$e@JMQVfxYFw`|2w9s`qJ^-x{PaY_`YBG zU*b1WU6~@bZ^Q9Nc8xx!s`__a;&kbBV(fAqufCaGgX$55jO;l6+PRM|oXa~m_0My! z9dEsOE#umbpA#z1MoP{mRQwEQ`P#@j`g4&X3 zN_YuN`}S;I$RzDAmeKM5pW?`jQ&jjq%x5B;Rv*6{v0i9B9uk7nXo81o&`qy>GwLIi zMb2e{M)ZWTDmAJ9s8kZdL1R6!qw_x+Pu2uj!yvO%z4ZLay#a&NIK@x#)+UH89c8j+vEqQ`4YwD7IQmzrFCJc5zvTN&yNK}g#UTK~ z@Dqd~_GVuD=)8R%g7+tApj1_E3AwGQHe3J5h<&Du?A(ZA zs{Ibke8@x+Pq=TAJLNH~$8$#AiYEL{1(8>@@Xe<<|byUv)E zUG?VDRQ-tHOK~w5=I)hK2POZ*TFfQ1$>uVjr_6;59Ol%n(%4{(sPt5KjdY)jFAUMi z(qv+@nAfhR5iK19V#K2E5IRPu;j`9$P}PfE`4!=6?!Tv4goys!^ob3zvC`IaW}Z|@ zykddql`IPsL|la-Xw+^rUhnC}xVPt4#O>a$TfIFSdwQ>XPZ$qY+X$i3Z}bF48irZI z){V2=m}+>a)-qm3A|;b@AERka(piZ7 zH>iwzpAQ|pw3BX<9#qZ$T$lsXroqJ%yXsU2rE|X5d;tNTo*RPXq_WNDePiRdzyM+q z#;Vc)Em2kY*HKt3NsvfH#JgC^K`4|%!~x~@urZ|{J2%$VxrW!5X9{DTD$HKYqx00Y z1NFrp2IN5PrV#u$_pamRGR^wv%Ju6@S66Lc{JJuIS~N`6CcScbcii!=e|$C0a@0`x z6}MUMh#XZv#bAKjwdRX5=K>|h!$~Sp6>l%fEIJggx}eha>(*ssbJ5C}T8ErL*vJW6 z-o8F}-Fs{97B*QdufNXkT$d{Paj-^z;mh9s_`F1Fj^W%mY3%<}vEVwm3(gv@oD;d8 zYAi7urR!E0^UcXDbQ}r)@^y#Xsq<>_1e6VvC$TFljzTrub`wW zddqVW;RkbKKrI}iShbE?{v6pI9nV^<35~)>^l=ynQMjaotXBvnpQVp zRpawh94FcxZrTCKS*m9flGX9elak8lUR!YU<0a>)b5a8MF(pwaOeT!$-vtEetbtCu zp7dzm#J~PEk%rgLl$Xa07`K%zfziOotiRu)T)x7s%JA_*!KBWfJx6h&ThGx3PJu9W z?b?O0@vfT~|3nyPqcDIG;^;g=W~m^^|ED#&+0_3#8F@}E8GDfz%=^Djx{Z&HXH?4F z*ZAC+4Wkxp5%CY6A}pIN?+;WNNb^PADFg8Zckd5=?j}t3&(V^h*NT&B6-W09;QTC? z65HR4w@lu6^pUNo_vLftM2` zI}$jZCl&$VY?a2q{DGl~0SqSOWWjh58@A{f#)9b3SlKi=l7(Z05)Bp=dZV9Lzku2l z?Z5$&%TFA2l$AtV3ZjI0{1+!Hup?Q7ZmCLq!f-27gU)Jk!(ocgK6Q4mz5e{ZUCRUCNtC59t z6#?Ui6K>|@rWZ56H)6IK12_Gc>gi6c;`oXmf0t~GP+13r#AmkP4q%m5~Zc>I^U)B#?vIACEdFSM5J#$s<&P%O@Z~oYGO=H{+h)5xcCy-NlR;{E za^zY?t;#mrY_wTF9km);^~$1FX0y%Inrq0ei`pLp{dO95weM)K&IW@w+iC+iyGE~V zwmNLljfNU^gAr3AgNM3vk$x6x*4U_4O0u#wSK^dz RwK5qQOMU;>`RB?50067%5`_Q& literal 0 HcmV?d00001 diff --git a/mdl/jquery.min.js b/mdl/jquery.min.js new file mode 100644 index 0000000..76d21a4 --- /dev/null +++ b/mdl/jquery.min.js @@ -0,0 +1,6 @@ +/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license +//@ sourceMappingURL=jquery-1.10.2.min.map +*/ +(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="

      ",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
      a",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="
      t
      ",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
      ",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t +}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""],legend:[1,"
      ","
      "],area:[1,"",""],param:[1,"",""],thead:[1,"","
      "],tr:[2,"","
      "],col:[2,"","
      "],td:[3,"","
      "],_default:x.support.htmlSerialize?[0,"",""]:[1,"X
      ","
      "]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle); +u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("',"",""].join(""));return l.ie&&l.ie<8?c.removeClass("layui-hide").addClass(o):(d[0]&&d.remove(),s.call(a,m,c[0],y),c.addClass("layui-hide").after(m),a.index)},c.prototype.getContent=function(t){var e=u(t);if(e[0])return d(e[0].document.body.innerHTML)},c.prototype.getText=function(t){var i=u(t);if(i[0])return e(i[0].document.body).text()},c.prototype.setContent=function(t,i,a){var l=u(t);l[0]&&(a?e(l[0].document.body).append(i):e(l[0].document.body).html(i),layedit.sync(t))},c.prototype.sync=function(t){var i=u(t);if(i[0]){var a=e("#"+i[1].attr("textarea"));a.val(d(i[0].document.body.innerHTML))}},c.prototype.getSelection=function(t){var e=u(t);if(e[0]){var i=m(e[0].document);return document.selection?i.text:i.toString()}};var s=function(t,i,a){var l=this,n=t.find("iframe");n.css({height:a.height}).on("load",function(){var o=n.contents(),r=n.prop("contentWindow"),c=o.find("head"),s=e([""].join("")),u=o.find("body");c.append(s),u.attr("contenteditable","true").css({"min-height":a.height}).html(i.value||""),y.apply(l,[r,n,i,a]),g.call(l,r,t,a)})},u=function(t){var i=e("#LAY_layedit_"+t),a=i.prop("contentWindow");return[a,i]},d=function(t){return 8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),t},y=function(t,a,n,o){var r=t.document,c=e(r.body);c.on("keydown",function(t){var e=t.keyCode;if(13===e){var a=m(r),l=p(a),n=l.parentNode;if("pre"===n.tagName.toLowerCase()){if(t.shiftKey)return;return i.msg("请暂时用shift+enter"),!1}r.execCommand("formatBlock",!1,"

      ")}}),e(n).parents("form").on("submit",function(){var t=c.html();8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),n.value=t}),c.on("paste",function(e){r.execCommand("formatBlock",!1,"

      "),setTimeout(function(){f.call(t,c),n.value=c.html()},100)})},f=function(t){var i=this;i.document;t.find("*[style]").each(function(){var t=this.style.textAlign;this.removeAttribute("style"),e(this).css({"text-align":t||""})}),t.find("table").addClass("layui-table"),t.find("script,link").remove()},m=function(t){return t.selection?t.selection.createRange():t.getSelection().getRangeAt(0)},p=function(t){return t.endContainer||t.parentElement().childNodes[0]},v=function(t,i,a){var l=this.document,n=document.createElement(t);for(var o in i)n.setAttribute(o,i[o]);if(n.removeAttribute("text"),l.selection){var r=a.text||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.pasteHTML(e(n).prop("outerHTML")),a.select()}else{var r=a.toString()||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.deleteContents(),a.insertNode(n)}},h=function(t,i){var a=this.document,l="layedit-tool-active",n=p(m(a)),o=function(e){return t.find(".layedit-tool-"+e)};i&&i[i.hasClass(l)?"removeClass":"addClass"](l),t.find(">i").removeClass(l),o("unlink").addClass(r),e(n).parents().each(function(){var t=this.tagName.toLowerCase(),e=this.style.textAlign;"b"!==t&&"strong"!==t||o("b").addClass(l),"i"!==t&&"em"!==t||o("i").addClass(l),"u"===t&&o("u").addClass(l),"strike"===t&&o("d").addClass(l),"p"===t&&("center"===e?o("center").addClass(l):"right"===e?o("right").addClass(l):o("left").addClass(l)),"a"===t&&(o("link").addClass(l),o("unlink").removeClass(r))})},g=function(t,a,l){var n=t.document,o=e(n.body),c={link:function(i){var a=p(i),l=e(a).parent();b.call(o,{href:l.attr("href"),target:l.attr("target")},function(e){var a=l[0];"A"===a.tagName?a.href=e.url:v.call(t,"a",{target:e.target,href:e.url,text:e.url},i)})},unlink:function(t){n.execCommand("unlink")},face:function(e){x.call(this,function(i){v.call(t,"img",{src:i.src,alt:i.alt},e)})},image:function(a){var n=this;layui.use("upload",function(o){var r=l.uploadImage||{};o.render({url:r.url,method:r.type,elem:e(n).find("input")[0],done:function(e){0==e.code?(e.data=e.data||{},v.call(t,"img",{src:e.data.src,alt:e.data.title},a)):i.msg(e.msg||"上传失败")}})})},code:function(e){k.call(o,function(i){v.call(t,"pre",{text:i.code,"lay-lang":i.lang},e)})},help:function(){i.open({type:2,title:"帮助",area:["600px","380px"],shadeClose:!0,shade:.1,skin:"layui-layer-msg",content:["http://www.layui.com/about/layedit/help.html","no"]})}},s=a.find(".layui-layedit-tool"),u=function(){var i=e(this),a=i.attr("layedit-event"),l=i.attr("lay-command");if(!i.hasClass(r)){o.focus();var u=m(n);u.commonAncestorContainer;l?(n.execCommand(l),/justifyLeft|justifyCenter|justifyRight/.test(l)&&n.execCommand("formatBlock",!1,"

      "),setTimeout(function(){o.focus()},10)):c[a]&&c[a].call(this,u),h.call(t,s,i)}},d=/image/;s.find(">i").on("mousedown",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)||u.call(this)}).on("click",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)&&u.call(this)}),o.on("click",function(){h.call(t,s),i.close(x.index)})},b=function(t,e){var l=this,n=i.open({type:1,id:"LAY_layedit_link",area:"350px",shade:.05,shadeClose:!0,moveType:1,title:"超链接",skin:"layui-layer-msg",content:['

        ','
      • ','','
        ','',"
        ","
      • ",'
      • ','','
        ','",'","
        ","
      • ",'
      • ','','',"
      • ","
      "].join(""),success:function(t,n){var o="submit(layedit-link-yes)";a.render("radio"),t.find(".layui-btn-primary").on("click",function(){i.close(n),l.focus()}),a.on(o,function(t){i.close(b.index),e&&e(t.field)})}});b.index=n},x=function(t){var a=function(){var t=["[微笑]","[嘻嘻]","[哈哈]","[可爱]","[可怜]","[挖鼻]","[吃惊]","[害羞]","[挤眼]","[闭嘴]","[鄙视]","[爱你]","[泪]","[偷笑]","[亲亲]","[生病]","[太开心]","[白眼]","[右哼哼]","[左哼哼]","[嘘]","[衰]","[委屈]","[吐]","[哈欠]","[抱抱]","[怒]","[疑问]","[馋嘴]","[拜拜]","[思考]","[汗]","[困]","[睡]","[钱]","[失望]","[酷]","[色]","[哼]","[鼓掌]","[晕]","[悲伤]","[抓狂]","[黑线]","[阴险]","[怒骂]","[互粉]","[心]","[伤心]","[猪头]","[熊猫]","[兔子]","[ok]","[耶]","[good]","[NO]","[赞]","[来]","[弱]","[草泥马]","[神马]","[囧]","[浮云]","[给力]","[围观]","[威武]","[奥特曼]","[礼物]","[钟]","[话筒]","[蜡烛]","[蛋糕]"],e={};return layui.each(t,function(t,i){e[i]=layui.cache.dir+"images/face/"+t+".gif"}),e}();return x.hide=x.hide||function(t){"face"!==e(t.target).attr("layedit-event")&&i.close(x.index)},x.index=i.tips(function(){var t=[];return layui.each(a,function(e,i){t.push('
    • '+e+'
    • ')}),'
        '+t.join("")+"
      "}(),this,{tips:1,time:0,skin:"layui-box layui-util-face",maxWidth:500,success:function(l,n){l.css({marginTop:-4,marginLeft:-10}).find(".layui-clear>li").on("click",function(){t&&t({src:a[this.title],alt:this.title}),i.close(n)}),e(document).off("click",x.hide).on("click",x.hide)}})},k=function(t){var e=this,l=i.open({type:1,id:"LAY_layedit_code",area:"550px",shade:.05,shadeClose:!0,moveType:1,title:"插入代码",skin:"layui-layer-msg",content:['
        ','
      • ','','
        ','","
        ","
      • ",'
      • ','','
        ','',"
        ","
      • ",'
      • ','','',"
      • ","
      "].join(""),success:function(l,n){var o="submit(layedit-code-yes)";a.render("select"),l.find(".layui-btn-primary").on("click",function(){i.close(n),e.focus()}),a.on(o,function(e){i.close(k.index),t&&t(e.field)})}});k.index=l},C={html:'',strong:'',italic:'',underline:'',del:'',"|":'',left:'',center:'',right:'',link:'',unlink:'',face:'',image:'',code:'',help:''},w=new c;t(n,w)}); \ No newline at end of file diff --git a/static/frame/layui/lay/modules/layer.js b/static/frame/layui/lay/modules/layer.js new file mode 100644 index 0000000..a8975b9 --- /dev/null +++ b/static/frame/layui/lay/modules/layer.js @@ -0,0 +1,2 @@ +/** layui-v2.3.0 MIT License By https://www.layui.com */ + ;!function(e,t){"use strict";var i,n,a=e.layui&&layui.define,o={getPath:function(){var e=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,i=t.length-1,n=i;n>0;n--)if("interactive"===t[n].readyState){e=t[n].src;break}return e||t[i].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),config:{},end:{},minIndex:0,minLeft:[],btn:["确定","取消"],type:["dialog","page","iframe","loading","tips"],getStyle:function(t,i){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](i)},link:function(t,i,n){if(r.path){var a=document.getElementsByTagName("head")[0],s=document.createElement("link");"string"==typeof i&&(n=i);var l=(n||t).replace(/\.|\//g,""),f="layuicss-"+l,c=0;s.rel="stylesheet",s.href=r.path+t,s.id=f,document.getElementById(f)||a.appendChild(s),"function"==typeof i&&!function u(){return++c>80?e.console&&console.error("layer.css: Invalid"):void(1989===parseInt(o.getStyle(document.getElementById(f),"width"))?i():setTimeout(u,100))}()}}},r={v:"3.1.1",ie:function(){var t=navigator.userAgent.toLowerCase();return!!(e.ActiveXObject||"ActiveXObject"in e)&&((t.match(/msie\s(\d+)/)||[])[1]||"11")}(),index:e.layer&&e.layer.v?1e5:0,path:o.getPath,config:function(e,t){return e=e||{},r.cache=o.config=i.extend({},o.config,e),r.path=o.config.path||r.path,"string"==typeof e.extend&&(e.extend=[e.extend]),o.config.path&&r.ready(),e.extend?(a?layui.addcss("modules/layer/"+e.extend):o.link("theme/"+e.extend),this):this},ready:function(e){var t="layer",i="",n=(a?"modules/layer/":"theme/")+"default/layer.css?v="+r.v+i;return a?layui.addcss(n,e,t):o.link(n,e,t),this},alert:function(e,t,n){var a="function"==typeof t;return a&&(n=t),r.open(i.extend({content:e,yes:n},a?{}:t))},confirm:function(e,t,n,a){var s="function"==typeof t;return s&&(a=n,n=t),r.open(i.extend({content:e,btn:o.btn,yes:n,btn2:a},s?{}:t))},msg:function(e,n,a){var s="function"==typeof n,f=o.config.skin,c=(f?f+" "+f+"-msg":"")||"layui-layer-msg",u=l.anim.length-1;return s&&(a=n),r.open(i.extend({content:e,time:3e3,shade:!1,skin:c,title:!1,closeBtn:!1,btn:!1,resize:!1,end:a},s&&!o.config.skin?{skin:c+" layui-layer-hui",anim:u}:function(){return n=n||{},(n.icon===-1||n.icon===t&&!o.config.skin)&&(n.skin=c+" "+(n.skin||"layui-layer-hui")),n}()))},load:function(e,t){return r.open(i.extend({type:3,icon:e||0,resize:!1,shade:.01},t))},tips:function(e,t,n){return r.open(i.extend({type:4,content:[e,t],closeBtn:!1,time:3e3,shade:!1,resize:!1,fixed:!1,maxWidth:210},n))}},s=function(e){var t=this;t.index=++r.index,t.config=i.extend({},t.config,o.config,e),document.body?t.creat():setTimeout(function(){t.creat()},30)};s.pt=s.prototype;var l=["layui-layer",".layui-layer-title",".layui-layer-main",".layui-layer-dialog","layui-layer-iframe","layui-layer-content","layui-layer-btn","layui-layer-close"];l.anim=["layer-anim-00","layer-anim-01","layer-anim-02","layer-anim-03","layer-anim-04","layer-anim-05","layer-anim-06"],s.pt.config={type:0,shade:.3,fixed:!0,move:l[1],title:"信息",offset:"auto",area:"auto",closeBtn:1,time:0,zIndex:19891014,maxWidth:360,anim:0,isOutAnim:!0,icon:-1,moveType:1,resize:!0,scrollbar:!0,tips:2},s.pt.vessel=function(e,t){var n=this,a=n.index,r=n.config,s=r.zIndex+a,f="object"==typeof r.title,c=r.maxmin&&(1===r.type||2===r.type),u=r.title?'
      '+(f?r.title[0]:r.title)+"
      ":"";return r.zIndex=s,t([r.shade?'
      ':"",'
      '+(e&&2!=r.type?"":u)+'
      '+(0==r.type&&r.icon!==-1?'':"")+(1==r.type&&e?"":r.content||"")+'
      '+function(){var e=c?'':"";return r.closeBtn&&(e+=''),e}()+""+(r.btn?function(){var e="";"string"==typeof r.btn&&(r.btn=[r.btn]);for(var t=0,i=r.btn.length;t'+r.btn[t]+"";return'
      '+e+"
      "}():"")+(r.resize?'':"")+"
      "],u,i('
      ')),n},s.pt.creat=function(){var e=this,t=e.config,a=e.index,s=t.content,f="object"==typeof s,c=i("body");if(!t.id||!i("#"+t.id)[0]){switch("string"==typeof t.area&&(t.area="auto"===t.area?["",""]:[t.area,""]),t.shift&&(t.anim=t.shift),6==r.ie&&(t.fixed=!1),t.type){case 0:t.btn="btn"in t?t.btn:o.btn[0],r.closeAll("dialog");break;case 2:var s=t.content=f?t.content:[t.content||"http://layer.layui.com","auto"];t.content='';break;case 3:delete t.title,delete t.closeBtn,t.icon===-1&&0===t.icon,r.closeAll("loading");break;case 4:f||(t.content=[t.content,"body"]),t.follow=t.content[1],t.content=t.content[0]+'',delete t.title,t.tips="object"==typeof t.tips?t.tips:[t.tips,!0],t.tipsMore||r.closeAll("tips")}if(e.vessel(f,function(n,r,u){c.append(n[0]),f?function(){2==t.type||4==t.type?function(){i("body").append(n[1])}():function(){s.parents("."+l[0])[0]||(s.data("display",s.css("display")).show().addClass("layui-layer-wrap").wrap(n[1]),i("#"+l[0]+a).find("."+l[5]).before(r))}()}():c.append(n[1]),i(".layui-layer-move")[0]||c.append(o.moveElem=u),e.layero=i("#"+l[0]+a),t.scrollbar||l.html.css("overflow","hidden").attr("layer-full",a)}).auto(a),i("#layui-layer-shade"+e.index).css({"background-color":t.shade[1]||"#000",opacity:t.shade[0]||t.shade}),2==t.type&&6==r.ie&&e.layero.find("iframe").attr("src",s[0]),4==t.type?e.tips():e.offset(),t.fixed&&n.on("resize",function(){e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(a),4==t.type&&e.tips()}),t.time<=0||setTimeout(function(){r.close(e.index)},t.time),e.move().callback(),l.anim[t.anim]){var u="layer-anim "+l.anim[t.anim];e.layero.addClass(u).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){i(this).removeClass(u)})}t.isOutAnim&&e.layero.data("isOutAnim",!0)}},s.pt.auto=function(e){var t=this,a=t.config,o=i("#"+l[0]+e);""===a.area[0]&&a.maxWidth>0&&(r.ie&&r.ie<8&&a.btn&&o.width(o.innerWidth()),o.outerWidth()>a.maxWidth&&o.width(a.maxWidth));var s=[o.innerWidth(),o.innerHeight()],f=o.find(l[1]).outerHeight()||0,c=o.find("."+l[6]).outerHeight()||0,u=function(e){e=o.find(e),e.height(s[1]-f-c-2*(0|parseFloat(e.css("padding-top"))))};switch(a.type){case 2:u("iframe");break;default:""===a.area[1]?a.maxHeight>0&&o.outerHeight()>a.maxHeight?(s[1]=a.maxHeight,u("."+l[5])):a.fixed&&s[1]>=n.height()&&(s[1]=n.height(),u("."+l[5])):u("."+l[5])}return t},s.pt.offset=function(){var e=this,t=e.config,i=e.layero,a=[i.outerWidth(),i.outerHeight()],o="object"==typeof t.offset;e.offsetTop=(n.height()-a[1])/2,e.offsetLeft=(n.width()-a[0])/2,o?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=n.width()-a[0]:"b"===t.offset?e.offsetTop=n.height()-a[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=n.width()-a[0]):"rb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=n.width()-a[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?n.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?n.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=n.scrollTop(),e.offsetLeft+=n.scrollLeft()),i.attr("minLeft")&&(e.offsetTop=n.height()-(i.find(l[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},s.pt.tips=function(){var e=this,t=e.config,a=e.layero,o=[a.outerWidth(),a.outerHeight()],r=i(t.follow);r[0]||(r=i("body"));var s={width:r.outerWidth(),height:r.outerHeight(),top:r.offset().top,left:r.offset().left},f=a.find(".layui-layer-TipsG"),c=t.tips[0];t.tips[1]||f.remove(),s.autoLeft=function(){s.left+o[0]-n.width()>0?(s.tipLeft=s.left+s.width-o[0],f.css({right:12,left:"auto"})):s.tipLeft=s.left},s.where=[function(){s.autoLeft(),s.tipTop=s.top-o[1]-10,f.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left+s.width+10,s.tipTop=s.top,f.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color",t.tips[1])},function(){s.autoLeft(),s.tipTop=s.top+s.height+10,f.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left-o[0]-10,s.tipTop=s.top,f.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color",t.tips[1])}],s.where[c-1](),1===c?s.top-(n.scrollTop()+o[1]+16)<0&&s.where[2]():2===c?n.width()-(s.left+s.width+o[0]+16)>0||s.where[3]():3===c?s.top-n.scrollTop()+s.height+o[1]+16-n.height()>0&&s.where[0]():4===c&&o[0]+16-s.left>0&&s.where[1](),a.find("."+l[5]).css({"background-color":t.tips[1],"padding-right":t.closeBtn?"30px":""}),a.css({left:s.tipLeft-(t.fixed?n.scrollLeft():0),top:s.tipTop-(t.fixed?n.scrollTop():0)})},s.pt.move=function(){var e=this,t=e.config,a=i(document),s=e.layero,l=s.find(t.move),f=s.find(".layui-layer-resize"),c={};return t.move&&l.css("cursor","move"),l.on("mousedown",function(e){e.preventDefault(),t.move&&(c.moveStart=!0,c.offset=[e.clientX-parseFloat(s.css("left")),e.clientY-parseFloat(s.css("top"))],o.moveElem.css("cursor","move").show())}),f.on("mousedown",function(e){e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],c.area=[s.outerWidth(),s.outerHeight()],o.moveElem.css("cursor","se-resize").show()}),a.on("mousemove",function(i){if(c.moveStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1],l="fixed"===s.css("position");if(i.preventDefault(),c.stX=l?0:n.scrollLeft(),c.stY=l?0:n.scrollTop(),!t.moveOut){var f=n.width()-s.outerWidth()+c.stX,u=n.height()-s.outerHeight()+c.stY;af&&(a=f),ou&&(o=u)}s.css({left:a,top:o})}if(t.resize&&c.resizeStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1];i.preventDefault(),r.style(e.index,{width:c.area[0]+a,height:c.area[1]+o}),c.isResize=!0,t.resizing&&t.resizing(s)}}).on("mouseup",function(e){c.moveStart&&(delete c.moveStart,o.moveElem.hide(),t.moveEnd&&t.moveEnd(s)),c.resizeStart&&(delete c.resizeStart,o.moveElem.hide())}),e},s.pt.callback=function(){function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)}var t=this,n=t.layero,a=t.config;t.openLayer(),a.success&&(2==a.type?n.find("iframe").on("load",function(){a.success(n,t.index)}):a.success(n,t.index)),6==r.ie&&t.IE6(n),n.find("."+l[6]).children("a").on("click",function(){var e=i(this).index();if(0===e)a.yes?a.yes(t.index,n):a.btn1?a.btn1(t.index,n):r.close(t.index);else{var o=a["btn"+(e+1)]&&a["btn"+(e+1)](t.index,n);o===!1||r.close(t.index)}}),n.find("."+l[7]).on("click",e),a.shadeClose&&i("#layui-layer-shade"+t.index).on("click",function(){r.close(t.index)}),n.find(".layui-layer-min").on("click",function(){var e=a.min&&a.min(n);e===!1||r.min(t.index,a)}),n.find(".layui-layer-max").on("click",function(){i(this).hasClass("layui-layer-maxmin")?(r.restore(t.index),a.restore&&a.restore(n)):(r.full(t.index,a),setTimeout(function(){a.full&&a.full(n)},100))}),a.end&&(o.end[t.index]=a.end)},o.reselect=function(){i.each(i("select"),function(e,t){var n=i(this);n.parents("."+l[0])[0]||1==n.attr("layer")&&i("."+l[0]).length<1&&n.removeAttr("layer").show(),n=null})},s.pt.IE6=function(e){i("select").each(function(e,t){var n=i(this);n.parents("."+l[0])[0]||"none"===n.css("display")||n.attr({layer:"1"}).hide(),n=null})},s.pt.openLayer=function(){var e=this;r.zIndex=e.config.zIndex,r.setTop=function(e){var t=function(){r.zIndex++,e.css("z-index",r.zIndex+1)};return r.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",t),r.zIndex}},o.record=function(e){var t=[e.width(),e.height(),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:t})},o.rescollbar=function(e){l.html.attr("layer-full")==e&&(l.html[0].style.removeProperty?l.html[0].style.removeProperty("overflow"):l.html[0].style.removeAttribute("overflow"),l.html.removeAttr("layer-full"))},e.layer=r,r.getChildFrame=function(e,t){return t=t||i("."+l[4]).attr("times"),i("#"+l[0]+t).find("iframe").contents().find(e)},r.getFrameIndex=function(e){return i("#"+e).parents("."+l[4]).attr("times")},r.iframeAuto=function(e){if(e){var t=r.getChildFrame("html",e).outerHeight(),n=i("#"+l[0]+e),a=n.find(l[1]).outerHeight()||0,o=n.find("."+l[6]).outerHeight()||0;n.css({height:t+a+o}),n.find("iframe").css({height:t})}},r.iframeSrc=function(e,t){i("#"+l[0]+e).find("iframe").attr("src",t)},r.style=function(e,t,n){var a=i("#"+l[0]+e),r=a.find(".layui-layer-content"),s=a.attr("type"),f=a.find(l[1]).outerHeight()||0,c=a.find("."+l[6]).outerHeight()||0;a.attr("minLeft");s!==o.type[3]&&s!==o.type[4]&&(n||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-f-c<=64&&(t.height=64+f+c)),a.css(t),c=a.find("."+l[6]).outerHeight(),s===o.type[2]?a.find("iframe").css({height:parseFloat(t.height)-f-c}):r.css({height:parseFloat(t.height)-f-c-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom"))}))},r.min=function(e,t){var a=i("#"+l[0]+e),s=a.find(l[1]).outerHeight()||0,f=a.attr("minLeft")||181*o.minIndex+"px",c=a.css("position");o.record(a),o.minLeft[0]&&(f=o.minLeft[0],o.minLeft.shift()),a.attr("position",c),r.style(e,{width:180,height:s,left:f,top:n.height()-s,position:"fixed",overflow:"hidden"},!0),a.find(".layui-layer-min").hide(),"page"===a.attr("type")&&a.find(l[4]).hide(),o.rescollbar(e),a.attr("minLeft")||o.minIndex++,a.attr("minLeft",f)},r.restore=function(e){var t=i("#"+l[0]+e),n=t.attr("area").split(",");t.attr("type");r.style(e,{width:parseFloat(n[0]),height:parseFloat(n[1]),top:parseFloat(n[2]),left:parseFloat(n[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===t.attr("type")&&t.find(l[4]).show(),o.rescollbar(e)},r.full=function(e){var t,a=i("#"+l[0]+e);o.record(a),l.html.attr("layer-full")||l.html.css("overflow","hidden").attr("layer-full",e),clearTimeout(t),t=setTimeout(function(){var t="fixed"===a.css("position");r.style(e,{top:t?0:n.scrollTop(),left:t?0:n.scrollLeft(),width:n.width(),height:n.height()},!0),a.find(".layui-layer-min").hide()},100)},r.title=function(e,t){var n=i("#"+l[0]+(t||r.index)).find(l[1]);n.html(e)},r.close=function(e){var t=i("#"+l[0]+e),n=t.attr("type"),a="layer-anim-close";if(t[0]){var s="layui-layer-wrap",f=function(){if(n===o.type[1]&&"object"===t.attr("conType")){t.children(":not(."+l[5]+")").remove();for(var a=t.find("."+s),r=0;r<2;r++)a.unwrap();a.css("display",a.data("display")).removeClass(s)}else{if(n===o.type[2])try{var f=i("#"+l[4]+e)[0];f.contentWindow.document.write(""),f.contentWindow.close(),t.find("."+l[5])[0].removeChild(f)}catch(c){}t[0].innerHTML="",t.remove()}"function"==typeof o.end[e]&&o.end[e](),delete o.end[e]};t.data("isOutAnim")&&t.addClass("layer-anim "+a),i("#layui-layer-moves, #layui-layer-shade"+e).remove(),6==r.ie&&o.reselect(),o.rescollbar(e),t.attr("minLeft")&&(o.minIndex--,o.minLeft.push(t.attr("minLeft"))),r.ie&&r.ie<10||!t.data("isOutAnim")?f():setTimeout(function(){f()},200)}},r.closeAll=function(e){i.each(i("."+l[0]),function(){var t=i(this),n=e?t.attr("type")===e:1;n&&r.close(t.attr("times")),n=null})};var f=r.cache||{},c=function(e){return f.skin?" "+f.skin+" "+f.skin+"-"+e:""};r.prompt=function(e,t){var a="";if(e=e||{},"function"==typeof e&&(t=e),e.area){var o=e.area;a='style="width: '+o[0]+"; height: "+o[1]+';"',delete e.area}var s,l=2==e.formType?'":function(){return''}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:["确定","取消"],content:l,skin:"layui-layer-prompt"+c("prompt"),maxWidth:n.width(),success:function(t){s=t.find(".layui-layer-input"),s.val(e.value||"").focus(),"function"==typeof f&&f(t)},resize:!1,yes:function(i){var n=s.val();""===n?s.focus():n.length>(e.maxlength||500)?r.tips("最多输入"+(e.maxlength||500)+"个字数",s,{tips:1}):t&&t(n,i,s)}},e))},r.tab=function(e){e=e||{};var t=e.tab||{},n="layui-this",a=e.success;return delete e.success,r.open(i.extend({type:1,skin:"layui-layer-tab"+c("tab"),resize:!1,title:function(){var e=t.length,i=1,a="";if(e>0)for(a=''+t[0].title+"";i"+t[i].title+"";return a}(),content:'
        '+function(){var e=t.length,i=1,a="";if(e>0)for(a='
      • '+(t[0].content||"no content")+"
      • ";i'+(t[i].content||"no content")+"";return a}()+"
      ",success:function(t){var o=t.find(".layui-layer-title").children(),r=t.find(".layui-layer-tabmain").children();o.on("mousedown",function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0;var a=i(this),o=a.index();a.addClass(n).siblings().removeClass(n),r.eq(o).show().siblings().hide(),"function"==typeof e.change&&e.change(o)}),"function"==typeof a&&a(t)}},e))},r.photos=function(t,n,a){function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,i(e)}))}var s={};if(t=t||{},t.photos){var l=t.photos.constructor===Object,f=l?t.photos:{},u=f.data||[],d=f.start||0;s.imgIndex=(0|d)+1,t.img=t.img||"img";var y=t.success;if(delete t.success,l){if(0===u.length)return r.msg("没有图片")}else{var p=i(t.photos),h=function(){u=[],p.find(t.img).each(function(e){var t=i(this);t.attr("layer-index",e),u.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(h(),0===u.length)return;if(n||p.on("click",t.img,function(){var e=i(this),n=e.attr("layer-index");r.photos(i.extend(t,{photos:{start:n,data:u,tab:t.tab},full:t.full}),!0),h()}),!n)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=u.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>u.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){if(!s.end){var t=e.keyCode;e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&r.close(s.index)}},s.tabimg=function(e){if(!(u.length<=1))return f.start=s.imgIndex-1,r.close(s.index),r.photos(t,!0,e)},s.event=function(){s.bigimg.hover(function(){s.imgsee.show()},function(){s.imgsee.hide()}),s.bigimg.find(".layui-layer-imgprev").on("click",function(e){e.preventDefault(),s.imgprev()}),s.bigimg.find(".layui-layer-imgnext").on("click",function(e){e.preventDefault(),s.imgnext()}),i(document).on("keyup",s.keyup)},s.loadi=r.load(1,{shade:!("shade"in t)&&.9,scrollbar:!1}),o(u[d].src,function(n){r.close(s.loadi),s.index=r.open(i.extend({type:1,id:"layui-layer-photos",area:function(){var a=[n.width,n.height],o=[i(e).width()-100,i(e).height()-100];if(!t.full&&(a[0]>o[0]||a[1]>o[1])){var r=[a[0]/o[0],a[1]/o[1]];r[0]>r[1]?(a[0]=a[0]/r[0],a[1]=a[1]/r[0]):r[0]'+(u[d].alt||
      '+(u.length>1?'':"")+'
      '+(u[d].alt||"")+""+s.imgIndex+"/"+u.length+"
      ",success:function(e,i){s.bigimg=e.find(".layui-layer-phimg"),s.imgsee=e.find(".layui-layer-imguide,.layui-layer-imgbar"),s.event(e),t.tab&&t.tab(u[d],e),"function"==typeof y&&y(e)},end:function(){s.end=!0,i(document).off("keyup",s.keyup)}},t))},function(){r.close(s.loadi),r.msg("当前图片地址异常
      是否继续查看下一张?",{time:3e4,btn:["下一张","不看了"],yes:function(){u.length>1&&s.imgnext(!0,!0)}})})}},o.run=function(t){i=t,n=i(e),l.html=i("html"),r.open=function(e){var t=new s(e);return t.index}},e.layui&&layui.define?(r.ready(),layui.define("jquery",function(t){r.path=layui.cache.dir,o.run(layui.$),e.layer=r,t("layer",r)})):"function"==typeof define&&define.amd?define(["jquery"],function(){return o.run(e.jQuery),r}):function(){o.run(e.jQuery),r.ready()}()}(window); \ No newline at end of file diff --git a/static/frame/layui/lay/modules/laypage.js b/static/frame/layui/lay/modules/laypage.js new file mode 100644 index 0000000..2cf64d5 --- /dev/null +++ b/static/frame/layui/lay/modules/laypage.js @@ -0,0 +1,2 @@ +/** layui-v2.3.0 MIT License By https://www.layui.com */ + ;layui.define(function(e){"use strict";var a=document,t="getElementById",n="getElementsByTagName",i="laypage",r="layui-disabled",u=function(e){var a=this;a.config=e||{},a.config.index=++s.index,a.render(!0)};u.prototype.type=function(){var e=this.config;if("object"==typeof e.elem)return void 0===e.elem.length?2:3},u.prototype.view=function(){var e=this,a=e.config,t=a.groups="groups"in a?0|a.groups:5;a.layout="object"==typeof a.layout?a.layout:["prev","page","next"],a.count=0|a.count,a.curr=0|a.curr||1,a.limits="object"==typeof a.limits?a.limits:[10,20,30,40,50],a.limit=0|a.limit||10,a.pages=Math.ceil(a.count/a.limit)||1,a.curr>a.pages&&(a.curr=a.pages),t<0?t=1:t>a.pages&&(t=a.pages),a.prev="prev"in a?a.prev:"上一页",a.next="next"in a?a.next:"下一页";var n=a.pages>t?Math.ceil((a.curr+(t>1?1:0))/(t>0?t:1)):1,i={prev:function(){return a.prev?''+a.prev+"":""}(),page:function(){var e=[];if(a.count<1)return"";n>1&&a.first!==!1&&0!==t&&e.push(''+(a.first||1)+"");var i=Math.floor((t-1)/2),r=n>1?a.curr-i:1,u=n>1?function(){var e=a.curr+(t-i-1);return e>a.pages?a.pages:e}():t;for(u-r2&&e.push('…');r<=u;r++)r===a.curr?e.push('"+r+""):e.push(''+r+"");return a.pages>t&&a.pages>u&&a.last!==!1&&(u+1…'),0!==t&&e.push(''+(a.last||a.pages)+"")),e.join("")}(),next:function(){return a.next?''+a.next+"":""}(),count:'共 '+a.count+" 条",limit:function(){var e=['"}(),refresh:['','',""].join(""),skip:function(){return['到第','','页',""].join("")}()};return['
      ',function(){var e=[];return layui.each(a.layout,function(a,t){i[t]&&e.push(i[t])}),e.join("")}(),"
      "].join("")},u.prototype.jump=function(e,a){if(e){var t=this,i=t.config,r=e.children,u=e[n]("button")[0],l=e[n]("input")[0],p=e[n]("select")[0],c=function(){var e=0|l.value.replace(/\s|\D/g,"");e&&(i.curr=e,t.render())};if(a)return c();for(var o=0,y=r.length;oi.pages||(i.curr=e,t.render())});p&&s.on(p,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),u&&s.on(u,"click",function(){c()})}},u.prototype.skip=function(e){if(e){var a=this,t=e[n]("input")[0];t&&s.on(t,"keyup",function(t){var n=this.value,i=t.keyCode;/^(37|38|39|40)$/.test(i)||(/\D/.test(n)&&(this.value=n.replace(/\D/,"")),13===i&&a.jump(e,!0))})}},u.prototype.render=function(e){var n=this,i=n.config,r=n.type(),u=n.view();2===r?i.elem&&(i.elem.innerHTML=u):3===r?i.elem.html(u):a[t](i.elem)&&(a[t](i.elem).innerHTML=u),i.jump&&i.jump(i,e);var s=a[t]("layui-laypage-"+i.index);n.jump(s),i.hash&&!e&&(location.hash="!"+i.hash+"="+i.curr),n.skip(s)};var s={render:function(e){var a=new u(e);return a.index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(e,a,t){return e.attachEvent?e.attachEvent("on"+a,function(a){a.target=a.srcElement,t.call(e,a)}):e.addEventListener(a,t,!1),this}};e(i,s)}); \ No newline at end of file diff --git a/static/frame/layui/lay/modules/laytpl.js b/static/frame/layui/lay/modules/laytpl.js new file mode 100644 index 0000000..9e694d7 --- /dev/null +++ b/static/frame/layui/lay/modules/laytpl.js @@ -0,0 +1,2 @@ +/** layui-v2.3.0 MIT License By https://www.layui.com */ + ;layui.define(function(e){"use strict";var r={open:"{{",close:"}}"},c={exp:function(e){return new RegExp(e,"g")},query:function(e,c,t){var o=["#([\\s\\S])+?","([^{#}])*?"][e||0];return n((c||"")+r.open+o+r.close+(t||""))},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var c="Laytpl Error:";return"object"==typeof console&&console.error(c+e+"\n"+(r||"")),c+e}},n=c.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=n("^"+r.open+"#",""),l=n(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(n(r.open+"#"),r.open+"# ").replace(n(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(n(r.open+"!(.+?)!"+r.close),function(e){return e=e.replace(n("^"+r.open+"!"),"").replace(n("!"+r.close),"").replace(n(r.open+"|"+r.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(c.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(c.query(1),function(e){var c='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(n(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),c='"+_escape_('),c+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,c.escape)}catch(u){return delete o.cache,c.error(u,p)}},t.pt.render=function(e,r){var n,t=this;return e?(n=t.cache?t.cache(e,c.escape):t.parse(t.tpl,e),r?void r(n):n):c.error("no data")};var o=function(e){return"string"!=typeof e?c.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var c in e)r[c]=e[c]},o.v="1.2.0",e("laytpl",o)}); \ No newline at end of file diff --git a/static/frame/layui/lay/modules/mobile.js b/static/frame/layui/lay/modules/mobile.js new file mode 100644 index 0000000..5862170 --- /dev/null +++ b/static/frame/layui/lay/modules/mobile.js @@ -0,0 +1,2 @@ +/** layui-v2.3.0 MIT License By https://www.layui.com */ + ;layui.define(function(i){i("layui.mobile",layui.v)});layui.define(function(e){"use strict";var r={open:"{{",close:"}}"},c={exp:function(e){return new RegExp(e,"g")},query:function(e,c,t){var o=["#([\\s\\S])+?","([^{#}])*?"][e||0];return n((c||"")+r.open+o+r.close+(t||""))},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var c="Laytpl Error:";return"object"==typeof console&&console.error(c+e+"\n"+(r||"")),c+e}},n=c.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=n("^"+r.open+"#",""),l=n(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(n(r.open+"#"),r.open+"# ").replace(n(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(n(r.open+"!(.+?)!"+r.close),function(e){return e=e.replace(n("^"+r.open+"!"),"").replace(n("!"+r.close),"").replace(n(r.open+"|"+r.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(c.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(c.query(1),function(e){var c='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(n(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),c='"+_escape_('),c+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,c.escape)}catch(u){return delete o.cache,c.error(u,p)}},t.pt.render=function(e,r){var n,t=this;return e?(n=t.cache?t.cache(e,c.escape):t.parse(t.tpl,e),r?void r(n):n):c.error("no data")};var o=function(e){return"string"!=typeof e?c.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var c in e)r[c]=e[c]},o.v="1.2.0",e("laytpl",o)});layui.define(function(e){"use strict";var t=(window,document),i="querySelectorAll",n="getElementsByClassName",a=function(e){return t[i](e)},s={type:0,shade:!0,shadeClose:!0,fixed:!0,anim:"scale"},l={extend:function(e){var t=JSON.parse(JSON.stringify(s));for(var i in e)t[i]=e[i];return t},timer:{},end:{}};l.touch=function(e,t){e.addEventListener("click",function(e){t.call(this,e)},!1)};var o=0,r=["layui-m-layer"],d=function(e){var t=this;t.config=l.extend(e),t.view()};d.prototype.view=function(){var e=this,i=e.config,s=t.createElement("div");e.id=s.id=r[0]+o,s.setAttribute("class",r[0]+" "+r[0]+(i.type||0)),s.setAttribute("index",o);var l=function(){var e="object"==typeof i.title;return i.title?'

      '+(e?i.title[0]:i.title)+"

      ":""}(),d=function(){"string"==typeof i.btn&&(i.btn=[i.btn]);var e,t=(i.btn||[]).length;return 0!==t&&i.btn?(e=''+i.btn[0]+"",2===t&&(e=''+i.btn[1]+""+e),'
      '+e+"
      "):""}();if(i.fixed||(i.top=i.hasOwnProperty("top")?i.top:100,i.style=i.style||"",i.style+=" top:"+(t.body.scrollTop+i.top)+"px"),2===i.type&&(i.content='

      '+(i.content||"")+"

      "),i.skin&&(i.anim="up"),"msg"===i.skin&&(i.shade=!1),s.innerHTML=(i.shade?"
      ':"")+'
      "+l+'
      '+i.content+"
      "+d+"
      ",!i.type||2===i.type){var y=t[n](r[0]+i.type),u=y.length;u>=1&&c.close(y[0].getAttribute("index"))}document.body.appendChild(s);var m=e.elem=a("#"+e.id)[0];i.success&&i.success(m),e.index=o++,e.action(i,m)},d.prototype.action=function(e,t){var i=this;e.time&&(l.timer[i.index]=setTimeout(function(){c.close(i.index)},1e3*e.time));var a=function(){var t=this.getAttribute("type");0==t?(e.no&&e.no(),c.close(i.index)):e.yes?e.yes(i.index):c.close(i.index)};if(e.btn)for(var s=t[n]("layui-m-layerbtn")[0].children,o=s.length,r=0;r0&&e-1 in t)}function s(t){return A.call(t,function(t){return null!=t})}function u(t){return t.length>0?T.fn.concat.apply([],t):t}function c(t){return t.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()}function l(t){return t in F?F[t]:F[t]=new RegExp("(^|\\s)"+t+"(\\s|$)")}function f(t,e){return"number"!=typeof e||k[c(t)]?e:e+"px"}function h(t){var e,n;return $[t]||(e=L.createElement(t),L.body.appendChild(e),n=getComputedStyle(e,"").getPropertyValue("display"),e.parentNode.removeChild(e),"none"==n&&(n="block"),$[t]=n),$[t]}function p(t){return"children"in t?D.call(t.children):T.map(t.childNodes,function(t){if(1==t.nodeType)return t})}function d(t,e){var n,r=t?t.length:0;for(n=0;n]*>/,R=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,Z=/^(?:body|html)$/i,q=/([A-Z])/g,H=["val","css","html","text","data","width","height","offset"],I=["after","prepend","before","append"],V=L.createElement("table"),_=L.createElement("tr"),B={tr:L.createElement("tbody"),tbody:V,thead:V,tfoot:V,td:_,th:_,"*":L.createElement("div")},U=/complete|loaded|interactive/,X=/^[\w-]*$/,J={},W=J.toString,Y={},G=L.createElement("div"),K={tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},Q=Array.isArray||function(t){return t instanceof Array};return Y.matches=function(t,e){if(!e||!t||1!==t.nodeType)return!1;var n=t.matches||t.webkitMatchesSelector||t.mozMatchesSelector||t.oMatchesSelector||t.matchesSelector;if(n)return n.call(t,e);var r,i=t.parentNode,o=!i;return o&&(i=G).appendChild(t),r=~Y.qsa(i,e).indexOf(t),o&&G.removeChild(t),r},C=function(t){return t.replace(/-+(.)?/g,function(t,e){return e?e.toUpperCase():""})},N=function(t){return A.call(t,function(e,n){return t.indexOf(e)==n})},Y.fragment=function(t,e,n){var r,i,a;return R.test(t)&&(r=T(L.createElement(RegExp.$1))),r||(t.replace&&(t=t.replace(z,"<$1>")),e===E&&(e=M.test(t)&&RegExp.$1),e in B||(e="*"),a=B[e],a.innerHTML=""+t,r=T.each(D.call(a.childNodes),function(){a.removeChild(this)})),o(n)&&(i=T(r),T.each(n,function(t,e){H.indexOf(t)>-1?i[t](e):i.attr(t,e)})),r},Y.Z=function(t,e){return new d(t,e)},Y.isZ=function(t){return t instanceof Y.Z},Y.init=function(t,n){var r;if(!t)return Y.Z();if("string"==typeof t)if(t=t.trim(),"<"==t[0]&&M.test(t))r=Y.fragment(t,RegExp.$1,n),t=null;else{if(n!==E)return T(n).find(t);r=Y.qsa(L,t)}else{if(e(t))return T(L).ready(t);if(Y.isZ(t))return t;if(Q(t))r=s(t);else if(i(t))r=[t],t=null;else if(M.test(t))r=Y.fragment(t.trim(),RegExp.$1,n),t=null;else{if(n!==E)return T(n).find(t);r=Y.qsa(L,t)}}return Y.Z(r,t)},T=function(t,e){return Y.init(t,e)},T.extend=function(t){var e,n=D.call(arguments,1);return"boolean"==typeof t&&(e=t,t=n.shift()),n.forEach(function(n){m(t,n,e)}),t},Y.qsa=function(t,e){var n,r="#"==e[0],i=!r&&"."==e[0],o=r||i?e.slice(1):e,a=X.test(o);return t.getElementById&&a&&r?(n=t.getElementById(o))?[n]:[]:1!==t.nodeType&&9!==t.nodeType&&11!==t.nodeType?[]:D.call(a&&!r&&t.getElementsByClassName?i?t.getElementsByClassName(o):t.getElementsByTagName(e):t.querySelectorAll(e))},T.contains=L.documentElement.contains?function(t,e){return t!==e&&t.contains(e)}:function(t,e){for(;e&&(e=e.parentNode);)if(e===t)return!0;return!1},T.type=t,T.isFunction=e,T.isWindow=n,T.isArray=Q,T.isPlainObject=o,T.isEmptyObject=function(t){var e;for(e in t)return!1;return!0},T.isNumeric=function(t){var e=Number(t),n=typeof t;return null!=t&&"boolean"!=n&&("string"!=n||t.length)&&!isNaN(e)&&isFinite(e)||!1},T.inArray=function(t,e,n){return O.indexOf.call(e,t,n)},T.camelCase=C,T.trim=function(t){return null==t?"":String.prototype.trim.call(t)},T.uuid=0,T.support={},T.expr={},T.noop=function(){},T.map=function(t,e){var n,r,i,o=[];if(a(t))for(r=0;r=0?t:t+this.length]},toArray:function(){return this.get()},size:function(){return this.length},remove:function(){return this.each(function(){null!=this.parentNode&&this.parentNode.removeChild(this)})},each:function(t){return O.every.call(this,function(e,n){return t.call(e,n,e)!==!1}),this},filter:function(t){return e(t)?this.not(this.not(t)):T(A.call(this,function(e){return Y.matches(e,t)}))},add:function(t,e){return T(N(this.concat(T(t,e))))},is:function(t){return this.length>0&&Y.matches(this[0],t)},not:function(t){var n=[];if(e(t)&&t.call!==E)this.each(function(e){t.call(this,e)||n.push(this)});else{var r="string"==typeof t?this.filter(t):a(t)&&e(t.item)?D.call(t):T(t);this.forEach(function(t){r.indexOf(t)<0&&n.push(t)})}return T(n)},has:function(t){return this.filter(function(){return i(t)?T.contains(this,t):T(this).find(t).size()})},eq:function(t){return t===-1?this.slice(t):this.slice(t,+t+1)},first:function(){var t=this[0];return t&&!i(t)?t:T(t)},last:function(){var t=this[this.length-1];return t&&!i(t)?t:T(t)},find:function(t){var e,n=this;return e=t?"object"==typeof t?T(t).filter(function(){var t=this;return O.some.call(n,function(e){return T.contains(e,t)})}):1==this.length?T(Y.qsa(this[0],t)):this.map(function(){return Y.qsa(this,t)}):T()},closest:function(t,e){var n=[],i="object"==typeof t&&T(t);return this.each(function(o,a){for(;a&&!(i?i.indexOf(a)>=0:Y.matches(a,t));)a=a!==e&&!r(a)&&a.parentNode;a&&n.indexOf(a)<0&&n.push(a)}),T(n)},parents:function(t){for(var e=[],n=this;n.length>0;)n=T.map(n,function(t){if((t=t.parentNode)&&!r(t)&&e.indexOf(t)<0)return e.push(t),t});return v(e,t)},parent:function(t){return v(N(this.pluck("parentNode")),t)},children:function(t){return v(this.map(function(){return p(this)}),t)},contents:function(){return this.map(function(){return this.contentDocument||D.call(this.childNodes)})},siblings:function(t){return v(this.map(function(t,e){return A.call(p(e.parentNode),function(t){return t!==e})}),t)},empty:function(){return this.each(function(){this.innerHTML=""})},pluck:function(t){return T.map(this,function(e){return e[t]})},show:function(){return this.each(function(){"none"==this.style.display&&(this.style.display=""),"none"==getComputedStyle(this,"").getPropertyValue("display")&&(this.style.display=h(this.nodeName))})},replaceWith:function(t){return this.before(t).remove()},wrap:function(t){var n=e(t);if(this[0]&&!n)var r=T(t).get(0),i=r.parentNode||this.length>1;return this.each(function(e){T(this).wrapAll(n?t.call(this,e):i?r.cloneNode(!0):r)})},wrapAll:function(t){if(this[0]){T(this[0]).before(t=T(t));for(var e;(e=t.children()).length;)t=e.first();T(t).append(this)}return this},wrapInner:function(t){var n=e(t);return this.each(function(e){var r=T(this),i=r.contents(),o=n?t.call(this,e):t;i.length?i.wrapAll(o):r.append(o)})},unwrap:function(){return this.parent().each(function(){T(this).replaceWith(T(this).children())}),this},clone:function(){return this.map(function(){return this.cloneNode(!0)})},hide:function(){return this.css("display","none")},toggle:function(t){return this.each(function(){var e=T(this);(t===E?"none"==e.css("display"):t)?e.show():e.hide()})},prev:function(t){return T(this.pluck("previousElementSibling")).filter(t||"*")},next:function(t){return T(this.pluck("nextElementSibling")).filter(t||"*")},html:function(t){return 0 in arguments?this.each(function(e){var n=this.innerHTML;T(this).empty().append(g(this,t,e,n))}):0 in this?this[0].innerHTML:null},text:function(t){return 0 in arguments?this.each(function(e){var n=g(this,t,e,this.textContent);this.textContent=null==n?"":""+n}):0 in this?this.pluck("textContent").join(""):null},attr:function(t,e){var n;return"string"!=typeof t||1 in arguments?this.each(function(n){if(1===this.nodeType)if(i(t))for(j in t)y(this,j,t[j]);else y(this,t,g(this,e,n,this.getAttribute(t)))}):0 in this&&1==this[0].nodeType&&null!=(n=this[0].getAttribute(t))?n:E},removeAttr:function(t){return this.each(function(){1===this.nodeType&&t.split(" ").forEach(function(t){y(this,t)},this)})},prop:function(t,e){return t=K[t]||t,1 in arguments?this.each(function(n){this[t]=g(this,e,n,this[t])}):this[0]&&this[0][t]},removeProp:function(t){return t=K[t]||t,this.each(function(){delete this[t]})},data:function(t,e){var n="data-"+t.replace(q,"-$1").toLowerCase(),r=1 in arguments?this.attr(n,e):this.attr(n);return null!==r?b(r):E},val:function(t){return 0 in arguments?(null==t&&(t=""),this.each(function(e){this.value=g(this,t,e,this.value)})):this[0]&&(this[0].multiple?T(this[0]).find("option").filter(function(){return this.selected}).pluck("value"):this[0].value)},offset:function(t){if(t)return this.each(function(e){var n=T(this),r=g(this,t,e,n.offset()),i=n.offsetParent().offset(),o={top:r.top-i.top,left:r.left-i.left};"static"==n.css("position")&&(o.position="relative"),n.css(o)});if(!this.length)return null;if(L.documentElement!==this[0]&&!T.contains(L.documentElement,this[0]))return{top:0,left:0};var e=this[0].getBoundingClientRect();return{left:e.left+window.pageXOffset,top:e.top+window.pageYOffset,width:Math.round(e.width),height:Math.round(e.height)}},css:function(e,n){if(arguments.length<2){var r=this[0];if("string"==typeof e){if(!r)return;return r.style[C(e)]||getComputedStyle(r,"").getPropertyValue(e)}if(Q(e)){if(!r)return;var i={},o=getComputedStyle(r,"");return T.each(e,function(t,e){i[e]=r.style[C(e)]||o.getPropertyValue(e)}),i}}var a="";if("string"==t(e))n||0===n?a=c(e)+":"+f(e,n):this.each(function(){this.style.removeProperty(c(e))});else for(j in e)e[j]||0===e[j]?a+=c(j)+":"+f(j,e[j])+";":this.each(function(){this.style.removeProperty(c(j))});return this.each(function(){this.style.cssText+=";"+a})},index:function(t){return t?this.indexOf(T(t)[0]):this.parent().children().indexOf(this[0])},hasClass:function(t){return!!t&&O.some.call(this,function(t){return this.test(x(t))},l(t))},addClass:function(t){return t?this.each(function(e){if("className"in this){S=[];var n=x(this),r=g(this,t,e,n);r.split(/\s+/g).forEach(function(t){T(this).hasClass(t)||S.push(t)},this),S.length&&x(this,n+(n?" ":"")+S.join(" "))}}):this},removeClass:function(t){return this.each(function(e){if("className"in this){if(t===E)return x(this,"");S=x(this),g(this,t,e,S).split(/\s+/g).forEach(function(t){S=S.replace(l(t)," ")}),x(this,S.trim())}})},toggleClass:function(t,e){return t?this.each(function(n){var r=T(this),i=g(this,t,n,x(this));i.split(/\s+/g).forEach(function(t){(e===E?!r.hasClass(t):e)?r.addClass(t):r.removeClass(t)})}):this},scrollTop:function(t){if(this.length){var e="scrollTop"in this[0];return t===E?e?this[0].scrollTop:this[0].pageYOffset:this.each(e?function(){this.scrollTop=t}:function(){this.scrollTo(this.scrollX,t)})}},scrollLeft:function(t){if(this.length){var e="scrollLeft"in this[0];return t===E?e?this[0].scrollLeft:this[0].pageXOffset:this.each(e?function(){this.scrollLeft=t}:function(){this.scrollTo(t,this.scrollY)})}},position:function(){if(this.length){var t=this[0],e=this.offsetParent(),n=this.offset(),r=Z.test(e[0].nodeName)?{top:0,left:0}:e.offset();return n.top-=parseFloat(T(t).css("margin-top"))||0,n.left-=parseFloat(T(t).css("margin-left"))||0,r.top+=parseFloat(T(e[0]).css("border-top-width"))||0,r.left+=parseFloat(T(e[0]).css("border-left-width"))||0,{top:n.top-r.top,left:n.left-r.left}}},offsetParent:function(){return this.map(function(){for(var t=this.offsetParent||L.body;t&&!Z.test(t.nodeName)&&"static"==T(t).css("position");)t=t.offsetParent;return t})}},T.fn.detach=T.fn.remove,["width","height"].forEach(function(t){var e=t.replace(/./,function(t){return t[0].toUpperCase()});T.fn[t]=function(i){var o,a=this[0];return i===E?n(a)?a["inner"+e]:r(a)?a.documentElement["scroll"+e]:(o=this.offset())&&o[t]:this.each(function(e){a=T(this),a.css(t,g(this,i,e,a[t]()))})}}),I.forEach(function(e,n){var r=n%2;T.fn[e]=function(){var e,i,o=T.map(arguments,function(n){var r=[];return e=t(n),"array"==e?(n.forEach(function(t){return t.nodeType!==E?r.push(t):T.zepto.isZ(t)?r=r.concat(t.get()):void(r=r.concat(Y.fragment(t)))}),r):"object"==e||null==n?n:Y.fragment(n)}),a=this.length>1;return o.length<1?this:this.each(function(t,e){i=r?e:e.parentNode,e=0==n?e.nextSibling:1==n?e.firstChild:2==n?e:null;var s=T.contains(L.documentElement,i);o.forEach(function(t){if(a)t=t.cloneNode(!0);else if(!i)return T(t).remove();i.insertBefore(t,e),s&&w(t,function(t){if(!(null==t.nodeName||"SCRIPT"!==t.nodeName.toUpperCase()||t.type&&"text/javascript"!==t.type||t.src)){var e=t.ownerDocument?t.ownerDocument.defaultView:window;e.eval.call(e,t.innerHTML)}})})})},T.fn[r?e+"To":"insert"+(n?"Before":"After")]=function(t){return T(t)[e](this),this}}),Y.Z.prototype=d.prototype=T.fn,Y.uniq=N,Y.deserializeValue=b,T.zepto=Y,T}();!function(t){function e(t){return t._zid||(t._zid=h++)}function n(t,n,o,a){if(n=r(n),n.ns)var s=i(n.ns);return(v[e(t)]||[]).filter(function(t){return t&&(!n.e||t.e==n.e)&&(!n.ns||s.test(t.ns))&&(!o||e(t.fn)===e(o))&&(!a||t.sel==a)})}function r(t){var e=(""+t).split(".");return{e:e[0],ns:e.slice(1).sort().join(" ")}}function i(t){return new RegExp("(?:^| )"+t.replace(" "," .* ?")+"(?: |$)")}function o(t,e){return t.del&&!y&&t.e in x||!!e}function a(t){return b[t]||y&&x[t]||t}function s(n,i,s,u,l,h,p){var d=e(n),m=v[d]||(v[d]=[]);i.split(/\s/).forEach(function(e){if("ready"==e)return t(document).ready(s);var i=r(e);i.fn=s,i.sel=l,i.e in b&&(s=function(e){var n=e.relatedTarget;if(!n||n!==this&&!t.contains(this,n))return i.fn.apply(this,arguments)}),i.del=h;var d=h||s;i.proxy=function(t){if(t=c(t),!t.isImmediatePropagationStopped()){t.data=u;var e=d.apply(n,t._args==f?[t]:[t].concat(t._args));return e===!1&&(t.preventDefault(),t.stopPropagation()),e}},i.i=m.length,m.push(i),"addEventListener"in n&&n.addEventListener(a(i.e),i.proxy,o(i,p))})}function u(t,r,i,s,u){var c=e(t);(r||"").split(/\s/).forEach(function(e){n(t,e,i,s).forEach(function(e){delete v[c][e.i],"removeEventListener"in t&&t.removeEventListener(a(e.e),e.proxy,o(e,u))})})}function c(e,n){return!n&&e.isDefaultPrevented||(n||(n=e),t.each(T,function(t,r){var i=n[t];e[t]=function(){return this[r]=w,i&&i.apply(n,arguments)},e[r]=E}),e.timeStamp||(e.timeStamp=Date.now()),(n.defaultPrevented!==f?n.defaultPrevented:"returnValue"in n?n.returnValue===!1:n.getPreventDefault&&n.getPreventDefault())&&(e.isDefaultPrevented=w)),e}function l(t){var e,n={originalEvent:t};for(e in t)j.test(e)||t[e]===f||(n[e]=t[e]);return c(n,t)}var f,h=1,p=Array.prototype.slice,d=t.isFunction,m=function(t){return"string"==typeof t},v={},g={},y="onfocusin"in window,x={focus:"focusin",blur:"focusout"},b={mouseenter:"mouseover",mouseleave:"mouseout"};g.click=g.mousedown=g.mouseup=g.mousemove="MouseEvents",t.event={add:s,remove:u},t.proxy=function(n,r){var i=2 in arguments&&p.call(arguments,2);if(d(n)){var o=function(){return n.apply(r,i?i.concat(p.call(arguments)):arguments)};return o._zid=e(n),o}if(m(r))return i?(i.unshift(n[r],n),t.proxy.apply(null,i)):t.proxy(n[r],n);throw new TypeError("expected function")},t.fn.bind=function(t,e,n){return this.on(t,e,n)},t.fn.unbind=function(t,e){return this.off(t,e)},t.fn.one=function(t,e,n,r){return this.on(t,e,n,r,1)};var w=function(){return!0},E=function(){return!1},j=/^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/,T={preventDefault:"isDefaultPrevented",stopImmediatePropagation:"isImmediatePropagationStopped",stopPropagation:"isPropagationStopped"};t.fn.delegate=function(t,e,n){return this.on(e,t,n)},t.fn.undelegate=function(t,e,n){return this.off(e,t,n)},t.fn.live=function(e,n){return t(document.body).delegate(this.selector,e,n),this},t.fn.die=function(e,n){return t(document.body).undelegate(this.selector,e,n),this},t.fn.on=function(e,n,r,i,o){var a,c,h=this;return e&&!m(e)?(t.each(e,function(t,e){h.on(t,n,r,e,o)}),h):(m(n)||d(i)||i===!1||(i=r,r=n,n=f),i!==f&&r!==!1||(i=r,r=f),i===!1&&(i=E),h.each(function(f,h){o&&(a=function(t){return u(h,t.type,i),i.apply(this,arguments)}),n&&(c=function(e){var r,o=t(e.target).closest(n,h).get(0);if(o&&o!==h)return r=t.extend(l(e),{currentTarget:o,liveFired:h}),(a||i).apply(o,[r].concat(p.call(arguments,1)))}),s(h,e,i,r,n,c||a)}))},t.fn.off=function(e,n,r){var i=this;return e&&!m(e)?(t.each(e,function(t,e){i.off(t,n,e)}),i):(m(n)||d(r)||r===!1||(r=n,n=f),r===!1&&(r=E),i.each(function(){u(this,e,r,n)}))},t.fn.trigger=function(e,n){return e=m(e)||t.isPlainObject(e)?t.Event(e):c(e),e._args=n,this.each(function(){e.type in x&&"function"==typeof this[e.type]?this[e.type]():"dispatchEvent"in this?this.dispatchEvent(e):t(this).triggerHandler(e,n)})},t.fn.triggerHandler=function(e,r){var i,o;return this.each(function(a,s){i=l(m(e)?t.Event(e):e),i._args=r,i.target=s,t.each(n(s,e.type||e),function(t,e){if(o=e.proxy(i),i.isImmediatePropagationStopped())return!1})}),o},"focusin focusout focus blur load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select keydown keypress keyup error".split(" ").forEach(function(e){t.fn[e]=function(t){return 0 in arguments?this.bind(e,t):this.trigger(e)}}),t.Event=function(t,e){m(t)||(e=t,t=e.type);var n=document.createEvent(g[t]||"Events"),r=!0;if(e)for(var i in e)"bubbles"==i?r=!!e[i]:n[i]=e[i];return n.initEvent(t,r,!0),c(n)}}(e),function(t){function e(e,n,r){var i=t.Event(n);return t(e).trigger(i,r),!i.isDefaultPrevented()}function n(t,n,r,i){if(t.global)return e(n||x,r,i)}function r(e){e.global&&0===t.active++&&n(e,null,"ajaxStart")}function i(e){e.global&&!--t.active&&n(e,null,"ajaxStop")}function o(t,e){var r=e.context;return e.beforeSend.call(r,t,e)!==!1&&n(e,r,"ajaxBeforeSend",[t,e])!==!1&&void n(e,r,"ajaxSend",[t,e])}function a(t,e,r,i){var o=r.context,a="success";r.success.call(o,t,a,e),i&&i.resolveWith(o,[t,a,e]),n(r,o,"ajaxSuccess",[e,r,t]),u(a,e,r)}function s(t,e,r,i,o){var a=i.context;i.error.call(a,r,e,t),o&&o.rejectWith(a,[r,e,t]),n(i,a,"ajaxError",[r,i,t||e]),u(e,r,i)}function u(t,e,r){var o=r.context;r.complete.call(o,e,t),n(r,o,"ajaxComplete",[e,r]),i(r)}function c(t,e,n){if(n.dataFilter==l)return t;var r=n.context;return n.dataFilter.call(r,t,e)}function l(){}function f(t){return t&&(t=t.split(";",2)[0]),t&&(t==T?"html":t==j?"json":w.test(t)?"script":E.test(t)&&"xml")||"text"}function h(t,e){return""==e?t:(t+"&"+e).replace(/[&?]{1,2}/,"?")}function p(e){e.processData&&e.data&&"string"!=t.type(e.data)&&(e.data=t.param(e.data,e.traditional)),!e.data||e.type&&"GET"!=e.type.toUpperCase()&&"jsonp"!=e.dataType||(e.url=h(e.url,e.data),e.data=void 0)}function d(e,n,r,i){return t.isFunction(n)&&(i=r,r=n,n=void 0),t.isFunction(r)||(i=r,r=void 0),{url:e,data:n,success:r,dataType:i}}function m(e,n,r,i){var o,a=t.isArray(n),s=t.isPlainObject(n);t.each(n,function(n,u){o=t.type(u),i&&(n=r?i:i+"["+(s||"object"==o||"array"==o?n:"")+"]"),!i&&a?e.add(u.name,u.value):"array"==o||!r&&"object"==o?m(e,u,r,n):e.add(n,u)})}var v,g,y=+new Date,x=window.document,b=/)<[^<]*)*<\/script>/gi,w=/^(?:text|application)\/javascript/i,E=/^(?:text|application)\/xml/i,j="application/json",T="text/html",S=/^\s*$/,C=x.createElement("a");C.href=window.location.href,t.active=0,t.ajaxJSONP=function(e,n){if(!("type"in e))return t.ajax(e);var r,i,u=e.jsonpCallback,c=(t.isFunction(u)?u():u)||"Zepto"+y++,l=x.createElement("script"),f=window[c],h=function(e){t(l).triggerHandler("error",e||"abort")},p={abort:h};return n&&n.promise(p),t(l).on("load error",function(o,u){clearTimeout(i),t(l).off().remove(),"error"!=o.type&&r?a(r[0],p,e,n):s(null,u||"error",p,e,n),window[c]=f,r&&t.isFunction(f)&&f(r[0]),f=r=void 0}),o(p,e)===!1?(h("abort"),p):(window[c]=function(){r=arguments},l.src=e.url.replace(/\?(.+)=\?/,"?$1="+c),x.head.appendChild(l),e.timeout>0&&(i=setTimeout(function(){h("timeout")},e.timeout)),p)},t.ajaxSettings={type:"GET",beforeSend:l,success:l,error:l,complete:l,context:null,global:!0,xhr:function(){return new window.XMLHttpRequest},accepts:{script:"text/javascript, application/javascript, application/x-javascript",json:j,xml:"application/xml, text/xml",html:T,text:"text/plain"},crossDomain:!1,timeout:0,processData:!0,cache:!0,dataFilter:l},t.ajax=function(e){var n,i,u=t.extend({},e||{}),d=t.Deferred&&t.Deferred();for(v in t.ajaxSettings)void 0===u[v]&&(u[v]=t.ajaxSettings[v]);r(u),u.crossDomain||(n=x.createElement("a"),n.href=u.url,n.href=n.href,u.crossDomain=C.protocol+"//"+C.host!=n.protocol+"//"+n.host),u.url||(u.url=window.location.toString()),(i=u.url.indexOf("#"))>-1&&(u.url=u.url.slice(0,i)),p(u);var m=u.dataType,y=/\?.+=\?/.test(u.url);if(y&&(m="jsonp"),u.cache!==!1&&(e&&e.cache===!0||"script"!=m&&"jsonp"!=m)||(u.url=h(u.url,"_="+Date.now())),"jsonp"==m)return y||(u.url=h(u.url,u.jsonp?u.jsonp+"=?":u.jsonp===!1?"":"callback=?")),t.ajaxJSONP(u,d);var b,w=u.accepts[m],E={},j=function(t,e){E[t.toLowerCase()]=[t,e]},T=/^([\w-]+:)\/\//.test(u.url)?RegExp.$1:window.location.protocol,N=u.xhr(),O=N.setRequestHeader;if(d&&d.promise(N),u.crossDomain||j("X-Requested-With","XMLHttpRequest"),j("Accept",w||"*/*"),(w=u.mimeType||w)&&(w.indexOf(",")>-1&&(w=w.split(",",2)[0]),N.overrideMimeType&&N.overrideMimeType(w)),(u.contentType||u.contentType!==!1&&u.data&&"GET"!=u.type.toUpperCase())&&j("Content-Type",u.contentType||"application/x-www-form-urlencoded"),u.headers)for(g in u.headers)j(g,u.headers[g]);if(N.setRequestHeader=j,N.onreadystatechange=function(){if(4==N.readyState){N.onreadystatechange=l,clearTimeout(b);var e,n=!1;if(N.status>=200&&N.status<300||304==N.status||0==N.status&&"file:"==T){if(m=m||f(u.mimeType||N.getResponseHeader("content-type")),"arraybuffer"==N.responseType||"blob"==N.responseType)e=N.response;else{e=N.responseText;try{e=c(e,m,u),"script"==m?(0,eval)(e):"xml"==m?e=N.responseXML:"json"==m&&(e=S.test(e)?null:t.parseJSON(e))}catch(r){n=r}if(n)return s(n,"parsererror",N,u,d)}a(e,N,u,d)}else s(N.statusText||null,N.status?"error":"abort",N,u,d)}},o(N,u)===!1)return N.abort(),s(null,"abort",N,u,d),N;var P=!("async"in u)||u.async;if(N.open(u.type,u.url,P,u.username,u.password),u.xhrFields)for(g in u.xhrFields)N[g]=u.xhrFields[g];for(g in E)O.apply(N,E[g]);return u.timeout>0&&(b=setTimeout(function(){N.onreadystatechange=l,N.abort(),s(null,"timeout",N,u,d)},u.timeout)),N.send(u.data?u.data:null),N},t.get=function(){return t.ajax(d.apply(null,arguments))},t.post=function(){var e=d.apply(null,arguments);return e.type="POST",t.ajax(e)},t.getJSON=function(){var e=d.apply(null,arguments);return e.dataType="json",t.ajax(e)},t.fn.load=function(e,n,r){if(!this.length)return this;var i,o=this,a=e.split(/\s/),s=d(e,n,r),u=s.success;return a.length>1&&(s.url=a[0],i=a[1]),s.success=function(e){o.html(i?t("
      ").html(e.replace(b,"")).find(i):e),u&&u.apply(o,arguments)},t.ajax(s),this};var N=encodeURIComponent;t.param=function(e,n){var r=[];return r.add=function(e,n){t.isFunction(n)&&(n=n()),null==n&&(n=""),this.push(N(e)+"="+N(n))},m(r,e,n),r.join("&").replace(/%20/g,"+")}}(e),function(t){t.fn.serializeArray=function(){var e,n,r=[],i=function(t){return t.forEach?t.forEach(i):void r.push({name:e,value:t})};return this[0]&&t.each(this[0].elements,function(r,o){n=o.type,e=o.name,e&&"fieldset"!=o.nodeName.toLowerCase()&&!o.disabled&&"submit"!=n&&"reset"!=n&&"button"!=n&&"file"!=n&&("radio"!=n&&"checkbox"!=n||o.checked)&&i(t(o).val())}),r},t.fn.serialize=function(){var t=[];return this.serializeArray().forEach(function(e){t.push(encodeURIComponent(e.name)+"="+encodeURIComponent(e.value))}),t.join("&")},t.fn.submit=function(e){if(0 in arguments)this.bind("submit",e);else if(this.length){var n=t.Event("submit");this.eq(0).trigger(n),n.isDefaultPrevented()||this.get(0).submit()}return this}}(e),function(){try{getComputedStyle(void 0)}catch(t){var e=getComputedStyle;window.getComputedStyle=function(t,n){try{return e(t,n)}catch(r){return null}}}}(),t("zepto",e)});layui.define(["layer-mobile","zepto"],function(e){"use strict";var t=layui.zepto,a=layui["layer-mobile"],i=(layui.device(),"layui-upload-enter"),n="layui-upload-iframe",r={icon:2,shift:6},o={file:"文件",video:"视频",audio:"音频"};a.msg=function(e){return a.open({content:e||"",skin:"msg",time:2})};var s=function(e){this.options=e};s.prototype.init=function(){var e=this,a=e.options,r=t("body"),s=t(a.elem||".layui-upload-file"),u=t('');return t("#"+n)[0]||r.append(u),s.each(function(r,s){s=t(s);var u='
      ',l=s.attr("lay-type")||a.type;a.unwrap||(u='
      '+u+''+(s.attr("lay-title")||a.title||"上传"+(o[l]||"图片"))+"
      "),u=t(u),a.unwrap||u.on("dragover",function(e){e.preventDefault(),t(this).addClass(i)}).on("dragleave",function(){t(this).removeClass(i)}).on("drop",function(){t(this).removeClass(i)}),s.parent("form").attr("target")===n&&(a.unwrap?s.unwrap():(s.parent().next().remove(),s.unwrap().unwrap())),s.wrap(u),s.off("change").on("change",function(){e.action(this,l)})})},s.prototype.action=function(e,i){var o=this,s=o.options,u=e.value,l=t(e),p=l.attr("lay-ext")||s.ext||"";if(u){switch(i){case"file":if(p&&!RegExp("\\w\\.("+p+")$","i").test(escape(u)))return a.msg("不支持该文件格式",r),e.value="";break;case"video":if(!RegExp("\\w\\.("+(p||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(u)))return a.msg("不支持该视频格式",r),e.value="";break;case"audio":if(!RegExp("\\w\\.("+(p||"mp3|wav|mid")+")$","i").test(escape(u)))return a.msg("不支持该音频格式",r),e.value="";break;default:if(!RegExp("\\w\\.("+(p||"jpg|png|gif|bmp|jpeg")+")$","i").test(escape(u)))return a.msg("不支持该图片格式",r),e.value=""}s.before&&s.before(e),l.parent().submit();var c=t("#"+n),f=setInterval(function(){var t;try{t=c.contents().find("body").text()}catch(i){a.msg("上传接口存在跨域",r),clearInterval(f)}if(t){clearInterval(f),c.contents().find("body").html("");try{t=JSON.parse(t)}catch(i){return t={},a.msg("请对上传接口返回JSON字符",r)}"function"==typeof s.success&&s.success(t,e)}},30);e.value=""}},e("upload-mobile",function(e){var t=new s(e=e||{});t.init()})});layui.define(function(i){i("layim-mobile",layui.v)});layui["layui.mobile"]||layui.config({base:layui.cache.dir+"lay/modules/mobile/"}).extend({"layer-mobile":"layer-mobile",zepto:"zepto","upload-mobile":"upload-mobile","layim-mobile":"layim-mobile"}),layui.define(["layer-mobile","zepto","layim-mobile"],function(l){l("mobile",{layer:layui["layer-mobile"],layim:layui["layim-mobile"]})}); \ No newline at end of file diff --git a/static/frame/layui/lay/modules/rate.js b/static/frame/layui/lay/modules/rate.js new file mode 100644 index 0000000..3c98909 --- /dev/null +++ b/static/frame/layui/lay/modules/rate.js @@ -0,0 +1,2 @@ +/** layui-v2.3.0 MIT License By https://www.layui.com */ + ;layui.define("jquery",function(e){"use strict";var a=layui.jquery,i={config:{},index:layui.rate?layui.rate.index+1e4:0,set:function(e){var i=this;return i.config=a.extend({},i.config,e),i},on:function(e,a){return layui.onevent.call(this,n,e,a)}},l=function(){var e=this,a=e.config;return{setvalue:function(a){e.setvalue.call(e,a)},config:a}},n="rate",t="layui-rate",o="layui-icon-rate",s="layui-icon-rate-solid",u="layui-icon-rate-half",r="layui-icon-rate-solid layui-icon-rate-half",c="layui-icon-rate-solid layui-icon-rate",f="layui-icon-rate layui-icon-rate-half",v=function(e){var l=this;l.index=++i.index,l.config=a.extend({},l.config,i.config,e),l.render()};v.prototype.config={length:5,text:!1,readonly:!1,half:!1,value:0,theme:""},v.prototype.render=function(){var e=this,i=e.config,l=i.theme?'style="color: '+i.theme+';"':"";i.elem=a(i.elem),parseInt(i.value)!==i.value&&(i.half||(i.value=Math.ceil(i.value)-i.value<.5?Math.ceil(i.value):Math.floor(i.value)));for(var n='
        ",u=1;u<=i.length;u++){var r='
      • ";i.half&&parseInt(i.value)!==i.value&&u==Math.ceil(i.value)?n=n+'
      • ":n+=r}n+="
      "+(i.text?''+i.value+"星":"")+"";var c=i.elem,f=c.next("."+t);f[0]&&f.remove(),e.elemTemp=a(n),i.span=e.elemTemp.next("span"),i.setText&&i.setText(i.value),c.html(e.elemTemp),c.addClass("layui-inline"),i.readonly||e.action()},v.prototype.setvalue=function(e){var a=this,i=a.config;i.value=e,a.render()},v.prototype.action=function(){var e=this,i=e.config,l=e.elemTemp,n=l.find("i").width();l.children("li").each(function(e){var t=e+1,v=a(this);v.on("click",function(e){if(i.value=t,i.half){var o=e.pageX-a(this).offset().left;o<=n/2&&(i.value=i.value-.5)}i.text&&l.next("span").text(i.value+"星"),i.choose&&i.choose(i.value),i.setText&&i.setText(i.value)}),v.on("mousemove",function(e){if(l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+t+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half){var c=e.pageX-a(this).offset().left;c<=n/2&&v.children("i").addClass(u).removeClass(s)}}),v.on("mouseleave",function(){l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+Math.floor(i.value)+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half&&parseInt(i.value)!==i.value&&l.children("li:eq("+Math.floor(i.value)+")").children("i").addClass(u).removeClass(c)})})},v.prototype.events=function(){var e=this;e.config},i.render=function(e){var a=new v(e);return l.call(a)},e(n,i)}); \ No newline at end of file diff --git a/static/frame/layui/lay/modules/slider.js b/static/frame/layui/lay/modules/slider.js new file mode 100644 index 0000000..446378d --- /dev/null +++ b/static/frame/layui/lay/modules/slider.js @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;layui.define("jquery",function(e){"use strict";var i=layui.jquery,t={config:{},index:layui.slider?layui.slider.index+1e4:0,set:function(e){var t=this;return t.config=i.extend({},t.config,e),t},on:function(e,i){return layui.onevent.call(this,n,e,i)}},a=function(){var e=this,i=e.config;return{setValue:function(i,t){return e.slide("set",i,t||0)},config:i}},n="slider",l="layui-disabled",s="layui-slider",r="layui-slider-bar",o="layui-slider-wrap",u="layui-slider-wrap-btn",d="layui-slider-tips",v="layui-slider-input",c="layui-slider-input-txt",m="layui-slider-input-btn",p="layui-slider-hover",f=function(e){var a=this;a.index=++t.index,a.config=i.extend({},a.config,t.config,e),a.render()};f.prototype.config={type:"default",min:0,max:100,value:0,step:1,showstep:!1,tips:!0,input:!1,range:!1,height:200,disabled:!1,theme:"#009688"},f.prototype.render=function(){var e=this,t=e.config;if(t.step<1&&(t.step=1),t.maxt.min?a:t.min,t.value[1]=n>t.min?n:t.min,t.value[0]=t.value[0]>t.max?t.max:t.value[0],t.value[1]=t.value[1]>t.max?t.max:t.value[1];var r=Math.floor((t.value[0]-t.min)/(t.max-t.min)*100),v=Math.floor((t.value[1]-t.min)/(t.max-t.min)*100),m=v-r+"%";r+="%",v+="%"}else{"object"==typeof t.value&&(t.value=Math.min.apply(null,t.value)),t.valuet.max&&(t.value=t.max);var m=Math.floor((t.value-t.min)/(t.max-t.min)*100)+"%"}var p=t.disabled?"#c2c2c2":t.theme,f='
      '+(t.tips?'
      ':"")+'
      '+(t.range?'
      ':"")+"
      ",h=i(t.elem),y=h.next("."+s);if(y[0]&&y.remove(),e.elemTemp=i(f),t.range?(e.elemTemp.find("."+o).eq(0).data("value",t.value[0]),e.elemTemp.find("."+o).eq(1).data("value",t.value[1])):e.elemTemp.find("."+o).data("value",t.value),h.html(e.elemTemp),"vertical"===t.type&&e.elemTemp.height(t.height+"px"),t.showstep){for(var g=(t.max-t.min)/t.step,b="",x=1;x
      ')}e.elemTemp.append(b)}if(t.input&&!t.range){var w=i('
      ');h.css("position","relative"),h.append(w),h.find("."+c).children("input").val(t.value),"vertical"===t.type?w.css({left:0,top:-48}):e.elemTemp.css("margin-right",w.outerWidth()+15)}t.disabled?(e.elemTemp.addClass(l),e.elemTemp.find("."+u).addClass(l)):e.slide(),e.elemTemp.find("."+u).on("mouseover",function(){var a="vertical"===t.type?t.height:e.elemTemp[0].offsetWidth,n=e.elemTemp.find("."+o),l="vertical"===t.type?a-i(this).parent()[0].offsetTop-n.height():i(this).parent()[0].offsetLeft,s=l/a*100,r=i(this).parent().data("value"),u=t.setTips?t.setTips(r):r;e.elemTemp.find("."+d).html(u),"vertical"===t.type?e.elemTemp.find("."+d).css({bottom:s+"%","margin-bottom":"20px",display:"inline-block"}):e.elemTemp.find("."+d).css({left:s+"%",display:"inline-block"})}).on("mouseout",function(){e.elemTemp.find("."+d).css("display","none")})},f.prototype.slide=function(e,t,a){var n=this,l=n.config,s=n.elemTemp,f=function(){return"vertical"===l.type?l.height:s[0].offsetWidth},h=s.find("."+o),y=s.next("."+v),g=y.children("."+c).children("input").val(),b=100/((l.max-l.min)/Math.ceil(l.step)),x=function(e,i){e=Math.ceil(e)*b>100?Math.ceil(e)*b:Math.round(e)*b,e=e>100?100:e,h.eq(i).css("vertical"===l.type?"bottom":"left",e+"%");var t=T(h[0].offsetLeft),a=l.range?T(h[1].offsetLeft):0;"vertical"===l.type?(s.find("."+d).css({bottom:e+"%","margin-bottom":"20px"}),t=T(f()-h[0].offsetTop-h.height()),a=l.range?T(f()-h[1].offsetTop-h.height()):0):s.find("."+d).css("left",e+"%"),t=t>100?100:t,a=a>100?100:a;var n=Math.min(t,a),o=Math.abs(t-a);"vertical"===l.type?s.find("."+r).css({height:o+"%",bottom:n+"%"}):s.find("."+r).css({width:o+"%",left:n+"%"});var u=l.min+Math.round((l.max-l.min)*e/100);if(g=u,y.children("."+c).children("input").val(g),h.eq(i).data("value",u),u=l.setTips?l.setTips(u):u,s.find("."+d).html(u),l.range){var v=[h.eq(0).data("value"),h.eq(1).data("value")];v[0]>v[1]&&v.reverse()}l.change&&l.change(l.range?v:u)},T=function(e){var i=e/f()*100/b,t=Math.round(i)*b;return e==f()&&(t=Math.ceil(i)*b),t},w=i(['
      f()&&(r=f());var o=r/f()*100/b;x(o,e),t.addClass(p),s.find("."+d).show(),i.preventDefault()},o=function(){t.removeClass(p),s.find("."+d).hide()};M(r,o)})}),s.on("click",function(e){var t=i("."+u);if(!t.is(event.target)&&0===t.has(event.target).length&&t.length){var a,n="vertical"===l.type?f()-e.clientY+i(this).offset().top:e.clientX-i(this).offset().left;n<0&&(n=0),n>f()&&(n=f());var s=n/f()*100/b;a=l.range?"vertical"===l.type?Math.abs(n-parseInt(i(h[0]).css("bottom")))>Math.abs(n-parseInt(i(h[1]).css("bottom")))?1:0:Math.abs(n-h[0].offsetLeft)>Math.abs(n-h[1].offsetLeft)?1:0:0,x(s,a),e.preventDefault()}}),y.hover(function(){var e=i(this);e.children("."+m).fadeIn("fast")},function(){var e=i(this);e.children("."+m).fadeOut("fast")}),y.children("."+m).children("i").each(function(e){i(this).on("click",function(){g=1==e?g-l.stepl.max?l.max:Number(g)+l.step;var i=(g-l.min)/(l.max-l.min)*100/b;x(i,0)})});var q=function(){var e=this.value;e=isNaN(e)?0:e,e=el.max?l.max:e,this.value=e;var i=(e-l.min)/(l.max-l.min)*100/b;x(i,0)};y.children("."+c).children("input").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),q.call(this))}).on("change",q)},f.prototype.events=function(){var e=this;e.config},t.render=function(e){var i=new f(e);return a.call(i)},e(n,t)}); \ No newline at end of file diff --git a/static/frame/layui/lay/modules/table.js b/static/frame/layui/lay/modules/table.js new file mode 100644 index 0000000..fe4e4ee --- /dev/null +++ b/static/frame/layui/lay/modules/table.js @@ -0,0 +1,2 @@ +/** layui-v2.3.0 MIT License By https://www.layui.com */ + ;layui.define(["laytpl","laypage","layer","form"],function(e){"use strict";var t=layui.$,i=layui.laytpl,a=layui.laypage,l=layui.layer,n=layui.form,o=layui.hint(),r=layui.device(),d={config:{checkName:"LAY_CHECKED",indexName:"LAY_TABLE_INDEX"},cache:{},index:layui.table?layui.table.index+1e4:0,set:function(e){var i=this;return i.config=t.extend({},i.config,e),i},on:function(e,t){return layui.onevent.call(this,s,e,t)}},c=function(){var e=this,t=e.config,i=t.id;return i&&(c.config[i]=t),{reload:function(t){e.reload.call(e,t)},config:t}},s="table",u=".layui-table",h="layui-hide",f="layui-none",y="layui-table-view",p=".layui-table-header",m=".layui-table-body",v=".layui-table-main",g=".layui-table-fixed",x=".layui-table-fixed-l",b=".layui-table-fixed-r",k=".layui-table-tool",C=".layui-table-page",w=".layui-table-sort",N="layui-table-edit",T="layui-table-hover",F=function(e){var t='{{#if(item2.colspan){}} colspan="{{item2.colspan}}"{{#} if(item2.rowspan){}} rowspan="{{item2.rowspan}}"{{#}}}';return e=e||{},['
      ',"","{{# layui.each(d.data.cols, function(i1, item1){ }}","","{{# layui.each(item1, function(i2, item2){ }}",'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}','{{# if(item2.fixed === "right"){ right = true; } }}',function(){return e.fixed&&"right"!==e.fixed?'{{# if(item2.fixed && item2.fixed !== "right"){ }}':"right"===e.fixed?'{{# if(item2.fixed === "right"){ }}':""}(),'",e.fixed?"{{# }; }}":"","{{# }); }}","","{{# }); }}","","
      ','
      1){ }}","group","{{# } else { }}","{{d.index}}-{{item2.field || i2}}",'{{# if(item2.type !== "normal"){ }}'," laytable-cell-{{ item2.type }}","{{# } }}","{{# } }}",'" {{#if(item2.align){}}align="{{item2.align}}"{{#}}}>','{{# if(item2.type === "checkbox"){ }}','',"{{# } else { }}",'{{item2.title||""}}',"{{# if(!(item2.colspan > 1) && item2.sort){ }}",'',"{{# } }}","{{# } }}","
      ","
      "].join("")},W=['',"","
      "].join(""),z=['
      ',"{{# if(d.data.toolbar){ }}",'
      ',"{{# } }}",'
      ',"{{# var left, right; }}",'
      ',F(),"
      ",'
      ',W,"
      ","{{# if(left){ }}",'
      ','
      ',F({fixed:!0}),"
      ",'
      ',W,"
      ","
      ","{{# }; }}","{{# if(right){ }}",'
      ','
      ',F({fixed:"right"}),'
      ',"
      ",'
      ',W,"
      ","
      ","{{# }; }}","
      ","{{# if(d.data.page){ }}",'
      ','
      ',"
      ","{{# } }}","","
      "].join(""),A=t(window),S=t(document),M=function(e){var i=this;i.index=++d.index,i.config=t.extend({},i.config,d.config,e),i.render()};M.prototype.config={limit:10,loading:!0,cellMinWidth:60,text:{none:"无数据"}},M.prototype.render=function(){var e=this,a=e.config;if(a.elem=t(a.elem),a.where=a.where||{},a.id=a.id||a.elem.attr("id"),a.request=t.extend({pageName:"page",limitName:"limit"},a.request),a.response=t.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",countName:"count"},a.response),"object"==typeof a.page&&(a.limit=a.page.limit||a.limit,a.limits=a.page.limits||a.limits,e.page=a.page.curr=a.page.curr||1,delete a.page.elem,delete a.page.jump),!a.elem[0])return e;e.setArea();var l=a.elem,n=l.next("."+y),o=e.elem=t(i(z).render({VIEW_CLASS:y,data:a,index:e.index}));if(a.index=e.index,n[0]&&n.remove(),l.after(o),e.layHeader=o.find(p),e.layMain=o.find(v),e.layBody=o.find(m),e.layFixed=o.find(g),e.layFixLeft=o.find(x),e.layFixRight=o.find(b),e.layTool=o.find(k),e.layPage=o.find(C),e.layTool.html(i(t(a.toolbar).html()||"").render(a)),a.height&&e.fullSize(),a.cols.length>1){var r=e.layFixed.find(p).find("th");r.height(e.layHeader.height()-1-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom")))}e.pullData(e.page),e.events()},M.prototype.initOpts=function(e){var t=this,i=(t.config,{checkbox:48,space:15,numbers:40});e.checkbox&&(e.type="checkbox"),e.space&&(e.type="space"),e.type||(e.type="normal"),"normal"!==e.type&&(e.unresize=!0,e.width=e.width||i[e.type])},M.prototype.setArea=function(){var e=this,t=e.config,i=0,a=0,l=0,n=0,o=t.width||function(){var e=function(i){var a,l;i=i||t.elem.parent(),a=i.width();try{l="none"===i.css("display")}catch(n){}return!i[0]||a&&!l?a:e(i.parent())};return e()}();e.eachCols(function(){i++}),o-=function(){return"line"===t.skin||"nob"===t.skin?2:i+1}(),layui.each(t.cols,function(t,i){layui.each(i,function(t,l){var r;return l?(e.initOpts(l),r=l.width||0,void(l.colspan>1||(/\d+%$/.test(r)?l.width=r=Math.floor(parseFloat(r)/100*o):r||(l.width=r=0,a++),n+=r))):void i.splice(t,1)})}),e.autoColNums=a,o>n&&a&&(l=(o-n)/a),layui.each(t.cols,function(e,i){layui.each(i,function(e,i){var a=i.minWidth||t.cellMinWidth;i.colspan>1||0===i.width&&(i.width=Math.floor(l>=a?l:a))})}),t.height&&/^full-\d+$/.test(t.height)&&(e.fullHeightGap=t.height.split("-")[1],t.height=A.height()-e.fullHeightGap)},M.prototype.reload=function(e){var i=this;i.config.data&&i.config.data.constructor===Array&&delete i.config.data,i.config=t.extend({},i.config,e),i.render()},M.prototype.page=1,M.prototype.pullData=function(e,i){var a=this,n=a.config,o=n.request,r=n.response,d=function(){"object"==typeof n.initSort&&a.sort(n.initSort.field,n.initSort.type)};if(a.startTime=(new Date).getTime(),n.url){var c={};c[o.pageName]=e,c[o.limitName]=n.limit;var s=t.extend(c,n.where);n.contentType&&0==n.contentType.indexOf("application/json")&&(s=JSON.stringify(s)),t.ajax({type:n.method||"get",url:n.url,contentType:n.contentType,data:s,dataType:"json",headers:n.headers||{},success:function(t){t[r.statusName]!=r.statusCode?(a.renderForm(),a.layMain.html('
      '+(t[r.msgName]||"返回的数据状态异常")+"
      ")):(a.renderData(t,e,t[r.countName]),d(),n.time=(new Date).getTime()-a.startTime+" ms"),i&&l.close(i),"function"==typeof n.done&&n.done(t,e,t[r.countName])},error:function(e,t){a.layMain.html('
      数据接口请求异常
      '),a.renderForm(),i&&l.close(i)}})}else if(n.data&&n.data.constructor===Array){var u={},h=e*n.limit-n.limit;u[r.dataName]=n.data.concat().splice(h,n.limit),u[r.countName]=n.data.length,a.renderData(u,e,n.data.length),d(),"function"==typeof n.done&&n.done(u,e,u[r.countName])}},M.prototype.eachCols=function(e){var i=t.extend(!0,[],this.config.cols),a=[],l=0;layui.each(i,function(e,t){layui.each(t,function(t,n){if(n.colspan>1){var o=0;l++,n.CHILD_COLS=[],layui.each(i[e+1],function(e,t){t.PARENT_COL||o==n.colspan||(t.PARENT_COL=l,n.CHILD_COLS.push(t),o+=t.colspan>1?t.colspan:1)})}n.PARENT_COL||a.push(n)})});var n=function(t){layui.each(t||a,function(t,i){return i.CHILD_COLS?n(i.CHILD_COLS):void e(t,i)})};n()},M.prototype.renderData=function(e,n,o,r){var c=this,s=c.config,u=e[s.response.dataName]||[],y=[],p=[],m=[],v=function(){return!r&&c.sortKey?c.sort(c.sortKey.field,c.sortKey.sort,!0):(layui.each(u,function(e,a){var l=[],o=[],u=[],h=e+s.limit*(n-1)+1;0!==a.length&&(r||(a[d.config.indexName]=e),c.eachCols(function(e,n){var r=n.field||e,f=a[r];c.getColElem(c.layHeader,r);if(void 0!==f&&null!==f||(f=""),!(n.colspan>1)){var y=['",'
      '+function(){var e=t.extend(!0,{LAY_INDEX:h},a);return"checkbox"===n.type?'":"numbers"===n.type?h:n.toolbar?i(t(n.toolbar).html()||"").render(e):n.templet?function(){return"function"==typeof n.templet?n.templet(e):i(t(n.templet).html()||String(f)).render(e)}():f}(),"
      "].join("");l.push(y),n.fixed&&"right"!==n.fixed&&o.push(y),"right"===n.fixed&&u.push(y)}}),y.push(''+l.join("")+""),p.push(''+o.join("")+""),m.push(''+u.join("")+""))}),c.layBody.scrollTop(0),c.layMain.find("."+f).remove(),c.layMain.find("tbody").html(y.join("")),c.layFixLeft.find("tbody").html(p.join("")),c.layFixRight.find("tbody").html(m.join("")),c.renderForm(),c.syncCheckAll(),c.haveInit?c.scrollPatch():setTimeout(function(){c.scrollPatch()},50),c.haveInit=!0,void l.close(c.tipsIndex))};return c.key=s.id||s.index,d.cache[c.key]=u,c.layPage[0===u.length&&1==n?"addClass":"removeClass"](h),r?v():0===u.length?(c.renderForm(),c.layFixed.remove(),c.layMain.find("tbody").html(""),c.layMain.find("."+f).remove(),c.layMain.append('
      '+s.text.none+"
      ")):(v(),void(s.page&&(s.page=t.extend({elem:"layui-table-page"+s.index,count:o,limit:s.limit,limits:s.limits||[10,20,30,40,50,60,70,80,90],groups:3,layout:["prev","page","next","skip","count","limit"],prev:'',next:'',jump:function(e,t){t||(c.page=e.curr,s.limit=e.limit,c.pullData(e.curr,c.loading()))}},s.page),s.page.count=o,a.render(s.page))))},M.prototype.getColElem=function(e,t){var i=this,a=i.config;return e.eq(0).find(".laytable-cell-"+(a.index+"-"+t)+":eq(0)")},M.prototype.renderForm=function(e){n.render(e,"LAY-table-"+this.index)},M.prototype.sort=function(e,i,a,l){var n,r,c=this,u={},h=c.config,f=h.elem.attr("lay-filter"),y=d.cache[c.key];"string"==typeof e&&c.layHeader.find("th").each(function(i,a){var l=t(this),o=l.data("field");if(o===e)return e=l,n=o,!1});try{var n=n||e.data("field");if(c.sortKey&&!a&&n===c.sortKey.field&&i===c.sortKey.sort)return;var p=c.layHeader.find("th .laytable-cell-"+h.index+"-"+n).find(w);c.layHeader.find("th").find(w).removeAttr("lay-sort"),p.attr("lay-sort",i||null),c.layFixed.find("th")}catch(m){return o.error("Table modules: Did not match to field")}c.sortKey={field:n,sort:i},"asc"===i?r=layui.sort(y,n):"desc"===i?r=layui.sort(y,n,!0):(r=layui.sort(y,d.config.indexName),delete c.sortKey),u[h.response.dataName]=r,c.renderData(u,c.page,c.count,!0),l&&layui.event.call(e,s,"sort("+f+")",{field:n,type:i})},M.prototype.loading=function(){var e=this,t=e.config;if(t.loading&&t.url)return l.msg("数据请求中",{icon:16,offset:[e.elem.offset().top+e.elem.height()/2-35-A.scrollTop()+"px",e.elem.offset().left+e.elem.width()/2-90-A.scrollLeft()+"px"],time:-1,anim:-1,fixed:!1})},M.prototype.setCheckData=function(e,t){var i=this,a=i.config,l=d.cache[i.key];l[e]&&l[e].constructor!==Array&&(l[e][a.checkName]=t)},M.prototype.syncCheckAll=function(){var e=this,t=e.config,i=e.layHeader.find('input[name="layTableCheckbox"]'),a=function(i){return e.eachCols(function(e,a){"checkbox"===a.type&&(a[t.checkName]=i)}),i};i[0]&&(d.checkStatus(e.key).isAll?(i[0].checked||(i.prop("checked",!0),e.renderForm("checkbox")),a(!0)):(i[0].checked&&(i.prop("checked",!1),e.renderForm("checkbox")),a(!1)))},M.prototype.getCssRule=function(e,t){var i=this,a=i.elem.find("style")[0],l=a.sheet||a.styleSheet||{},n=l.cssRules||l.rules;layui.each(n,function(a,l){if(l.selectorText===".laytable-cell-"+i.index+"-"+e)return t(l),!0})},M.prototype.fullSize=function(){var e,t=this,i=t.config,a=i.height;t.fullHeightGap&&(a=A.height()-t.fullHeightGap,a<135&&(a=135),t.elem.css("height",a)),e=parseFloat(a)-parseFloat(t.layHeader.height())-1,i.toolbar&&(e-=t.layTool.outerHeight()),i.page&&(e=e-t.layPage.outerHeight()-1),t.layMain.css("height",e)},M.prototype.getScrollWidth=function(e){var t=0;return e?t=e.offsetWidth-e.clientWidth:(e=document.createElement("div"),e.style.width="100px",e.style.height="100px",e.style.overflowY="scroll",document.body.appendChild(e),t=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),t},M.prototype.scrollPatch=function(){var e=this,i=e.layMain.children("table"),a=e.layMain.width()-e.layMain.prop("clientWidth"),l=e.layMain.height()-e.layMain.prop("clientHeight"),n=e.getScrollWidth(e.layMain[0]),o=i.outerWidth()-e.layMain.width();if(e.autoColNums&&o<5&&!e.scrollPatchWStatus){var r=e.layHeader.eq(0).find("thead th:last-child"),d=r.data("field");e.getCssRule(d,function(t){var i=t.style.width||r.outerWidth();t.style.width=parseFloat(i)-n-o+"px",e.layMain.height()-e.layMain.prop("clientHeight")>0&&(t.style.width=parseFloat(t.style.width)-1+"px"),e.scrollPatchWStatus=!0})}if(a&&l){if(!e.elem.find(".layui-table-patch")[0]){var c=t('
      ');c.find("div").css({width:a}),e.layHeader.eq(0).find("thead tr").append(c)}}else e.layHeader.eq(0).find(".layui-table-patch").remove();var s=e.layMain.height(),u=s-l;e.layFixed.find(m).css("height",i.height()>u?u:"auto"),e.layFixRight[o>0?"removeClass":"addClass"](h),e.layFixRight.css("right",a-1)},M.prototype.events=function(){var e,a=this,n=a.config,o=t("body"),c={},u=a.layHeader.find("th"),h=".layui-table-cell",f=n.elem.attr("lay-filter");u.on("mousemove",function(e){var i=t(this),a=i.offset().left,l=e.clientX-a;i.attr("colspan")>1||i.data("unresize")||c.resizeStart||(c.allowResize=i.width()-l<=10,o.css("cursor",c.allowResize?"col-resize":""))}).on("mouseleave",function(){t(this);c.resizeStart||o.css("cursor","")}).on("mousedown",function(e){var i=t(this);if(c.allowResize){var l=i.data("field");e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],a.getCssRule(l,function(e){var t=e.style.width||i.outerWidth();c.rule=e,c.ruleWidth=parseFloat(t),c.minWidth=i.data("minwidth")||n.cellMinWidth})}}),S.on("mousemove",function(t){if(c.resizeStart){if(t.preventDefault(),c.rule){var i=c.ruleWidth+t.clientX-c.offset[0];i');d[0].value=e.data("content")||o.text(),e.find("."+N)[0]||e.append(d),d.focus()}else o.find(".layui-form-switch,.layui-form-checkbox")[0]||Math.round(o.prop("scrollWidth"))>Math.round(o.outerWidth())&&(a.tipsIndex=l.tips(['
      ',o.html(),"
      ",'ဆ'].join(""),o[0],{tips:[3,""],time:-1,anim:-1,maxWidth:r.ios||r.android?300:600,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){l.close(t)})}}))}),a.layBody.on("click","*[lay-event]",function(){var e=t(this),l=e.parents("tr").eq(0).data("index"),n=a.layBody.find('tr[data-index="'+l+'"]'),o="layui-table-click",r=d.cache[a.key][l];layui.event.call(this,s,"tool("+f+")",{data:d.clearCacheKey(r),event:e.attr("lay-event"),tr:n,del:function(){d.cache[a.key][l]=[],n.remove(),a.scrollPatch()},update:function(e){e=e||{},layui.each(e,function(e,l){if(e in r){var o,d=n.children('td[data-field="'+e+'"]');r[e]=l,a.eachCols(function(t,i){i.field==e&&i.templet&&(o=i.templet)}),d.children(h).html(o?i(t(o).html()||l).render(r):l),d.data("content",l)}})}}),n.addClass(o).siblings("tr").removeClass(o)}),a.layMain.on("scroll",function(){var e=t(this),i=e.scrollLeft(),n=e.scrollTop();a.layHeader.scrollLeft(i),a.layFixed.find(m).scrollTop(n),l.close(a.tipsIndex)}),A.on("resize",function(){a.fullSize(),a.scrollPatch()})},d.init=function(e,i){i=i||{};var a=this,l=t(e?'table[lay-filter="'+e+'"]':u+"[lay-data]"),n="Table element property lay-data configuration item has a syntax error: ";return l.each(function(){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){o.error(n+l)}var c=[],s=t.extend({elem:this,cols:[],data:[],skin:a.attr("lay-skin"),size:a.attr("lay-size"),even:"string"==typeof a.attr("lay-even")},d.config,i,l);e&&a.hide(),a.find("thead>tr").each(function(e){s.cols[e]=[],t(this).children().each(function(i){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){return o.error(n+l)}var d=t.extend({title:a.text(),colspan:a.attr("colspan")||0,rowspan:a.attr("rowspan")||0},l);d.colspan<2&&c.push(d),s.cols[e].push(d)})}),a.find("tbody>tr").each(function(e){var i=t(this),a={};i.children("td").each(function(e,i){var l=t(this),n=l.data("field");if(n)return a[n]=l.html()}),layui.each(c,function(e,t){var l=i.children("td").eq(e);a[t.field]=l.html()}),s.data[e]=a}),d.render(s)}),a},d.checkStatus=function(e){var t=0,i=0,a=[],l=d.cache[e]||[];return layui.each(l,function(e,l){return l.constructor===Array?void i++:void(l[d.config.checkName]&&(t++,a.push(d.clearCacheKey(l))))}),{data:a,isAll:!!l.length&&t===l.length-i}},c.config={},d.reload=function(e,i){var a=c.config[e];return i=i||{},a?(i.data&&i.data.constructor===Array&&delete a.data,d.render(t.extend(!0,{},a,i))):o.error("The ID option was not found in the table instance")},d.render=function(e){var t=new M(e);return c.call(t)},d.clearCacheKey=function(e){return e=t.extend({},e),delete e[d.config.checkName],delete e[d.config.indexName],e},d.init(),e(s,d)}); \ No newline at end of file diff --git a/static/frame/layui/lay/modules/tree.js b/static/frame/layui/lay/modules/tree.js new file mode 100644 index 0000000..ed01acb --- /dev/null +++ b/static/frame/layui/lay/modules/tree.js @@ -0,0 +1,2 @@ +/** layui-v2.3.0 MIT License By https://www.layui.com */ + ;layui.define("jquery",function(e){"use strict";var o=layui.$,a=layui.hint(),i="layui-tree-enter",r=function(e){this.options=e},t={arrow:["",""],checkbox:["",""],radio:["",""],branch:["",""],leaf:""};r.prototype.init=function(e){var o=this;e.addClass("layui-box layui-tree"),o.options.skin&&e.addClass("layui-tree-skin-"+o.options.skin),o.tree(e),o.on(e)},r.prototype.tree=function(e,a){var i=this,r=i.options,n=a||r.nodes;layui.each(n,function(a,n){var l=n.children&&n.children.length>0,c=o('
        '),s=o(["
      • ",function(){return l?''+(n.spread?t.arrow[1]:t.arrow[0])+"":""}(),function(){return r.check?''+("checkbox"===r.check?t.checkbox[0]:"radio"===r.check?t.radio[0]:"")+"":""}(),function(){return'"+(''+(l?n.spread?t.branch[1]:t.branch[0]:t.leaf)+"")+(""+(n.name||"未命名")+"")}(),"
      • "].join(""));l&&(s.append(c),i.tree(c,n.children)),e.append(s),"function"==typeof r.click&&i.click(s,n),i.spread(s,n),r.drag&&i.drag(s,n)})},r.prototype.click=function(e,o){var a=this,i=a.options;e.children("a").on("click",function(e){layui.stope(e),i.click(o)})},r.prototype.spread=function(e,o){var a=this,i=(a.options,e.children(".layui-tree-spread")),r=e.children("ul"),n=e.children("a"),l=function(){e.data("spread")?(e.data("spread",null),r.removeClass("layui-show"),i.html(t.arrow[0]),n.find(".layui-icon").html(t.branch[0])):(e.data("spread",!0),r.addClass("layui-show"),i.html(t.arrow[1]),n.find(".layui-icon").html(t.branch[1]))};r[0]&&(i.on("click",l),n.on("dblclick",l))},r.prototype.on=function(e){var a=this,r=a.options,t="layui-tree-drag";e.find("i").on("selectstart",function(e){return!1}),r.drag&&o(document).on("mousemove",function(e){var i=a.move;if(i.from){var r=(i.to,o('
        '));e.preventDefault(),o("."+t)[0]||o("body").append(r);var n=o("."+t)[0]?o("."+t):r;n.addClass("layui-show").html(i.from.elem.children("a").html()),n.css({left:e.pageX+10,top:e.pageY+10})}}).on("mouseup",function(){var e=a.move;e.from&&(e.from.elem.children("a").removeClass(i),e.to&&e.to.elem.children("a").removeClass(i),a.move={},o("."+t).remove())})},r.prototype.move={},r.prototype.drag=function(e,a){var r=this,t=(r.options,e.children("a")),n=function(){var t=o(this),n=r.move;n.from&&(n.to={item:a,elem:e},t.addClass(i))};t.on("mousedown",function(){var o=r.move;o.from={item:a,elem:e}}),t.on("mouseenter",n).on("mousemove",n).on("mouseleave",function(){var e=o(this),a=r.move;a.from&&(delete a.to,e.removeClass(i))})},e("tree",function(e){var i=new r(e=e||{}),t=o(e.elem);return t[0]?void i.init(t):a.error("layui.tree 没有找到"+e.elem+"元素")})}); \ No newline at end of file diff --git a/static/frame/layui/lay/modules/upload.js b/static/frame/layui/lay/modules/upload.js new file mode 100644 index 0000000..469a13f --- /dev/null +++ b/static/frame/layui/lay/modules/upload.js @@ -0,0 +1,2 @@ +/** layui-v2.3.0 MIT License By https://www.layui.com */ + ;layui.define("layer",function(e){"use strict";var i=layui.$,t=layui.layer,n=layui.hint(),a=layui.device(),o={config:{},set:function(e){var t=this;return t.config=i.extend({},t.config,e),t},on:function(e,i){return layui.onevent.call(this,r,e,i)}},l=function(){var e=this;return{upload:function(i){e.upload.call(e,i)},config:e.config}},r="upload",u="layui-upload-file",c="layui-upload-form",f="layui-upload-iframe",s="layui-upload-choose",p=function(e){var t=this;t.config=i.extend({},t.config,o.config,e),t.render()};p.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",field:"file",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1},p.prototype.render=function(e){var t=this,e=t.config;e.elem=i(e.elem),e.bindAction=i(e.bindAction),t.file(),t.events()},p.prototype.file=function(){var e=this,t=e.config,n=e.elemFile=i(['"].join("")),o=t.elem.next();(o.hasClass(u)||o.hasClass(c))&&o.remove(),a.ie&&a.ie<10&&t.elem.wrap('
        '),e.isFile()?(e.elemFile=t.elem,t.field=t.elem[0].name):t.elem.after(n),a.ie&&a.ie<10&&e.initIE()},p.prototype.initIE=function(){var e=this,t=e.config,n=i(''),a=i(['
        ',"
        "].join(""));i("#"+f)[0]||i("body").append(n),t.elem.next().hasClass(c)||(e.elemFile.wrap(a),t.elem.next("."+c).append(function(){var e=[];return layui.each(t.data,function(i,t){t="function"==typeof t?t():t,e.push('')}),e.join("")}()))},p.prototype.msg=function(e){return t.msg(e,{icon:2,shift:6})},p.prototype.isFile=function(){var e=this.config.elem[0];if(e)return"input"===e.tagName.toLocaleLowerCase()&&"file"===e.type},p.prototype.preview=function(e){var i=this;window.FileReader&&layui.each(i.chooseFiles,function(i,t){var n=new FileReader;n.readAsDataURL(t),n.onload=function(){e&&e(i,t,this.result)}})},p.prototype.upload=function(e,t){var n,o=this,l=o.config,r=o.elemFile[0],u=function(){var t=0,n=0,a=e||o.files||o.chooseFiles||r.files,u=function(){l.multiple&&t+n===o.fileLength&&"function"==typeof l.allDone&&l.allDone({total:o.fileLength,successful:t,aborted:n})};layui.each(a,function(e,a){var r=new FormData;r.append(l.field,a),layui.each(l.data,function(e,i){i="function"==typeof i?i():i,r.append(e,i)}),i.ajax({url:l.url,type:l.method,data:r,contentType:!1,processData:!1,dataType:"json",headers:l.headers||{},success:function(i){t++,d(e,i),u()},error:function(){n++,o.msg("请求上传接口出现异常"),m(e),u()}})})},c=function(){var e=i("#"+f);o.elemFile.parent().submit(),clearInterval(p.timer),p.timer=setInterval(function(){var i,t=e.contents().find("body");try{i=t.text()}catch(n){o.msg("获取上传后的响应信息出现异常"),clearInterval(p.timer),m()}i&&(clearInterval(p.timer),t.html(""),d(0,i))},30)},d=function(e,i){if(o.elemFile.next("."+s).remove(),r.value="","object"!=typeof i)try{i=JSON.parse(i)}catch(t){return i={},o.msg("请对上传接口返回有效JSON")}"function"==typeof l.done&&l.done(i,e||0,function(e){o.upload(e)})},m=function(e){l.auto&&(r.value=""),"function"==typeof l.error&&l.error(e||0,function(e){o.upload(e)})},h=l.exts,v=function(){var i=[];return layui.each(e||o.chooseFiles,function(e,t){i.push(t.name)}),i}(),g={preview:function(e){o.preview(e)},upload:function(e,i){var t={};t[e]=i,o.upload(t)},pushFile:function(){return o.files=o.files||{},layui.each(o.chooseFiles,function(e,i){o.files[e]=i}),o.files},resetFile:function(e,i,t){var n=new File([i],t);o.files=o.files||{},o.files[e]=n}},y=function(){if("choose"!==t&&!l.auto||(l.choose&&l.choose(g),"choose"!==t))return l.before&&l.before(g),a.ie?a.ie>9?u():c():void u()};if(v=0===v.length?r.value.match(/[^\/\\]+\..+/g)||[]||"":v,0!==v.length){switch(l.accept){case"file":if(h&&!RegExp("\\w\\.("+h+")$","i").test(escape(v)))return o.msg("选择的文件中包含不支持的格式"),r.value="";break;case"video":if(!RegExp("\\w\\.("+(h||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(v)))return o.msg("选择的视频中包含不支持的格式"),r.value="";break;case"audio":if(!RegExp("\\w\\.("+(h||"mp3|wav|mid")+")$","i").test(escape(v)))return o.msg("选择的音频中包含不支持的格式"),r.value="";break;default:if(layui.each(v,function(e,i){RegExp("\\w\\.("+(h||"jpg|png|gif|bmp|jpeg$")+")","i").test(escape(i))||(n=!0)}),n)return o.msg("选择的图片中包含不支持的格式"),r.value=""}if(o.fileLength=function(){var i=0,t=e||o.files||o.chooseFiles||r.files;return layui.each(t,function(){i++}),i}(),l.number&&o.fileLength>l.number)return o.msg("同时最多只能上传的数量为:"+l.number);if(l.size>0&&!(a.ie&&a.ie<10)){var F;if(layui.each(o.chooseFiles,function(e,i){if(i.size>1024*l.size){var t=l.size/1024;t=t>=1?t.toFixed(2)+"MB":l.size+"KB",r.value="",F=t}}),F)return o.msg("文件不能超过"+F)}y()}},p.prototype.events=function(){var e=this,t=e.config,o=function(i){e.chooseFiles={},layui.each(i,function(i,t){var n=(new Date).getTime();e.chooseFiles[n+"-"+i]=t})},l=function(i,n){var a=e.elemFile,o=i.length>1?i.length+"个文件":(i[0]||{}).name||a[0].value.match(/[^\/\\]+\..+/g)||[]||"";a.next().hasClass(s)&&a.next().remove(),e.upload(null,"choose"),e.isFile()||t.choose||a.after(''+o+"")};t.elem.off("upload.start").on("upload.start",function(){var a=i(this),o=a.attr("lay-data");if(o)try{o=new Function("return "+o)(),e.config=i.extend({},t,o)}catch(l){n.error("Upload element property lay-data configuration item has a syntax error: "+o)}e.config.item=a,e.elemFile[0].click()}),a.ie&&a.ie<10||t.elem.off("upload.over").on("upload.over",function(){var e=i(this);e.attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){var e=i(this);e.removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(n,a){var r=i(this),u=a.originalEvent.dataTransfer.files||[];r.removeAttr("lay-over"),o(u),t.auto?e.upload(u):l(u)}),e.elemFile.off("upload.change").on("upload.change",function(){var i=this.files||[];o(i),t.auto?e.upload():l(i)}),t.bindAction.off("upload.action").on("upload.action",function(){e.upload()}),t.elem.data("haveEvents")||(e.elemFile.on("change",function(){i(this).trigger("upload.change")}),t.elem.on("click",function(){e.isFile()||i(this).trigger("upload.start")}),t.drag&&t.elem.on("dragover",function(e){e.preventDefault(),i(this).trigger("upload.over")}).on("dragleave",function(e){i(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),i(this).trigger("upload.drop",e)}),t.bindAction.on("click",function(){i(this).trigger("upload.action")}),t.elem.data("haveEvents",!0))},o.render=function(e){var i=new p(e);return l.call(i)},e(r,o)}); \ No newline at end of file diff --git a/static/frame/layui/lay/modules/util.js b/static/frame/layui/lay/modules/util.js new file mode 100644 index 0000000..32bffa4 --- /dev/null +++ b/static/frame/layui/lay/modules/util.js @@ -0,0 +1,2 @@ +/** layui-v2.3.0 MIT License By https://www.layui.com */ + ;layui.define("jquery",function(e){"use strict";var t=layui.$,i={fixbar:function(e){var i,a,o="layui-fixbar",r="layui-fixbar-top",l=t(document),n=t("body");e=t.extend({showHeight:200},e),e.bar1=e.bar1===!0?"":e.bar1,e.bar2=e.bar2===!0?"":e.bar2,e.bgcolor=e.bgcolor?"background-color:"+e.bgcolor:"";var c=[e.bar1,e.bar2,""],g=t(['
          ',e.bar1?'
        • '+c[0]+"
        • ":"",e.bar2?'
        • '+c[1]+"
        • ":"",'
        • '+c[2]+"
        • ","
        "].join("")),u=g.find("."+r),s=function(){var t=l.scrollTop();t>=e.showHeight?i||(u.show(),i=1):i&&(u.hide(),i=0)};t("."+o)[0]||("object"==typeof e.css&&g.css(e.css),n.append(g),s(),g.find("li").on("click",function(){var i=t(this),a=i.attr("lay-type");"top"===a&&t("html,body").animate({scrollTop:0},200),e.click&&e.click.call(this,a)}),l.on("scroll",function(){clearTimeout(a),a=setTimeout(function(){s()},100)}))},countdown:function(e,t,i){var a=this,o="function"==typeof t,r=new Date(e).getTime(),l=new Date(!t||o?(new Date).getTime():t).getTime(),n=r-l,c=[Math.floor(n/864e5),Math.floor(n/36e5)%24,Math.floor(n/6e4)%60,Math.floor(n/1e3)%60];o&&(i=t);var g=setTimeout(function(){a.countdown(e,l+1e3,i)},1e3);return i&&i(n>0?c:[0,0,0,0],t,g),n<=0&&clearTimeout(g),g},timeAgo:function(e,t){var i=this,a=[[],[]],o=(new Date).getTime()-new Date(e).getTime();return o>6912e5?(o=new Date(e),a[0][0]=i.digit(o.getFullYear(),4),a[0][1]=i.digit(o.getMonth()+1),a[0][2]=i.digit(o.getDate()),t||(a[1][0]=i.digit(o.getHours()),a[1][1]=i.digit(o.getMinutes()),a[1][2]=i.digit(o.getSeconds())),a[0].join("-")+" "+a[1].join(":")):o>=864e5?(o/1e3/60/60/24|0)+"天前":o>=36e5?(o/1e3/60/60|0)+"小时前":o>=12e4?(o/1e3/60|0)+"分钟前":o<0?"未来":"刚刚"},digit:function(e,t){var i="";e=String(e),t=t||2;for(var a=e.length;a/g,">").replace(/'/g,"'").replace(/"/g,""")}};e("util",i)}); \ No newline at end of file diff --git a/static/frame/layui/layui.all.js b/static/frame/layui/layui.all.js new file mode 100644 index 0000000..e2a7e01 --- /dev/null +++ b/static/frame/layui/layui.all.js @@ -0,0 +1,5 @@ +/** layui-v2.3.0 MIT License By https://www.layui.com */ + ;!function(e){"use strict";var t=document,n={modules:{},status:{},timeout:10,event:{}},o=function(){this.v="2.3.0"},r=function(){var e=t.currentScript?t.currentScript.src:function(){for(var e,n=t.scripts,o=n.length-1,r=o;r>0;r--)if("interactive"===n[r].readyState){e=n[r].src;break}return e||n[o].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),a=function(t){e.console&&console.error&&console.error("Layui hint: "+t)},i="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),u={layer:"modules/layer",laydate:"modules/laydate",laypage:"modules/laypage",laytpl:"modules/laytpl",layim:"modules/layim",layedit:"modules/layedit",form:"modules/form",upload:"modules/upload",tree:"modules/tree",table:"modules/table",element:"modules/element",rate:"modules/rate",carousel:"modules/carousel",flow:"modules/flow",util:"modules/util",code:"modules/code",jquery:"modules/jquery",mobile:"modules/mobile","layui.all":"../layui.all"};o.prototype.cache=n,o.prototype.define=function(e,t){var o=this,r="function"==typeof e,a=function(){var e=function(e,t){layui[e]=t,n.status[e]=!0};return"function"==typeof t&&t(function(o,r){e(o,r),n.callback[o]=function(){t(e)}}),this};return r&&(t=e,e=[]),layui["layui.all"]||!layui["layui.all"]&&layui["layui.mobile"]?a.call(o):(o.use(e,a),o)},o.prototype.use=function(e,o,l){function s(e,t){var o="PLaySTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/;("load"===e.type||o.test((e.currentTarget||e.srcElement).readyState))&&(n.modules[d]=t,f.removeChild(v),function r(){return++m>1e3*n.timeout/4?a(d+" is not a valid module"):void(n.status[d]?c():setTimeout(r,4))}())}function c(){l.push(layui[d]),e.length>1?y.use(e.slice(1),o,l):"function"==typeof o&&o.apply(layui,l)}var y=this,p=n.dir=n.dir?n.dir:r,f=t.getElementsByTagName("head")[0];e="string"==typeof e?[e]:e,window.jQuery&&jQuery.fn.on&&(y.each(e,function(t,n){"jquery"===n&&e.splice(t,1)}),layui.jquery=layui.$=jQuery);var d=e[0],m=0;if(l=l||[],n.host=n.host||(p.match(/\/\/([\s\S]+?)\//)||["//"+location.host+"/"])[0],0===e.length||layui["layui.all"]&&u[d]||!layui["layui.all"]&&layui["layui.mobile"]&&u[d])return c(),y;if(n.modules[d])!function g(){return++m>1e3*n.timeout/4?a(d+" is not a valid module"):void("string"==typeof n.modules[d]&&n.status[d]?c():setTimeout(g,4))}();else{var v=t.createElement("script"),h=(u[d]?p+"lay/":/^\{\/\}/.test(y.modules[d])?"":n.base||"")+(y.modules[d]||d)+".js";h=h.replace(/^\{\/\}/,""),v.async=!0,v.charset="utf-8",v.src=h+function(){var e=n.version===!0?n.v||(new Date).getTime():n.version||"";return e?"?v="+e:""}(),f.appendChild(v),!v.attachEvent||v.attachEvent.toString&&v.attachEvent.toString().indexOf("[native code")<0||i?v.addEventListener("load",function(e){s(e,h)},!1):v.attachEvent("onreadystatechange",function(e){s(e,h)}),n.modules[d]=h}return y},o.prototype.getStyle=function(t,n){var o=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return o[o.getPropertyValue?"getPropertyValue":"getAttribute"](n)},o.prototype.link=function(e,o,r){var i=this,u=t.createElement("link"),l=t.getElementsByTagName("head")[0];"string"==typeof o&&(r=o);var s=(r||e).replace(/\.|\//g,""),c=u.id="layuicss-"+s,y=0;return u.rel="stylesheet",u.href=e+(n.debug?"?v="+(new Date).getTime():""),u.media="all",t.getElementById(c)||l.appendChild(u),"function"!=typeof o?i:(function p(){return++y>1e3*n.timeout/100?a(e+" timeout"):void(1989===parseInt(i.getStyle(t.getElementById(c),"width"))?function(){o()}():setTimeout(p,100))}(),i)},n.callback={},o.prototype.factory=function(e){if(layui[e])return"function"==typeof n.callback[e]?n.callback[e]:null},o.prototype.addcss=function(e,t,o){return layui.link(n.dir+"css/"+e,t,o)},o.prototype.img=function(e,t,n){var o=new Image;return o.src=e,o.complete?t(o):(o.onload=function(){o.onload=null,"function"==typeof t&&t(o)},void(o.onerror=function(e){o.onerror=null,"function"==typeof n&&n(e)}))},o.prototype.config=function(e){e=e||{};for(var t in e)n[t]=e[t];return this},o.prototype.modules=function(){var e={};for(var t in u)e[t]=u[t];return e}(),o.prototype.extend=function(e){var t=this;e=e||{};for(var n in e)t[n]||t.modules[n]?a("模块名 "+n+" 已被占用"):t.modules[n]=e[n];return t},o.prototype.router=function(e){var t=this,e=e||location.hash,n={path:[],search:{},hash:(e.match(/[^#](#.*$)/)||[])[1]||""};return/^#\//.test(e)?(e=e.replace(/^#\//,""),n.href="/"+e,e=e.replace(/([^#])(#.*$)/,"$1").split("/")||[],t.each(e,function(e,t){/^\w+=/.test(t)?function(){t=t.split("="),n.search[t[0]]=t[1]}():n.path.push(t)}),n):n},o.prototype.data=function(t,n,o){if(t=t||"layui",o=o||localStorage,e.JSON&&e.JSON.parse){if(null===n)return delete o[t];n="object"==typeof n?n:{key:n};try{var r=JSON.parse(o[t])}catch(a){var r={}}return"value"in n&&(r[n.key]=n.value),n.remove&&delete r[n.key],o[t]=JSON.stringify(r),n.key?r[n.key]:r}},o.prototype.sessionData=function(e,t){return this.data(e,t,sessionStorage)},o.prototype.device=function(t){var n=navigator.userAgent.toLowerCase(),o=function(e){var t=new RegExp(e+"/([^\\s\\_\\-]+)");return e=(n.match(t)||[])[1],e||!1},r={os:function(){return/windows/.test(n)?"windows":/linux/.test(n)?"linux":/iphone|ipod|ipad|ios/.test(n)?"ios":/mac/.test(n)?"mac":void 0}(),ie:function(){return!!(e.ActiveXObject||"ActiveXObject"in e)&&((n.match(/msie\s(\d+)/)||[])[1]||"11")}(),weixin:o("micromessenger")};return t&&!r[t]&&(r[t]=o(t)),r.android=/android/.test(n),r.ios="ios"===r.os,r},o.prototype.hint=function(){return{error:a}},o.prototype.each=function(e,t){var n,o=this;if("function"!=typeof t)return o;if(e=e||[],e.constructor===Object){for(n in e)if(t.call(e[n],n,e[n]))break}else for(n=0;na?1:r/g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var c="Laytpl Error:";return"object"==typeof console&&console.error(c+e+"\n"+(r||"")),c+e}},n=c.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=n("^"+r.open+"#",""),l=n(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(n(r.open+"#"),r.open+"# ").replace(n(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(n(r.open+"!(.+?)!"+r.close),function(e){return e=e.replace(n("^"+r.open+"!"),"").replace(n("!"+r.close),"").replace(n(r.open+"|"+r.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(c.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(c.query(1),function(e){var c='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(n(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),c='"+_escape_('),c+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,c.escape)}catch(u){return delete o.cache,c.error(u,p)}},t.pt.render=function(e,r){var n,t=this;return e?(n=t.cache?t.cache(e,c.escape):t.parse(t.tpl,e),r?void r(n):n):c.error("no data")};var o=function(e){return"string"!=typeof e?c.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var c in e)r[c]=e[c]},o.v="1.2.0",e("laytpl",o)});layui.define(function(e){"use strict";var a=document,t="getElementById",n="getElementsByTagName",i="laypage",r="layui-disabled",u=function(e){var a=this;a.config=e||{},a.config.index=++s.index,a.render(!0)};u.prototype.type=function(){var e=this.config;if("object"==typeof e.elem)return void 0===e.elem.length?2:3},u.prototype.view=function(){var e=this,a=e.config,t=a.groups="groups"in a?0|a.groups:5;a.layout="object"==typeof a.layout?a.layout:["prev","page","next"],a.count=0|a.count,a.curr=0|a.curr||1,a.limits="object"==typeof a.limits?a.limits:[10,20,30,40,50],a.limit=0|a.limit||10,a.pages=Math.ceil(a.count/a.limit)||1,a.curr>a.pages&&(a.curr=a.pages),t<0?t=1:t>a.pages&&(t=a.pages),a.prev="prev"in a?a.prev:"上一页",a.next="next"in a?a.next:"下一页";var n=a.pages>t?Math.ceil((a.curr+(t>1?1:0))/(t>0?t:1)):1,i={prev:function(){return a.prev?''+a.prev+"":""}(),page:function(){var e=[];if(a.count<1)return"";n>1&&a.first!==!1&&0!==t&&e.push(''+(a.first||1)+"");var i=Math.floor((t-1)/2),r=n>1?a.curr-i:1,u=n>1?function(){var e=a.curr+(t-i-1);return e>a.pages?a.pages:e}():t;for(u-r2&&e.push('…');r<=u;r++)r===a.curr?e.push('"+r+""):e.push(''+r+"");return a.pages>t&&a.pages>u&&a.last!==!1&&(u+1…'),0!==t&&e.push(''+(a.last||a.pages)+"")),e.join("")}(),next:function(){return a.next?''+a.next+"":""}(),count:'共 '+a.count+" 条",limit:function(){var e=['"}(),refresh:['','',""].join(""),skip:function(){return['到第','','页',""].join("")}()};return['
        ',function(){var e=[];return layui.each(a.layout,function(a,t){i[t]&&e.push(i[t])}),e.join("")}(),"
        "].join("")},u.prototype.jump=function(e,a){if(e){var t=this,i=t.config,r=e.children,u=e[n]("button")[0],l=e[n]("input")[0],p=e[n]("select")[0],c=function(){var e=0|l.value.replace(/\s|\D/g,"");e&&(i.curr=e,t.render())};if(a)return c();for(var o=0,y=r.length;oi.pages||(i.curr=e,t.render())});p&&s.on(p,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),u&&s.on(u,"click",function(){c()})}},u.prototype.skip=function(e){if(e){var a=this,t=e[n]("input")[0];t&&s.on(t,"keyup",function(t){var n=this.value,i=t.keyCode;/^(37|38|39|40)$/.test(i)||(/\D/.test(n)&&(this.value=n.replace(/\D/,"")),13===i&&a.jump(e,!0))})}},u.prototype.render=function(e){var n=this,i=n.config,r=n.type(),u=n.view();2===r?i.elem&&(i.elem.innerHTML=u):3===r?i.elem.html(u):a[t](i.elem)&&(a[t](i.elem).innerHTML=u),i.jump&&i.jump(i,e);var s=a[t]("layui-laypage-"+i.index);n.jump(s),i.hash&&!e&&(location.hash="!"+i.hash+"="+i.curr),n.skip(s)};var s={render:function(e){var a=new u(e);return a.index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(e,a,t){return e.attachEvent?e.attachEvent("on"+a,function(a){a.target=a.srcElement,t.call(e,a)}):e.addEventListener(a,t,!1),this}};e(i,s)});!function(){"use strict";var e=window.layui&&layui.define,t={getPath:function(){var e=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,n=t.length-1,a=n;a>0;a--)if("interactive"===t[a].readyState){e=t[a].src;break}return e||t[n].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),getStyle:function(e,t){var n=e.currentStyle?e.currentStyle:window.getComputedStyle(e,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](t)},link:function(e,a,i){if(n.path){var r=document.getElementsByTagName("head")[0],o=document.createElement("link");"string"==typeof a&&(i=a);var s=(i||e).replace(/\.|\//g,""),l="layuicss-"+s,d=0;o.rel="stylesheet",o.href=n.path+e,o.id=l,document.getElementById(l)||r.appendChild(o),"function"==typeof a&&!function c(){return++d>80?window.console&&console.error("laydate.css: Invalid"):void(1989===parseInt(t.getStyle(document.getElementById(l),"width"))?a():setTimeout(c,100))}()}}},n={v:"5.0.9",config:{},index:window.laydate&&window.laydate.v?1e5:0,path:t.getPath,set:function(e){var t=this;return t.config=w.extend({},t.config,e),t},ready:function(a){var i="laydate",r="",o=(e?"modules/laydate/":"theme/")+"default/laydate.css?v="+n.v+r;return e?layui.addcss(o,a,i):t.link(o,a,i),this}},a=function(){var e=this;return{hint:function(t){e.hint.call(e,t)},config:e.config}},i="laydate",r=".layui-laydate",o="layui-this",s="laydate-disabled",l="开始日期超出了结束日期
        建议重新选择",d=[100,2e5],c="layui-laydate-static",m="layui-laydate-list",u="laydate-selected",h="layui-laydate-hint",y="laydate-day-prev",f="laydate-day-next",p="layui-laydate-footer",g=".laydate-btns-confirm",v="laydate-time-text",D=".laydate-btns-time",T=function(e){var t=this;t.index=++n.index,t.config=w.extend({},t.config,n.config,e),n.ready(function(){t.init()})},w=function(e){return new C(e)},C=function(e){for(var t=0,n="object"==typeof e?[e]:(this.selector=e,document.querySelectorAll(e||null));t0)return n[0].getAttribute(e)}():n.each(function(n,a){a.setAttribute(e,t)})},C.prototype.removeAttr=function(e){return this.each(function(t,n){n.removeAttribute(e)})},C.prototype.html=function(e){return this.each(function(t,n){n.innerHTML=e})},C.prototype.val=function(e){return this.each(function(t,n){n.value=e})},C.prototype.append=function(e){return this.each(function(t,n){"object"==typeof e?n.appendChild(e):n.innerHTML=n.innerHTML+e})},C.prototype.remove=function(e){return this.each(function(t,n){e?n.removeChild(e):n.parentNode.removeChild(n)})},C.prototype.on=function(e,t){return this.each(function(n,a){a.attachEvent?a.attachEvent("on"+e,function(e){e.target=e.srcElement,t.call(a,e)}):a.addEventListener(e,t,!1)})},C.prototype.off=function(e,t){return this.each(function(n,a){a.detachEvent?a.detachEvent("on"+e,t):a.removeEventListener(e,t,!1)})},T.isLeapYear=function(e){return e%4===0&&e%100!==0||e%400===0},T.prototype.config={type:"date",range:!1,format:"yyyy-MM-dd",value:null,isInitValue:!0,min:"1900-1-1",max:"2099-12-31",trigger:"focus",show:!1,showBottom:!0,btns:["clear","now","confirm"],lang:"cn",theme:"default",position:null,calendar:!1,mark:{},zIndex:null,done:null,change:null},T.prototype.lang=function(){var e=this,t=e.config,n={cn:{weeks:["日","一","二","三","四","五","六"],time:["时","分","秒"],timeTips:"选择时间",startTime:"开始时间",endTime:"结束时间",dateTips:"返回日期",month:["一","二","三","四","五","六","七","八","九","十","十一","十二"],tools:{confirm:"确定",clear:"清空",now:"现在"}},en:{weeks:["Su","Mo","Tu","We","Th","Fr","Sa"],time:["Hours","Minutes","Seconds"],timeTips:"Select Time",startTime:"Start Time",endTime:"End Time",dateTips:"Select Date",month:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],tools:{confirm:"Confirm",clear:"Clear",now:"Now"}}};return n[t.lang]||n.cn},T.prototype.init=function(){var e=this,t=e.config,n="yyyy|y|MM|M|dd|d|HH|H|mm|m|ss|s",a="static"===t.position,i={year:"yyyy",month:"yyyy-MM",date:"yyyy-MM-dd",time:"HH:mm:ss",datetime:"yyyy-MM-dd HH:mm:ss"};t.elem=w(t.elem),t.eventElem=w(t.eventElem),t.elem[0]&&(t.range===!0&&(t.range="-"),t.format===i.date&&(t.format=i[t.type]),e.format=t.format.match(new RegExp(n+"|.","g"))||[],e.EXP_IF="",e.EXP_SPLIT="",w.each(e.format,function(t,a){var i=new RegExp(n).test(a)?"\\d{"+function(){return new RegExp(n).test(e.format[0===t?t+1:t-1]||"")?/^yyyy|y$/.test(a)?4:a.length:/^yyyy$/.test(a)?"1,4":/^y$/.test(a)?"1,308":"1,2"}()+"}":"\\"+a;e.EXP_IF=e.EXP_IF+i,e.EXP_SPLIT=e.EXP_SPLIT+"("+i+")"}),e.EXP_IF=new RegExp("^"+(t.range?e.EXP_IF+"\\s\\"+t.range+"\\s"+e.EXP_IF:e.EXP_IF)+"$"),e.EXP_SPLIT=new RegExp("^"+e.EXP_SPLIT+"$",""),e.isInput(t.elem[0])||"focus"===t.trigger&&(t.trigger="click"),t.elem.attr("lay-key")||(t.elem.attr("lay-key",e.index),t.eventElem.attr("lay-key",e.index)),t.mark=w.extend({},t.calendar&&"cn"===t.lang?{"0-1-1":"元旦","0-2-14":"情人","0-3-8":"妇女","0-3-12":"植树","0-4-1":"愚人","0-5-1":"劳动","0-5-4":"青年","0-6-1":"儿童","0-9-10":"教师","0-9-18":"国耻","0-10-1":"国庆","0-12-25":"圣诞"}:{},t.mark),w.each(["min","max"],function(e,n){var a=[],i=[];if("number"==typeof t[n]){var r=t[n],o=(new Date).getTime(),s=864e5,l=new Date(r?r0)return!0;var a=w.elem("div",{"class":"layui-laydate-header"}),i=[function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-prev-y"});return e.innerHTML="",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-prev-m"});return e.innerHTML="",e}(),function(){var e=w.elem("div",{"class":"laydate-set-ym"}),t=w.elem("span"),n=w.elem("span");return e.appendChild(t),e.appendChild(n),e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-next-m"});return e.innerHTML="",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-next-y"});return e.innerHTML="",e}()],d=w.elem("div",{"class":"layui-laydate-content"}),c=w.elem("table"),m=w.elem("thead"),u=w.elem("tr");w.each(i,function(e,t){a.appendChild(t)}),m.appendChild(u),w.each(new Array(6),function(e){var t=c.insertRow(0);w.each(new Array(7),function(a){if(0===e){var i=w.elem("th");i.innerHTML=n.weeks[a],u.appendChild(i)}t.insertCell(a)})}),c.insertBefore(m,c.children[0]),d.appendChild(c),r[e]=w.elem("div",{"class":"layui-laydate-main laydate-main-list-"+e}),r[e].appendChild(a),r[e].appendChild(d),o.push(i),s.push(d),l.push(c)}),w(d).html(function(){var e=[],i=[];return"datetime"===t.type&&e.push(''+n.timeTips+""),w.each(t.btns,function(e,r){var o=n.tools[r]||"btn";t.range&&"now"===r||(a&&"clear"===r&&(o="cn"===t.lang?"重置":"Reset"),i.push(''+o+""))}),e.push('"),e.join("")}()),w.each(r,function(e,t){i.appendChild(t)}),t.showBottom&&i.appendChild(d),/^#/.test(t.theme)){var m=w.elem("style"),u=["#{{id}} .layui-laydate-header{background-color:{{theme}};}","#{{id}} .layui-this{background-color:{{theme}} !important;}"].join("").replace(/{{id}}/g,e.elemID).replace(/{{theme}}/g,t.theme);"styleSheet"in m?(m.setAttribute("type","text/css"),m.styleSheet.cssText=u):m.innerHTML=u,w(i).addClass("laydate-theme-molv"),i.appendChild(m)}e.remove(T.thisElemDate),a?t.elem.append(i):(document.body.appendChild(i),e.position()),e.checkDate().calendar(),e.changeEvent(),T.thisElemDate=e.elemID,"function"==typeof t.ready&&t.ready(w.extend({},t.dateTime,{month:t.dateTime.month+1}))},T.prototype.remove=function(e){var t=this,n=(t.config,w("#"+(e||t.elemID)));return n.hasClass(c)||t.checkDate(function(){n.remove()}),t},T.prototype.position=function(){var e=this,t=e.config,n=e.bindElem||t.elem[0],a=n.getBoundingClientRect(),i=e.elem.offsetWidth,r=e.elem.offsetHeight,o=function(e){return e=e?"scrollLeft":"scrollTop",document.body[e]|document.documentElement[e]},s=function(e){return document.documentElement[e?"clientWidth":"clientHeight"]},l=5,d=a.left,c=a.bottom;d+i+l>s("width")&&(d=s("width")-i-l),c+r+l>s()&&(c=a.top>r?a.top-r:s()-r,c-=2*l),t.position&&(e.elem.style.position=t.position),e.elem.style.left=d+("fixed"===t.position?0:o(1))+"px",e.elem.style.top=c+("fixed"===t.position?0:o())+"px"},T.prototype.hint=function(e){var t=this,n=(t.config,w.elem("div",{"class":h}));n.innerHTML=e||"",w(t.elem).find("."+h).remove(),t.elem.appendChild(n),clearTimeout(t.hinTimer),t.hinTimer=setTimeout(function(){w(t.elem).find("."+h).remove()},3e3)},T.prototype.getAsYM=function(e,t,n){return n?t--:t++,t<0&&(t=11,e--),t>11&&(t=0,e++),[e,t]},T.prototype.systemDate=function(e){var t=e||new Date;return{year:t.getFullYear(),month:t.getMonth(),date:t.getDate(),hours:e?e.getHours():0,minutes:e?e.getMinutes():0,seconds:e?e.getSeconds():0}},T.prototype.checkDate=function(e){var t,a,i=this,r=(new Date,i.config),o=r.dateTime=r.dateTime||i.systemDate(),s=i.bindElem||r.elem[0],l=(i.isInput(s)?"val":"html",i.isInput(s)?s.value:"static"===r.position?"":s.innerHTML),c=function(e){e.year>d[1]&&(e.year=d[1],a=!0),e.month>11&&(e.month=11,a=!0),e.hours>23&&(e.hours=0,a=!0),e.minutes>59&&(e.minutes=0,e.hours++,a=!0),e.seconds>59&&(e.seconds=0,e.minutes++,a=!0),t=n.getEndDate(e.month+1,e.year),e.date>t&&(e.date=t,a=!0)},m=function(e,t,n){var o=["startTime","endTime"];t=(t.match(i.EXP_SPLIT)||[]).slice(1),n=n||0,r.range&&(i[o[n]]=i[o[n]]||{}),w.each(i.format,function(s,l){var c=parseFloat(t[s]);t[s].length必须遵循下述格式:
        "+(r.range?r.format+" "+r.range+" "+r.format:r.format)+"
        已为你重置"),a=!0):l&&l.constructor===Date?r.dateTime=i.systemDate(l):(r.dateTime=i.systemDate(),delete i.startState,delete i.endState,delete i.startDate,delete i.endDate,delete i.startTime,delete i.endTime),c(o),a&&l&&i.setValue(r.range?i.endDate?i.parse():"":i.parse()),e&&e(),i)},T.prototype.mark=function(e,t){var n,a=this,i=a.config;return w.each(i.mark,function(e,a){var i=e.split("-");i[0]!=t[0]&&0!=i[0]||i[1]!=t[1]&&0!=i[1]||i[2]!=t[2]||(n=a||t[2])}),n&&e.html(''+n+""),a},T.prototype.limit=function(e,t,n,a){var i,r=this,o=r.config,l={},d=o[n>41?"endDate":"dateTime"],c=w.extend({},d,t||{});return w.each({now:c,min:o.min,max:o.max},function(e,t){l[e]=r.newDate(w.extend({year:t.year,month:t.month,date:t.date},function(){var e={};return w.each(a,function(n,a){e[a]=t[a]}),e}())).getTime()}),i=l.nowl.max,e&&e[i?"addClass":"removeClass"](s),i},T.prototype.calendar=function(e){var t,a,i,r=this,s=r.config,l=e||s.dateTime,c=new Date,m=r.lang(),u="date"!==s.type&&"datetime"!==s.type,h=e?1:0,y=w(r.table[h]).find("td"),f=w(r.elemHeader[h][2]).find("span");if(l.yeard[1]&&(l.year=d[1],r.hint("最高只能支持到公元"+d[1]+"年")),r.firstDate||(r.firstDate=w.extend({},l)),c.setFullYear(l.year,l.month,1),t=c.getDay(),a=n.getEndDate(l.month||12,l.year),i=n.getEndDate(l.month+1,l.year),w.each(y,function(e,n){var d=[l.year,l.month],c=0;n=w(n),n.removeAttr("class"),e=t&&e=n.firstDate.year&&(r.month=a.max.month,r.date=a.max.date),n.limit(w(i),r,t),M++}),w(u[f?0:1]).attr("lay-ym",M-8+"-"+T[1]).html(b+p+" - "+(M-1+p))}else if("month"===e)w.each(new Array(12),function(e){var i=w.elem("li",{"lay-ym":e}),s={year:T[0],month:e};e+1==T[1]&&w(i).addClass(o),i.innerHTML=r.month[e]+(f?"月":""),d.appendChild(i),T[0]=n.firstDate.year&&(s.date=a.max.date),n.limit(w(i),s,t)}),w(u[f?0:1]).attr("lay-ym",T[0]+"-"+T[1]).html(T[0]+p);else if("time"===e){var E=function(){w(d).find("ol").each(function(e,a){w(a).find("li").each(function(a,i){n.limit(w(i),[{hours:a},{hours:n[x].hours,minutes:a},{hours:n[x].hours,minutes:n[x].minutes,seconds:a}][e],t,[["hours"],["hours","minutes"],["hours","minutes","seconds"]][e])})}),a.range||n.limit(w(n.footer).find(g),n[x],0,["hours","minutes","seconds"])};a.range?n[x]||(n[x]={hours:0,minutes:0,seconds:0}):n[x]=i,w.each([24,60,60],function(e,t){var a=w.elem("li"),i=["

        "+r.time[e]+"

          "];w.each(new Array(t),function(t){i.push(""+w.digit(t,2)+"")}),a.innerHTML=i.join("")+"
        ",d.appendChild(a)}),E()}if(y&&h.removeChild(y),h.appendChild(d),"year"===e||"month"===e)w(n.elemMain[t]).addClass("laydate-ym-show"),w(d).find("li").on("click",function(){var r=0|w(this).attr("lay-ym");if(!w(this).hasClass(s)){if(0===t)i[e]=r,l&&(n.startDate[e]=r),n.limit(w(n.footer).find(g),null,0);else if(l)n.endDate[e]=r;else{var c="year"===e?n.getAsYM(r,T[1]-1,"sub"):n.getAsYM(T[0],r,"sub");w.extend(i,{year:c[0],month:c[1]})}"year"===a.type||"month"===a.type?(w(d).find("."+o).removeClass(o),w(this).addClass(o),"month"===a.type&&"year"===e&&(n.listYM[t][0]=r,l&&(n[["startDate","endDate"][t]].year=r),n.list("month",t))):(n.checkDate("limit").calendar(),n.closeList()),n.setBtnStatus(),a.range||n.done(null,"change"),w(n.footer).find(D).removeClass(s)}});else{var S=w.elem("span",{"class":v}),k=function(){w(d).find("ol").each(function(e){var t=this,a=w(t).find("li");t.scrollTop=30*(n[x][C[e]]-2),t.scrollTop<=0&&a.each(function(e,n){if(!w(this).hasClass(s))return t.scrollTop=30*(e-2),!0})})},H=w(c[2]).find("."+v);k(),S.innerHTML=a.range?[r.startTime,r.endTime][t]:r.timeTips,w(n.elemMain[t]).addClass("laydate-time-show"),H[0]&&H.remove(),c[2].appendChild(S),w(d).find("ol").each(function(e){var t=this;w(t).find("li").on("click",function(){var r=0|this.innerHTML;w(this).hasClass(s)||(a.range?n[x][C[e]]=r:i[C[e]]=r,w(t).find("."+o).removeClass(o),w(this).addClass(o),E(),k(),(n.endDate||"time"===a.type)&&n.done(null,"change"),n.setBtnStatus())})})}return n},T.prototype.listYM=[],T.prototype.closeList=function(){var e=this;e.config;w.each(e.elemCont,function(t,n){w(this).find("."+m).remove(),w(e.elemMain[t]).removeClass("laydate-ym-show laydate-time-show")}),w(e.elem).find("."+v).remove()},T.prototype.setBtnStatus=function(e,t,n){var a,i=this,r=i.config,o=w(i.footer).find(g),d=r.range&&"date"!==r.type&&"time"!==r.type;d&&(t=t||i.startDate,n=n||i.endDate,a=i.newDate(t).getTime()>i.newDate(n).getTime(),i.limit(null,t)||i.limit(null,n)?o.addClass(s):o[a?"addClass":"removeClass"](s),e&&a&&i.hint("string"==typeof e?l.replace(/日期/g,e):l))},T.prototype.parse=function(e,t){var n=this,a=n.config,i=t||(e?w.extend({},n.endDate,n.endTime):a.range?w.extend({},n.startDate,n.startTime):a.dateTime),r=n.format.concat();return w.each(r,function(e,t){/yyyy|y/.test(t)?r[e]=w.digit(i.year,t.length):/MM|M/.test(t)?r[e]=w.digit(i.month+1,t.length):/dd|d/.test(t)?r[e]=w.digit(i.date,t.length):/HH|H/.test(t)?r[e]=w.digit(i.hours,t.length):/mm|m/.test(t)?r[e]=w.digit(i.minutes,t.length):/ss|s/.test(t)&&(r[e]=w.digit(i.seconds,t.length))}),a.range&&!e?r.join("")+" "+a.range+" "+n.parse(1):r.join("")},T.prototype.newDate=function(e){return e=e||{},new Date(e.year||1,e.month||0,e.date||1,e.hours||0,e.minutes||0,e.seconds||0)},T.prototype.setValue=function(e){var t=this,n=t.config,a=t.bindElem||n.elem[0],i=t.isInput(a)?"val":"html";return"static"===n.position||w(a)[i](e||""),this},T.prototype.stampRange=function(){var e,t,n=this,a=n.config,i=w(n.elem).find("td");if(a.range&&!n.endDate&&w(n.footer).find(g).addClass(s),n.endDate)return e=n.newDate({year:n.startDate.year,month:n.startDate.month,date:n.startDate.date}).getTime(),t=n.newDate({year:n.endDate.year,month:n.endDate.month,date:n.endDate.date}).getTime(),e>t?n.hint(l):void w.each(i,function(a,i){var r=w(i).attr("lay-ymd").split("-"),s=n.newDate({year:r[0],month:r[1]-1,date:r[2]}).getTime();w(i).removeClass(u+" "+o),s!==e&&s!==t||w(i).addClass(w(i).hasClass(y)||w(i).hasClass(f)?u:o),s>e&&s0&&t-1 in e)}function r(e,t,n){if(pe.isFunction(t))return pe.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return pe.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(Ce.test(t))return pe.filter(t,e,n);t=pe.filter(t,e)}return pe.grep(e,function(e){return pe.inArray(e,t)>-1!==n})}function i(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function o(e){var t={};return pe.each(e.match(De)||[],function(e,n){t[n]=!0}),t}function a(){re.addEventListener?(re.removeEventListener("DOMContentLoaded",s),e.removeEventListener("load",s)):(re.detachEvent("onreadystatechange",s),e.detachEvent("onload",s))}function s(){(re.addEventListener||"load"===e.event.type||"complete"===re.readyState)&&(a(),pe.ready())}function u(e,t,n){if(void 0===n&&1===e.nodeType){var r="data-"+t.replace(_e,"-$1").toLowerCase();if(n=e.getAttribute(r),"string"==typeof n){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:qe.test(n)?pe.parseJSON(n):n)}catch(i){}pe.data(e,t,n)}else n=void 0}return n}function l(e){var t;for(t in e)if(("data"!==t||!pe.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function c(e,t,n,r){if(He(e)){var i,o,a=pe.expando,s=e.nodeType,u=s?pe.cache:e,l=s?e[a]:e[a]&&a;if(l&&u[l]&&(r||u[l].data)||void 0!==n||"string"!=typeof t)return l||(l=s?e[a]=ne.pop()||pe.guid++:a),u[l]||(u[l]=s?{}:{toJSON:pe.noop}),"object"!=typeof t&&"function"!=typeof t||(r?u[l]=pe.extend(u[l],t):u[l].data=pe.extend(u[l].data,t)),o=u[l],r||(o.data||(o.data={}),o=o.data),void 0!==n&&(o[pe.camelCase(t)]=n),"string"==typeof t?(i=o[t],null==i&&(i=o[pe.camelCase(t)])):i=o,i}}function f(e,t,n){if(He(e)){var r,i,o=e.nodeType,a=o?pe.cache:e,s=o?e[pe.expando]:pe.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){pe.isArray(t)?t=t.concat(pe.map(t,pe.camelCase)):t in r?t=[t]:(t=pe.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;for(;i--;)delete r[t[i]];if(n?!l(r):!pe.isEmptyObject(r))return}(n||(delete a[s].data,l(a[s])))&&(o?pe.cleanData([e],!0):fe.deleteExpando||a!=a.window?delete a[s]:a[s]=void 0)}}}function d(e,t,n,r){var i,o=1,a=20,s=r?function(){return r.cur()}:function(){return pe.css(e,t,"")},u=s(),l=n&&n[3]||(pe.cssNumber[t]?"":"px"),c=(pe.cssNumber[t]||"px"!==l&&+u)&&Me.exec(pe.css(e,t));if(c&&c[3]!==l){l=l||c[3],n=n||[],c=+u||1;do o=o||".5",c/=o,pe.style(e,t,c+l);while(o!==(o=s()/u)&&1!==o&&--a)}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}function p(e){var t=ze.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function h(e,t){var n,r,i=0,o="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):void 0;if(!o)for(o=[],n=e.childNodes||e;null!=(r=n[i]);i++)!t||pe.nodeName(r,t)?o.push(r):pe.merge(o,h(r,t));return void 0===t||t&&pe.nodeName(e,t)?pe.merge([e],o):o}function g(e,t){for(var n,r=0;null!=(n=e[r]);r++)pe._data(n,"globalEval",!t||pe._data(t[r],"globalEval"))}function m(e){Be.test(e.type)&&(e.defaultChecked=e.checked)}function y(e,t,n,r,i){for(var o,a,s,u,l,c,f,d=e.length,y=p(t),v=[],x=0;x"!==f[1]||Ve.test(a)?0:u:u.firstChild,o=a&&a.childNodes.length;o--;)pe.nodeName(c=a.childNodes[o],"tbody")&&!c.childNodes.length&&a.removeChild(c);for(pe.merge(v,u.childNodes),u.textContent="";u.firstChild;)u.removeChild(u.firstChild);u=y.lastChild}else v.push(t.createTextNode(a));for(u&&y.removeChild(u),fe.appendChecked||pe.grep(h(v,"input"),m),x=0;a=v[x++];)if(r&&pe.inArray(a,r)>-1)i&&i.push(a);else if(s=pe.contains(a.ownerDocument,a),u=h(y.appendChild(a),"script"),s&&g(u),n)for(o=0;a=u[o++];)Ie.test(a.type||"")&&n.push(a);return u=null,y}function v(){return!0}function x(){return!1}function b(){try{return re.activeElement}catch(e){}}function w(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)w(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),i===!1)i=x;else if(!i)return e;return 1===o&&(a=i,i=function(e){return pe().off(e),a.apply(this,arguments)},i.guid=a.guid||(a.guid=pe.guid++)),e.each(function(){pe.event.add(this,t,i,r,n)})}function T(e,t){return pe.nodeName(e,"table")&&pe.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function C(e){return e.type=(null!==pe.find.attr(e,"type"))+"/"+e.type,e}function E(e){var t=it.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function N(e,t){if(1===t.nodeType&&pe.hasData(e)){var n,r,i,o=pe._data(e),a=pe._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;r1&&"string"==typeof p&&!fe.checkClone&&rt.test(p))return e.each(function(i){var o=e.eq(i);g&&(t[0]=p.call(this,i,o.html())),S(o,t,n,r)});if(f&&(l=y(t,e[0].ownerDocument,!1,e,r),i=l.firstChild,1===l.childNodes.length&&(l=i),i||r)){for(s=pe.map(h(l,"script"),C),a=s.length;c")).appendTo(t.documentElement),t=(ut[0].contentWindow||ut[0].contentDocument).document,t.write(),t.close(),n=D(e,t),ut.detach()),lt[e]=n),n}function L(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function H(e){if(e in Et)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=Ct.length;n--;)if(e=Ct[n]+t,e in Et)return e}function q(e,t){for(var n,r,i,o=[],a=0,s=e.length;a=0&&n=0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},isPlainObject:function(e){var t;if(!e||"object"!==pe.type(e)||e.nodeType||pe.isWindow(e))return!1;try{if(e.constructor&&!ce.call(e,"constructor")&&!ce.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}if(!fe.ownFirst)for(t in e)return ce.call(e,t);for(t in e);return void 0===t||ce.call(e,t)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?ue[le.call(e)]||"object":typeof e},globalEval:function(t){t&&pe.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(ge,"ms-").replace(me,ye)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var r,i=0;if(n(e))for(r=e.length;iT.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[P]=!0,e}function i(e){var t=H.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=n.length;r--;)T.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||V)-(~e.sourceIndex||V);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function c(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function f(){}function d(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function g(e,n,r){for(var i=0,o=n.length;i-1&&(r[l]=!(a[l]=f))}}else x=m(x===a?x.splice(h,x.length):x),o?o(null,a,x,u):Q.apply(a,x)})}function v(e){for(var t,n,r,i=e.length,o=T.relative[e[0].type],a=o||T.relative[" "],s=o?1:0,u=p(function(e){return e===t},a,!0),l=p(function(e){return ee(t,e)>-1},a,!0),c=[function(e,n,r){var i=!o&&(r||n!==A)||((t=n).nodeType?u(e,n,r):l(e,n,r));return t=null,i}];s1&&h(c),s>1&&d(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(se,"$1"),n,s0,o=e.length>0,a=function(r,a,s,u,l){var c,f,d,p=0,h="0",g=r&&[],y=[],v=A,x=r||o&&T.find.TAG("*",l),b=W+=null==v?1:Math.random()||.1,w=x.length;for(l&&(A=a===H||a||l);h!==w&&null!=(c=x[h]);h++){if(o&&c){for(f=0,a||c.ownerDocument===H||(L(c),s=!_);d=e[f++];)if(d(c,a||H,s)){u.push(c);break}l&&(W=b)}i&&((c=!d&&c)&&p--,r&&g.push(c))}if(p+=h,i&&h!==p){for(f=0;d=n[f++];)d(g,y,a,s);if(r){if(p>0)for(;h--;)g[h]||y[h]||(y[h]=G.call(u));y=m(y)}Q.apply(u,y),l&&!r&&y.length>0&&p+n.length>1&&t.uniqueSort(u)}return l&&(W=b,A=v),g};return i?r(a):a}var b,w,T,C,E,N,k,S,A,D,j,L,H,q,_,F,M,O,R,P="sizzle"+1*new Date,B=e.document,W=0,I=0,$=n(),z=n(),X=n(),U=function(e,t){return e===t&&(j=!0),0},V=1<<31,Y={}.hasOwnProperty,J=[],G=J.pop,K=J.push,Q=J.push,Z=J.slice,ee=function(e,t){for(var n=0,r=e.length;n+~]|"+ne+")"+ne+"*"),ce=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(oe),de=new RegExp("^"+re+"$"),pe={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+ie),PSEUDO:new RegExp("^"+oe),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},he=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,me=/^[^{]+\{\s*\[native \w/,ye=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ve=/[+~]/,xe=/'|\\/g,be=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),we=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},Te=function(){L()};try{Q.apply(J=Z.call(B.childNodes),B.childNodes),J[B.childNodes.length].nodeType}catch(Ce){Q={apply:J.length?function(e,t){K.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}w=t.support={},E=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},L=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:B;return r!==H&&9===r.nodeType&&r.documentElement?(H=r,q=H.documentElement,_=!E(H),(n=H.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Te,!1):n.attachEvent&&n.attachEvent("onunload",Te)),w.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),w.getElementsByTagName=i(function(e){return e.appendChild(H.createComment("")),!e.getElementsByTagName("*").length}),w.getElementsByClassName=me.test(H.getElementsByClassName),w.getById=i(function(e){return q.appendChild(e).id=P,!H.getElementsByName||!H.getElementsByName(P).length}),w.getById?(T.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&_){var n=t.getElementById(e);return n?[n]:[]}},T.filter.ID=function(e){var t=e.replace(be,we);return function(e){return e.getAttribute("id")===t}}):(delete T.find.ID,T.filter.ID=function(e){var t=e.replace(be,we);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}}),T.find.TAG=w.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):w.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},T.find.CLASS=w.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&_)return t.getElementsByClassName(e)},M=[],F=[],(w.qsa=me.test(H.querySelectorAll))&&(i(function(e){q.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&F.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||F.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+P+"-]").length||F.push("~="),e.querySelectorAll(":checked").length||F.push(":checked"),e.querySelectorAll("a#"+P+"+*").length||F.push(".#.+[+~]")}),i(function(e){var t=H.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&F.push("name"+ne+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||F.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),F.push(",.*:")})),(w.matchesSelector=me.test(O=q.matches||q.webkitMatchesSelector||q.mozMatchesSelector||q.oMatchesSelector||q.msMatchesSelector))&&i(function(e){w.disconnectedMatch=O.call(e,"div"),O.call(e,"[s!='']:x"),M.push("!=",oe)}),F=F.length&&new RegExp(F.join("|")),M=M.length&&new RegExp(M.join("|")),t=me.test(q.compareDocumentPosition),R=t||me.test(q.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},U=t?function(e,t){if(e===t)return j=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!w.sortDetached&&t.compareDocumentPosition(e)===n?e===H||e.ownerDocument===B&&R(B,e)?-1:t===H||t.ownerDocument===B&&R(B,t)?1:D?ee(D,e)-ee(D,t):0:4&n?-1:1)}:function(e,t){if(e===t)return j=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,s=[e],u=[t];if(!i||!o)return e===H?-1:t===H?1:i?-1:o?1:D?ee(D,e)-ee(D,t):0;if(i===o)return a(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;s[r]===u[r];)r++;return r?a(s[r],u[r]):s[r]===B?-1:u[r]===B?1:0},H):H},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==H&&L(e),n=n.replace(ce,"='$1']"),w.matchesSelector&&_&&!X[n+" "]&&(!M||!M.test(n))&&(!F||!F.test(n)))try{var r=O.call(e,n);if(r||w.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return t(n,H,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==H&&L(e),R(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==H&&L(e);var n=T.attrHandle[t.toLowerCase()],r=n&&Y.call(T.attrHandle,t.toLowerCase())?n(e,t,!_):void 0;return void 0!==r?r:w.attributes||!_?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,i=0;if(j=!w.detectDuplicates,D=!w.sortStable&&e.slice(0),e.sort(U),j){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return D=null,e},C=t.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=C(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=C(t);return n},T=t.selectors={cacheLength:50,createPseudo:r,match:pe,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(be,we),e[3]=(e[3]||e[4]||e[5]||"").replace(be,we),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return pe.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=N(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(be,we).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=$[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&$(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(i){var o=t.attr(i,e);return null==o?"!="===n:!n||(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o.replace(ae," ")+" ").indexOf(r)>-1:"|="===n&&(o===r||o.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,d,p,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s,x=!1;if(m){if(o){for(;g;){for(d=t;d=d[g];)if(s?d.nodeName.toLowerCase()===y:1===d.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){for(d=m,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}), +l=c[e]||[],p=l[0]===W&&l[1],x=p&&l[2],d=p&&m.childNodes[p];d=++p&&d&&d[g]||(x=p=0)||h.pop();)if(1===d.nodeType&&++x&&d===t){c[e]=[W,p,x];break}}else if(v&&(d=t,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),l=c[e]||[],p=l[0]===W&&l[1],x=p),x===!1)for(;(d=++p&&d&&d[g]||(x=p=0)||h.pop())&&((s?d.nodeName.toLowerCase()!==y:1!==d.nodeType)||!++x||(v&&(f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),c[e]=[W,x]),d!==t)););return x-=i,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var i,o=T.pseudos[e]||T.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return o[P]?o(n):o.length>1?(i=[e,e,"",n],T.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),a=i.length;a--;)r=ee(e,i[a]),e[r]=!(t[r]=i[a])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=k(e.replace(se,"$1"));return i[P]?r(function(e,t,n,r){for(var o,a=i(e,null,r,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(be,we),function(t){return(t.textContent||t.innerText||C(t)).indexOf(e)>-1}}),lang:r(function(e){return de.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(be,we).toLowerCase(),function(t){var n;do if(n=_?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===q},focus:function(e){return e===H.activeElement&&(!H.hasFocus||H.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!T.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return he.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r2&&"ID"===(a=o[0]).type&&w.getById&&9===t.nodeType&&_&&T.relative[o[1].type]){if(t=(T.find.ID(a.matches[0].replace(be,we),t)||[])[0],!t)return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=pe.needsContext.test(e)?0:o.length;i--&&(a=o[i],!T.relative[s=a.type]);)if((u=T.find[s])&&(r=u(a.matches[0].replace(be,we),ve.test(o[0].type)&&c(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&d(o),!e)return Q.apply(n,r),n;break}}return(l||k(e,f))(r,t,!_,n,!t||ve.test(e)&&c(t.parentNode)||t),n},w.sortStable=P.split("").sort(U).join("")===P,w.detectDuplicates=!!j,L(),w.sortDetached=i(function(e){return 1&e.compareDocumentPosition(H.createElement("div"))}),i(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),w.attributes&&i(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);pe.find=ve,pe.expr=ve.selectors,pe.expr[":"]=pe.expr.pseudos,pe.uniqueSort=pe.unique=ve.uniqueSort,pe.text=ve.getText,pe.isXMLDoc=ve.isXML,pe.contains=ve.contains;var xe=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&pe(e).is(n))break;r.push(e)}return r},be=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},we=pe.expr.match.needsContext,Te=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,Ce=/^.[^:#\[\.,]*$/;pe.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?pe.find.matchesSelector(r,e)?[r]:[]:pe.find.matches(e,pe.grep(t,function(e){return 1===e.nodeType}))},pe.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(pe(e).filter(function(){for(t=0;t1?pe.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},filter:function(e){return this.pushStack(r(this,e||[],!1))},not:function(e){return this.pushStack(r(this,e||[],!0))},is:function(e){return!!r(this,"string"==typeof e&&we.test(e)?pe(e):e||[],!1).length}});var Ee,Ne=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,ke=pe.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||Ee,"string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:Ne.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof pe?t[0]:t,pe.merge(this,pe.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:re,!0)),Te.test(r[1])&&pe.isPlainObject(t))for(r in t)pe.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}if(i=re.getElementById(r[2]),i&&i.parentNode){if(i.id!==r[2])return Ee.find(e);this.length=1,this[0]=i}return this.context=re,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):pe.isFunction(e)?"undefined"!=typeof n.ready?n.ready(e):e(pe):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),pe.makeArray(e,this))};ke.prototype=pe.fn,Ee=pe(re);var Se=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};pe.fn.extend({has:function(e){var t,n=pe(e,this),r=n.length;return this.filter(function(){for(t=0;t-1:1===n.nodeType&&pe.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?pe.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?pe.inArray(this[0],pe(e)):pe.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(pe.uniqueSort(pe.merge(this.get(),pe(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),pe.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return xe(e,"parentNode")},parentsUntil:function(e,t,n){return xe(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return xe(e,"nextSibling")},prevAll:function(e){return xe(e,"previousSibling")},nextUntil:function(e,t,n){return xe(e,"nextSibling",n)},prevUntil:function(e,t,n){return xe(e,"previousSibling",n)},siblings:function(e){return be((e.parentNode||{}).firstChild,e)},children:function(e){return be(e.firstChild)},contents:function(e){return pe.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:pe.merge([],e.childNodes)}},function(e,t){pe.fn[e]=function(n,r){var i=pe.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=pe.filter(r,i)),this.length>1&&(Ae[e]||(i=pe.uniqueSort(i)),Se.test(e)&&(i=i.reverse())),this.pushStack(i)}});var De=/\S+/g;pe.Callbacks=function(e){e="string"==typeof e?o(e):pe.extend({},e);var t,n,r,i,a=[],s=[],u=-1,l=function(){for(i=e.once,r=t=!0;s.length;u=-1)for(n=s.shift();++u-1;)a.splice(n,1),n<=u&&u--}),this},has:function(e){return e?pe.inArray(e,a)>-1:a.length>0},empty:function(){return a&&(a=[]),this},disable:function(){return i=s=[],a=n="",this},disabled:function(){return!a},lock:function(){return i=!0,n||c.disable(),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=n||[],n=[e,n.slice?n.slice():n],s.push(n),t||l()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},pe.extend({Deferred:function(e){var t=[["resolve","done",pe.Callbacks("once memory"),"resolved"],["reject","fail",pe.Callbacks("once memory"),"rejected"],["notify","progress",pe.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return pe.Deferred(function(n){pe.each(t,function(t,o){var a=pe.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&pe.isFunction(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[o[0]+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?pe.extend(e,r):r}},i={};return r.pipe=r.then,pe.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t,n,r,i=0,o=ie.call(arguments),a=o.length,s=1!==a||e&&pe.isFunction(e.promise)?a:0,u=1===s?e:pe.Deferred(),l=function(e,n,r){return function(i){n[e]=this,r[e]=arguments.length>1?ie.call(arguments):i,r===t?u.notifyWith(n,r):--s||u.resolveWith(n,r)}};if(a>1)for(t=new Array(a),n=new Array(a),r=new Array(a);i0||(je.resolveWith(re,[pe]),pe.fn.triggerHandler&&(pe(re).triggerHandler("ready"),pe(re).off("ready"))))}}),pe.ready.promise=function(t){if(!je)if(je=pe.Deferred(),"complete"===re.readyState||"loading"!==re.readyState&&!re.documentElement.doScroll)e.setTimeout(pe.ready);else if(re.addEventListener)re.addEventListener("DOMContentLoaded",s),e.addEventListener("load",s);else{re.attachEvent("onreadystatechange",s),e.attachEvent("onload",s);var n=!1;try{n=null==e.frameElement&&re.documentElement}catch(r){}n&&n.doScroll&&!function i(){if(!pe.isReady){try{n.doScroll("left")}catch(t){return e.setTimeout(i,50)}a(),pe.ready()}}()}return je.promise(t)},pe.ready.promise();var Le;for(Le in pe(fe))break;fe.ownFirst="0"===Le,fe.inlineBlockNeedsLayout=!1,pe(function(){var e,t,n,r;n=re.getElementsByTagName("body")[0],n&&n.style&&(t=re.createElement("div"),r=re.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),"undefined"!=typeof t.style.zoom&&(t.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",fe.inlineBlockNeedsLayout=e=3===t.offsetWidth,e&&(n.style.zoom=1)),n.removeChild(r))}),function(){var e=re.createElement("div");fe.deleteExpando=!0;try{delete e.test}catch(t){fe.deleteExpando=!1}e=null}();var He=function(e){var t=pe.noData[(e.nodeName+" ").toLowerCase()],n=+e.nodeType||1;return(1===n||9===n)&&(!t||t!==!0&&e.getAttribute("classid")===t)},qe=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,_e=/([A-Z])/g;pe.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?pe.cache[e[pe.expando]]:e[pe.expando],!!e&&!l(e)},data:function(e,t,n){return c(e,t,n)},removeData:function(e,t){return f(e,t)},_data:function(e,t,n){return c(e,t,n,!0)},_removeData:function(e,t){return f(e,t,!0)}}),pe.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=pe.data(o),1===o.nodeType&&!pe._data(o,"parsedAttrs"))){for(n=a.length;n--;)a[n]&&(r=a[n].name,0===r.indexOf("data-")&&(r=pe.camelCase(r.slice(5)),u(o,r,i[r])));pe._data(o,"parsedAttrs",!0)}return i}return"object"==typeof e?this.each(function(){pe.data(this,e)}):arguments.length>1?this.each(function(){pe.data(this,e,t)}):o?u(o,e,pe.data(o,e)):void 0},removeData:function(e){return this.each(function(){pe.removeData(this,e)})}}),pe.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=pe._data(e,t),n&&(!r||pe.isArray(n)?r=pe._data(e,t,pe.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=pe.queue(e,t),r=n.length,i=n.shift(),o=pe._queueHooks(e,t),a=function(){pe.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return pe._data(e,n)||pe._data(e,n,{empty:pe.Callbacks("once memory").add(function(){pe._removeData(e,t+"queue"),pe._removeData(e,n)})})}}),pe.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length
        a",fe.leadingWhitespace=3===e.firstChild.nodeType,fe.tbody=!e.getElementsByTagName("tbody").length,fe.htmlSerialize=!!e.getElementsByTagName("link").length,fe.html5Clone="<:nav>"!==re.createElement("nav").cloneNode(!0).outerHTML,n.type="checkbox",n.checked=!0,t.appendChild(n),fe.appendChecked=n.checked,e.innerHTML="",fe.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue,t.appendChild(e),n=re.createElement("input"),n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),e.appendChild(n),fe.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,fe.noCloneEvent=!!e.addEventListener,e[pe.expando]=1,fe.attributes=!e.getAttribute(pe.expando)}();var Xe={option:[1,""],legend:[1,"
        ","
        "],area:[1,"",""],param:[1,"",""],thead:[1,"","
        "],tr:[2,"","
        "],col:[2,"","
        "],td:[3,"","
        "],_default:fe.htmlSerialize?[0,"",""]:[1,"X
        ","
        "]};Xe.optgroup=Xe.option,Xe.tbody=Xe.tfoot=Xe.colgroup=Xe.caption=Xe.thead,Xe.th=Xe.td;var Ue=/<|&#?\w+;/,Ve=/-1&&(h=p.split("."),p=h.shift(),h.sort()),a=p.indexOf(":")<0&&"on"+p,t=t[pe.expando]?t:new pe.Event(p,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=h.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:pe.makeArray(n,[t]),l=pe.event.special[p]||{},i||!l.trigger||l.trigger.apply(r,n)!==!1)){if(!i&&!l.noBubble&&!pe.isWindow(r)){for(u=l.delegateType||p,Ke.test(u+p)||(s=s.parentNode);s;s=s.parentNode)d.push(s),c=s;c===(r.ownerDocument||re)&&d.push(c.defaultView||c.parentWindow||e)}for(f=0;(s=d[f++])&&!t.isPropagationStopped();)t.type=f>1?u:l.bindType||p,o=(pe._data(s,"events")||{})[t.type]&&pe._data(s,"handle"),o&&o.apply(s,n),o=a&&s[a],o&&o.apply&&He(s)&&(t.result=o.apply(s,n),t.result===!1&&t.preventDefault());if(t.type=p,!i&&!t.isDefaultPrevented()&&(!l._default||l._default.apply(d.pop(),n)===!1)&&He(r)&&a&&r[p]&&!pe.isWindow(r)){c=r[a],c&&(r[a]=null),pe.event.triggered=p;try{r[p]()}catch(g){}pe.event.triggered=void 0,c&&(r[a]=c)}return t.result}},dispatch:function(e){e=pe.event.fix(e);var t,n,r,i,o,a=[],s=ie.call(arguments),u=(pe._data(this,"events")||{})[e.type]||[],l=pe.event.special[e.type]||{};if(s[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){for(a=pe.event.handlers.call(this,e,u),t=0;(i=a[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,n=0;(o=i.handlers[n++])&&!e.isImmediatePropagationStopped();)e.rnamespace&&!e.rnamespace.test(o.namespace)||(e.handleObj=o,e.data=o.data,r=((pe.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s),void 0!==r&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()));return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,a=[],s=t.delegateCount,u=e.target;if(s&&u.nodeType&&("click"!==e.type||isNaN(e.button)||e.button<1))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(r=[],n=0;n-1:pe.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&a.push({elem:u,handlers:r})}return s]","i"),tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,nt=/\s*$/g,at=p(re),st=at.appendChild(re.createElement("div"));pe.extend({htmlPrefilter:function(e){return e.replace(tt,"<$1>")},clone:function(e,t,n){var r,i,o,a,s,u=pe.contains(e.ownerDocument,e);if(fe.html5Clone||pe.isXMLDoc(e)||!et.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(st.innerHTML=e.outerHTML,st.removeChild(o=st.firstChild)),!(fe.noCloneEvent&&fe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||pe.isXMLDoc(e)))for(r=h(o),s=h(e),a=0;null!=(i=s[a]);++a)r[a]&&k(i,r[a]);if(t)if(n)for(s=s||h(e),r=r||h(o),a=0;null!=(i=s[a]);a++)N(i,r[a]);else N(e,o);return r=h(o,"script"),r.length>0&&g(r,!u&&h(e,"script")),r=s=i=null,o},cleanData:function(e,t){for(var n,r,i,o,a=0,s=pe.expando,u=pe.cache,l=fe.attributes,c=pe.event.special;null!=(n=e[a]);a++)if((t||He(n))&&(i=n[s],o=i&&u[i])){if(o.events)for(r in o.events)c[r]?pe.event.remove(n,r):pe.removeEvent(n,r,o.handle);u[i]&&(delete u[i],l||"undefined"==typeof n.removeAttribute?n[s]=void 0:n.removeAttribute(s),ne.push(i))}}}),pe.fn.extend({domManip:S,detach:function(e){return A(this,e,!0)},remove:function(e){return A(this,e)},text:function(e){return Pe(this,function(e){return void 0===e?pe.text(this):this.empty().append((this[0]&&this[0].ownerDocument||re).createTextNode(e))},null,e,arguments.length)},append:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.appendChild(e)}})},prepend:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&pe.cleanData(h(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&pe.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return pe.clone(this,e,t)})},html:function(e){return Pe(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e)return 1===t.nodeType?t.innerHTML.replace(Ze,""):void 0;if("string"==typeof e&&!nt.test(e)&&(fe.htmlSerialize||!et.test(e))&&(fe.leadingWhitespace||!$e.test(e))&&!Xe[(We.exec(e)||["",""])[1].toLowerCase()]){e=pe.htmlPrefilter(e);try{for(;nt",t=l.getElementsByTagName("td"),t[0].style.cssText="margin:0;border:0;padding:0;display:none",o=0===t[0].offsetHeight,o&&(t[0].style.display="",t[1].style.display="none",o=0===t[0].offsetHeight)),f.removeChild(u)}var n,r,i,o,a,s,u=re.createElement("div"),l=re.createElement("div");l.style&&(l.style.cssText="float:left;opacity:.5",fe.opacity="0.5"===l.style.opacity,fe.cssFloat=!!l.style.cssFloat,l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",fe.clearCloneStyle="content-box"===l.style.backgroundClip,u=re.createElement("div"),u.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",l.innerHTML="",u.appendChild(l),fe.boxSizing=""===l.style.boxSizing||""===l.style.MozBoxSizing||""===l.style.WebkitBoxSizing,pe.extend(fe,{reliableHiddenOffsets:function(){return null==n&&t(),o},boxSizingReliable:function(){return null==n&&t(),i},pixelMarginRight:function(){return null==n&&t(),r},pixelPosition:function(){return null==n&&t(),n},reliableMarginRight:function(){return null==n&&t(),a},reliableMarginLeft:function(){return null==n&&t(),s}}))}();var ht,gt,mt=/^(top|right|bottom|left)$/;e.getComputedStyle?(ht=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n.getPropertyValue(t)||n[t]:void 0,""!==a&&void 0!==a||pe.contains(e.ownerDocument,e)||(a=pe.style(e,t)),n&&!fe.pixelMarginRight()&&ft.test(a)&&ct.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o),void 0===a?a:a+""}):pt.currentStyle&&(ht=function(e){return e.currentStyle},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n[t]:void 0,null==a&&s&&s[t]&&(a=s[t]),ft.test(a)&&!mt.test(t)&&(r=s.left,i=e.runtimeStyle,o=i&&i.left,o&&(i.left=e.currentStyle.left),s.left="fontSize"===t?"1em":a,a=s.pixelLeft+"px",s.left=r,o&&(i.left=o)),void 0===a?a:a+""||"auto"});var yt=/alpha\([^)]*\)/i,vt=/opacity\s*=\s*([^)]*)/i,xt=/^(none|table(?!-c[ea]).+)/,bt=new RegExp("^("+Fe+")(.*)$","i"),wt={position:"absolute",visibility:"hidden",display:"block"},Tt={letterSpacing:"0",fontWeight:"400"},Ct=["Webkit","O","Moz","ms"],Et=re.createElement("div").style;pe.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=gt(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":fe.cssFloat?"cssFloat":"styleFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=pe.camelCase(t),u=e.style;if(t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:u[t];if(o=typeof n,"string"===o&&(i=Me.exec(n))&&i[1]&&(n=d(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(pe.cssNumber[s]?"":"px")),fe.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),!(a&&"set"in a&&void 0===(n=a.set(e,n,r)))))try{u[t]=n}catch(l){}}},css:function(e,t,n,r){var i,o,a,s=pe.camelCase(t);return t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],a&&"get"in a&&(o=a.get(e,!0,n)),void 0===o&&(o=gt(e,t,r)),"normal"===o&&t in Tt&&(o=Tt[t]),""===n||n?(i=parseFloat(o),n===!0||isFinite(i)?i||0:o):o}}),pe.each(["height","width"],function(e,t){pe.cssHooks[t]={get:function(e,n,r){if(n)return xt.test(pe.css(e,"display"))&&0===e.offsetWidth?dt(e,wt,function(){return M(e,t,r)}):M(e,t,r)},set:function(e,n,r){var i=r&&ht(e);return _(e,n,r?F(e,t,r,fe.boxSizing&&"border-box"===pe.css(e,"boxSizing",!1,i),i):0)}}}),fe.opacity||(pe.cssHooks.opacity={get:function(e,t){return vt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=pe.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===pe.trim(o.replace(yt,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=yt.test(o)?o.replace(yt,i):o+" "+i)}}),pe.cssHooks.marginRight=L(fe.reliableMarginRight,function(e,t){if(t)return dt(e,{display:"inline-block"},gt,[e,"marginRight"])}),pe.cssHooks.marginLeft=L(fe.reliableMarginLeft,function(e,t){if(t)return(parseFloat(gt(e,"marginLeft"))||(pe.contains(e.ownerDocument,e)?e.getBoundingClientRect().left-dt(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}):0))+"px"}),pe.each({margin:"",padding:"",border:"Width"},function(e,t){pe.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+Oe[r]+t]=o[r]||o[r-2]||o[0];return i}},ct.test(e)||(pe.cssHooks[e+t].set=_)}),pe.fn.extend({css:function(e,t){return Pe(this,function(e,t,n){var r,i,o={},a=0;if(pe.isArray(t)){for(r=ht(e),i=t.length;a1)},show:function(){return q(this,!0)},hide:function(){return q(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Re(this)?pe(this).show():pe(this).hide()})}}),pe.Tween=O,O.prototype={constructor:O,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||pe.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(pe.cssNumber[n]?"":"px")},cur:function(){var e=O.propHooks[this.prop];return e&&e.get?e.get(this):O.propHooks._default.get(this)},run:function(e){var t,n=O.propHooks[this.prop];return this.options.duration?this.pos=t=pe.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):O.propHooks._default.set(this),this}},O.prototype.init.prototype=O.prototype,O.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=pe.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){pe.fx.step[e.prop]?pe.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[pe.cssProps[e.prop]]&&!pe.cssHooks[e.prop]?e.elem[e.prop]=e.now:pe.style(e.elem,e.prop,e.now+e.unit)}}},O.propHooks.scrollTop=O.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},pe.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},pe.fx=O.prototype.init,pe.fx.step={};var Nt,kt,St=/^(?:toggle|show|hide)$/,At=/queueHooks$/;pe.Animation=pe.extend($,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,Me.exec(t),n),n}]},tweener:function(e,t){pe.isFunction(e)?(t=e,e=["*"]):e=e.match(De);for(var n,r=0,i=e.length;r
        a",e=n.getElementsByTagName("a")[0],t.setAttribute("type","checkbox"),n.appendChild(t),e=n.getElementsByTagName("a")[0],e.style.cssText="top:1px",fe.getSetAttribute="t"!==n.className,fe.style=/top/.test(e.getAttribute("style")),fe.hrefNormalized="/a"===e.getAttribute("href"),fe.checkOn=!!t.value,fe.optSelected=i.selected,fe.enctype=!!re.createElement("form").enctype,r.disabled=!0,fe.optDisabled=!i.disabled,t=re.createElement("input"),t.setAttribute("value",""),fe.input=""===t.getAttribute("value"),t.value="t",t.setAttribute("type","radio"),fe.radioValue="t"===t.value}();var Dt=/\r/g,jt=/[\x20\t\r\n\f]+/g;pe.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=pe.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,pe(this).val()):e,null==i?i="":"number"==typeof i?i+="":pe.isArray(i)&&(i=pe.map(i,function(e){return null==e?"":e+""})),t=pe.valHooks[this.type]||pe.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return t=pe.valHooks[i.type]||pe.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:(n=i.value,"string"==typeof n?n.replace(Dt,""):null==n?"":n)}}}),pe.extend({valHooks:{option:{get:function(e){var t=pe.find.attr(e,"value");return null!=t?t:pe.trim(pe.text(e)).replace(jt," ")}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||i<0,a=o?null:[],s=o?i+1:r.length,u=i<0?s:o?i:0;u-1)try{r.selected=n=!0}catch(s){r.scrollHeight}else r.selected=!1;return n||(e.selectedIndex=-1),i}}}}),pe.each(["radio","checkbox"],function(){pe.valHooks[this]={set:function(e,t){if(pe.isArray(t))return e.checked=pe.inArray(pe(e).val(),t)>-1}},fe.checkOn||(pe.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Lt,Ht,qt=pe.expr.attrHandle,_t=/^(?:checked|selected)$/i,Ft=fe.getSetAttribute,Mt=fe.input;pe.fn.extend({attr:function(e,t){return Pe(this,pe.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){pe.removeAttr(this,e)})}}),pe.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?pe.prop(e,t,n):(1===o&&pe.isXMLDoc(e)||(t=t.toLowerCase(),i=pe.attrHooks[t]||(pe.expr.match.bool.test(t)?Ht:Lt)),void 0!==n?null===n?void pe.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:(r=pe.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!fe.radioValue&&"radio"===t&&pe.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(De);if(o&&1===e.nodeType)for(;n=o[i++];)r=pe.propFix[n]||n,pe.expr.match.bool.test(n)?Mt&&Ft||!_t.test(n)?e[r]=!1:e[pe.camelCase("default-"+n)]=e[r]=!1:pe.attr(e,n,""),e.removeAttribute(Ft?n:r)}}),Ht={set:function(e,t,n){return t===!1?pe.removeAttr(e,n):Mt&&Ft||!_t.test(n)?e.setAttribute(!Ft&&pe.propFix[n]||n,n):e[pe.camelCase("default-"+n)]=e[n]=!0,n}},pe.each(pe.expr.match.bool.source.match(/\w+/g),function(e,t){var n=qt[t]||pe.find.attr;Mt&&Ft||!_t.test(t)?qt[t]=function(e,t,r){var i,o;return r||(o=qt[t],qt[t]=i,i=null!=n(e,t,r)?t.toLowerCase():null,qt[t]=o),i}:qt[t]=function(e,t,n){if(!n)return e[pe.camelCase("default-"+t)]?t.toLowerCase():null}}),Mt&&Ft||(pe.attrHooks.value={set:function(e,t,n){return pe.nodeName(e,"input")?void(e.defaultValue=t):Lt&&Lt.set(e,t,n)}}),Ft||(Lt={set:function(e,t,n){var r=e.getAttributeNode(n);if(r||e.setAttributeNode(r=e.ownerDocument.createAttribute(n)),r.value=t+="","value"===n||t===e.getAttribute(n))return t}},qt.id=qt.name=qt.coords=function(e,t,n){var r;if(!n)return(r=e.getAttributeNode(t))&&""!==r.value?r.value:null},pe.valHooks.button={get:function(e,t){var n=e.getAttributeNode(t);if(n&&n.specified)return n.value},set:Lt.set},pe.attrHooks.contenteditable={set:function(e,t,n){Lt.set(e,""!==t&&t,n)}},pe.each(["width","height"],function(e,t){pe.attrHooks[t]={set:function(e,n){if(""===n)return e.setAttribute(t,"auto"),n}}})),fe.style||(pe.attrHooks.style={get:function(e){return e.style.cssText||void 0},set:function(e,t){return e.style.cssText=t+""}});var Ot=/^(?:input|select|textarea|button|object)$/i,Rt=/^(?:a|area)$/i;pe.fn.extend({prop:function(e,t){return Pe(this,pe.prop,e,t,arguments.length>1)},removeProp:function(e){return e=pe.propFix[e]||e,this.each(function(){try{this[e]=void 0,delete this[e]}catch(t){}})}}),pe.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&pe.isXMLDoc(e)||(t=pe.propFix[t]||t,i=pe.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=pe.find.attr(e,"tabindex");return t?parseInt(t,10):Ot.test(e.nodeName)||Rt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),fe.hrefNormalized||pe.each(["href","src"],function(e,t){pe.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),fe.optSelected||(pe.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),pe.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){pe.propFix[this.toLowerCase()]=this}),fe.enctype||(pe.propFix.enctype="encoding");var Pt=/[\t\r\n\f]/g;pe.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).addClass(e.call(this,t,z(this)))});if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).removeClass(e.call(this,t,z(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):pe.isFunction(e)?this.each(function(n){pe(this).toggleClass(e.call(this,n,z(this),t),t)}):this.each(function(){var t,r,i,o;if("string"===n)for(r=0,i=pe(this),o=e.match(De)||[];t=o[r++];)i.hasClass(t)?i.removeClass(t):i.addClass(t);else void 0!==e&&"boolean"!==n||(t=z(this),t&&pe._data(this,"__className__",t),pe.attr(this,"class",t||e===!1?"":pe._data(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+z(n)+" ").replace(Pt," ").indexOf(t)>-1)return!0;return!1}}),pe.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){pe.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),pe.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}});var Bt=e.location,Wt=pe.now(),It=/\?/,$t=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;pe.parseJSON=function(t){if(e.JSON&&e.JSON.parse)return e.JSON.parse(t+"");var n,r=null,i=pe.trim(t+"");return i&&!pe.trim(i.replace($t,function(e,t,i,o){return n&&t&&(r=0),0===r?e:(n=i||t,r+=!o-!i,"")}))?Function("return "+i)():pe.error("Invalid JSON: "+t)},pe.parseXML=function(t){var n,r;if(!t||"string"!=typeof t)return null;try{e.DOMParser?(r=new e.DOMParser,n=r.parseFromString(t,"text/xml")):(n=new e.ActiveXObject("Microsoft.XMLDOM"),n.async="false",n.loadXML(t))}catch(i){n=void 0}return n&&n.documentElement&&!n.getElementsByTagName("parsererror").length||pe.error("Invalid XML: "+t),n};var zt=/#.*$/,Xt=/([?&])_=[^&]*/,Ut=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Vt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Yt=/^(?:GET|HEAD)$/,Jt=/^\/\//,Gt=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Kt={},Qt={},Zt="*/".concat("*"),en=Bt.href,tn=Gt.exec(en.toLowerCase())||[];pe.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:en,type:"GET",isLocal:Vt.test(tn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Zt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":pe.parseJSON,"text xml":pe.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?V(V(e,pe.ajaxSettings),t):V(pe.ajaxSettings,e)},ajaxPrefilter:X(Kt),ajaxTransport:X(Qt),ajax:function(t,n){function r(t,n,r,i){var o,f,v,x,w,C=n;2!==b&&(b=2,u&&e.clearTimeout(u),c=void 0,s=i||"",T.readyState=t>0?4:0,o=t>=200&&t<300||304===t,r&&(x=Y(d,T,r)),x=J(d,x,T,o),o?(d.ifModified&&(w=T.getResponseHeader("Last-Modified"),w&&(pe.lastModified[a]=w),w=T.getResponseHeader("etag"),w&&(pe.etag[a]=w)),204===t||"HEAD"===d.type?C="nocontent":304===t?C="notmodified":(C=x.state,f=x.data,v=x.error,o=!v)):(v=C,!t&&C||(C="error",t<0&&(t=0))),T.status=t,T.statusText=(n||C)+"",o?g.resolveWith(p,[f,C,T]):g.rejectWith(p,[T,C,v]),T.statusCode(y),y=void 0,l&&h.trigger(o?"ajaxSuccess":"ajaxError",[T,d,o?f:v]),m.fireWith(p,[T,C]),l&&(h.trigger("ajaxComplete",[T,d]),--pe.active||pe.event.trigger("ajaxStop")))}"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,d=pe.ajaxSetup({},n),p=d.context||d,h=d.context&&(p.nodeType||p.jquery)?pe(p):pe.event,g=pe.Deferred(),m=pe.Callbacks("once memory"),y=d.statusCode||{},v={},x={},b=0,w="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!f)for(f={};t=Ut.exec(s);)f[t[1].toLowerCase()]=t[2];t=f[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?s:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=x[n]=x[n]||e,v[e]=t),this},overrideMimeType:function(e){return b||(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(b<2)for(t in e)y[t]=[y[t],e[t]];else T.always(e[T.status]);return this},abort:function(e){var t=e||w;return c&&c.abort(t),r(0,t),this}};if(g.promise(T).complete=m.add,T.success=T.done,T.error=T.fail,d.url=((t||d.url||en)+"").replace(zt,"").replace(Jt,tn[1]+"//"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=pe.trim(d.dataType||"*").toLowerCase().match(De)||[""],null==d.crossDomain&&(i=Gt.exec(d.url.toLowerCase()),d.crossDomain=!(!i||i[1]===tn[1]&&i[2]===tn[2]&&(i[3]||("http:"===i[1]?"80":"443"))===(tn[3]||("http:"===tn[1]?"80":"443")))),d.data&&d.processData&&"string"!=typeof d.data&&(d.data=pe.param(d.data,d.traditional)),U(Kt,d,n,T),2===b)return T;l=pe.event&&d.global,l&&0===pe.active++&&pe.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!Yt.test(d.type),a=d.url,d.hasContent||(d.data&&(a=d.url+=(It.test(a)?"&":"?")+d.data,delete d.data),d.cache===!1&&(d.url=Xt.test(a)?a.replace(Xt,"$1_="+Wt++):a+(It.test(a)?"&":"?")+"_="+Wt++)),d.ifModified&&(pe.lastModified[a]&&T.setRequestHeader("If-Modified-Since",pe.lastModified[a]),pe.etag[a]&&T.setRequestHeader("If-None-Match",pe.etag[a])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&T.setRequestHeader("Content-Type",d.contentType),T.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Zt+"; q=0.01":""):d.accepts["*"]);for(o in d.headers)T.setRequestHeader(o,d.headers[o]);if(d.beforeSend&&(d.beforeSend.call(p,T,d)===!1||2===b))return T.abort();w="abort";for(o in{success:1,error:1,complete:1})T[o](d[o]);if(c=U(Qt,d,n,T)){if(T.readyState=1,l&&h.trigger("ajaxSend",[T,d]),2===b)return T;d.async&&d.timeout>0&&(u=e.setTimeout(function(){T.abort("timeout")},d.timeout));try{b=1,c.send(v,r)}catch(C){if(!(b<2))throw C;r(-1,C)}}else r(-1,"No Transport");return T},getJSON:function(e,t,n){return pe.get(e,t,n,"json")},getScript:function(e,t){return pe.get(e,void 0,t,"script")}}),pe.each(["get","post"],function(e,t){pe[t]=function(e,n,r,i){return pe.isFunction(n)&&(i=i||r,r=n,n=void 0),pe.ajax(pe.extend({url:e,type:t,dataType:i,data:n,success:r},pe.isPlainObject(e)&&e))}}),pe._evalUrl=function(e){return pe.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},pe.fn.extend({wrapAll:function(e){if(pe.isFunction(e))return this.each(function(t){pe(this).wrapAll(e.call(this,t))});if(this[0]){var t=pe(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return pe.isFunction(e)?this.each(function(t){pe(this).wrapInner(e.call(this,t))}):this.each(function(){var t=pe(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=pe.isFunction(e);return this.each(function(n){pe(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){pe.nodeName(this,"body")||pe(this).replaceWith(this.childNodes)}).end()}}),pe.expr.filters.hidden=function(e){return fe.reliableHiddenOffsets()?e.offsetWidth<=0&&e.offsetHeight<=0&&!e.getClientRects().length:K(e)},pe.expr.filters.visible=function(e){return!pe.expr.filters.hidden(e)};var nn=/%20/g,rn=/\[\]$/,on=/\r?\n/g,an=/^(?:submit|button|image|reset|file)$/i,sn=/^(?:input|select|textarea|keygen)/i;pe.param=function(e,t){var n,r=[],i=function(e,t){t=pe.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(void 0===t&&(t=pe.ajaxSettings&&pe.ajaxSettings.traditional),pe.isArray(e)||e.jquery&&!pe.isPlainObject(e))pe.each(e,function(){i(this.name,this.value)});else for(n in e)Q(n,e[n],t,i);return r.join("&").replace(nn,"+")},pe.fn.extend({serialize:function(){return pe.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=pe.prop(this,"elements");return e?pe.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!pe(this).is(":disabled")&&sn.test(this.nodeName)&&!an.test(e)&&(this.checked||!Be.test(e))}).map(function(e,t){var n=pe(this).val();return null==n?null:pe.isArray(n)?pe.map(n,function(e){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),pe.ajaxSettings.xhr=void 0!==e.ActiveXObject?function(){return this.isLocal?ee():re.documentMode>8?Z():/^(get|post|head|put|delete|options)$/i.test(this.type)&&Z()||ee()}:Z;var un=0,ln={},cn=pe.ajaxSettings.xhr();e.attachEvent&&e.attachEvent("onunload",function(){for(var e in ln)ln[e](void 0,!0)}),fe.cors=!!cn&&"withCredentials"in cn,cn=fe.ajax=!!cn,cn&&pe.ajaxTransport(function(t){if(!t.crossDomain||fe.cors){var n;return{send:function(r,i){var o,a=t.xhr(),s=++un;if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(o in t.xhrFields)a[o]=t.xhrFields[o];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||r["X-Requested-With"]||(r["X-Requested-With"]="XMLHttpRequest");for(o in r)void 0!==r[o]&&a.setRequestHeader(o,r[o]+"");a.send(t.hasContent&&t.data||null),n=function(e,r){var o,u,l;if(n&&(r||4===a.readyState))if(delete ln[s],n=void 0,a.onreadystatechange=pe.noop,r)4!==a.readyState&&a.abort();else{l={},o=a.status,"string"==typeof a.responseText&&(l.text=a.responseText);try{u=a.statusText}catch(c){u=""}o||!t.isLocal||t.crossDomain?1223===o&&(o=204):o=l.text?200:404}l&&i(o,u,l,a.getAllResponseHeaders())},t.async?4===a.readyState?e.setTimeout(n):a.onreadystatechange=ln[s]=n:n()},abort:function(){n&&n(void 0,!0)}}}}),pe.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return pe.globalEval(e),e}}}),pe.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),pe.ajaxTransport("script",function(e){if(e.crossDomain){var t,n=re.head||pe("head")[0]||re.documentElement;return{send:function(r,i){t=re.createElement("script"),t.async=!0,e.scriptCharset&&(t.charset=e.scriptCharset),t.src=e.url,t.onload=t.onreadystatechange=function(e,n){(n||!t.readyState||/loaded|complete/.test(t.readyState))&&(t.onload=t.onreadystatechange=null,t.parentNode&&t.parentNode.removeChild(t),t=null,n||i(200,"success"))},n.insertBefore(t,n.firstChild)},abort:function(){t&&t.onload(void 0,!0)}}}});var fn=[],dn=/(=)\?(?=&|$)|\?\?/;pe.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=fn.pop()||pe.expando+"_"+Wt++;return this[e]=!0,e}}),pe.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,a,s=t.jsonp!==!1&&(dn.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&dn.test(t.data)&&"data");if(s||"jsonp"===t.dataTypes[0])return i=t.jsonpCallback=pe.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(dn,"$1"+i):t.jsonp!==!1&&(t.url+=(It.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return a||pe.error(i+" was not called"),a[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){a=arguments},r.always(function(){void 0===o?pe(e).removeProp(i):e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,fn.push(i)),a&&pe.isFunction(o)&&o(a[0]),a=o=void 0}),"script"}),pe.parseHTML=function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||re;var r=Te.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=y([e],t,i),i&&i.length&&pe(i).remove(),pe.merge([],r.childNodes))};var pn=pe.fn.load;return pe.fn.load=function(e,t,n){if("string"!=typeof e&&pn)return pn.apply(this,arguments);var r,i,o,a=this,s=e.indexOf(" ");return s>-1&&(r=pe.trim(e.slice(s,e.length)),e=e.slice(0,s)),pe.isFunction(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),a.length>0&&pe.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?pe("
        ").append(pe.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},pe.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){pe.fn[t]=function(e){return this.on(t,e)}}),pe.expr.filters.animated=function(e){return pe.grep(pe.timers,function(t){return e===t.elem}).length},pe.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l,c=pe.css(e,"position"),f=pe(e),d={};"static"===c&&(e.style.position="relative"),s=f.offset(),o=pe.css(e,"top"),u=pe.css(e,"left"),l=("absolute"===c||"fixed"===c)&&pe.inArray("auto",[o,u])>-1,l?(r=f.position(),a=r.top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),pe.isFunction(t)&&(t=t.call(e,n,pe.extend({},s))),null!=t.top&&(d.top=t.top-s.top+a),null!=t.left&&(d.left=t.left-s.left+i),"using"in t?t.using.call(e,d):f.css(d)}},pe.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){pe.offset.setOffset(this,e,t)});var t,n,r={top:0,left:0},i=this[0],o=i&&i.ownerDocument;if(o)return t=o.documentElement,pe.contains(t,i)?("undefined"!=typeof i.getBoundingClientRect&&(r=i.getBoundingClientRect()),n=te(o),{top:r.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0),left:r.left+(n.pageXOffset||t.scrollLeft)-(t.clientLeft||0)}):r},position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===pe.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),pe.nodeName(e[0],"html")||(n=e.offset()),n.top+=pe.css(e[0],"borderTopWidth",!0),n.left+=pe.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-pe.css(r,"marginTop",!0),left:t.left-n.left-pe.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){ +for(var e=this.offsetParent;e&&!pe.nodeName(e,"html")&&"static"===pe.css(e,"position");)e=e.offsetParent;return e||pt})}}),pe.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n=/Y/.test(t);pe.fn[e]=function(r){return Pe(this,function(e,r,i){var o=te(e);return void 0===i?o?t in o?o[t]:o.document.documentElement[r]:e[r]:void(o?o.scrollTo(n?pe(o).scrollLeft():i,n?i:pe(o).scrollTop()):e[r]=i)},e,r,arguments.length,null)}}),pe.each(["top","left"],function(e,t){pe.cssHooks[t]=L(fe.pixelPosition,function(e,n){if(n)return n=gt(e,t),ft.test(n)?pe(e).position()[t]+"px":n})}),pe.each({Height:"height",Width:"width"},function(e,t){pe.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){pe.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),a=n||(r===!0||i===!0?"margin":"border");return Pe(this,function(t,n,r){var i;return pe.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):void 0===r?pe.css(t,n,a):pe.style(t,n,r,a)},t,o?r:void 0,o,null)}})}),pe.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),pe.fn.size=function(){return this.length},pe.fn.andSelf=pe.fn.addBack,layui.define(function(e){layui.$=pe,e("jquery",pe)}),pe});!function(e,t){"use strict";var i,n,a=e.layui&&layui.define,o={getPath:function(){var e=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,i=t.length-1,n=i;n>0;n--)if("interactive"===t[n].readyState){e=t[n].src;break}return e||t[i].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),config:{},end:{},minIndex:0,minLeft:[],btn:["确定","取消"],type:["dialog","page","iframe","loading","tips"],getStyle:function(t,i){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](i)},link:function(t,i,n){if(r.path){var a=document.getElementsByTagName("head")[0],s=document.createElement("link");"string"==typeof i&&(n=i);var l=(n||t).replace(/\.|\//g,""),f="layuicss-"+l,c=0;s.rel="stylesheet",s.href=r.path+t,s.id=f,document.getElementById(f)||a.appendChild(s),"function"==typeof i&&!function u(){return++c>80?e.console&&console.error("layer.css: Invalid"):void(1989===parseInt(o.getStyle(document.getElementById(f),"width"))?i():setTimeout(u,100))}()}}},r={v:"3.1.1",ie:function(){var t=navigator.userAgent.toLowerCase();return!!(e.ActiveXObject||"ActiveXObject"in e)&&((t.match(/msie\s(\d+)/)||[])[1]||"11")}(),index:e.layer&&e.layer.v?1e5:0,path:o.getPath,config:function(e,t){return e=e||{},r.cache=o.config=i.extend({},o.config,e),r.path=o.config.path||r.path,"string"==typeof e.extend&&(e.extend=[e.extend]),o.config.path&&r.ready(),e.extend?(a?layui.addcss("modules/layer/"+e.extend):o.link("theme/"+e.extend),this):this},ready:function(e){var t="layer",i="",n=(a?"modules/layer/":"theme/")+"default/layer.css?v="+r.v+i;return a?layui.addcss(n,e,t):o.link(n,e,t),this},alert:function(e,t,n){var a="function"==typeof t;return a&&(n=t),r.open(i.extend({content:e,yes:n},a?{}:t))},confirm:function(e,t,n,a){var s="function"==typeof t;return s&&(a=n,n=t),r.open(i.extend({content:e,btn:o.btn,yes:n,btn2:a},s?{}:t))},msg:function(e,n,a){var s="function"==typeof n,f=o.config.skin,c=(f?f+" "+f+"-msg":"")||"layui-layer-msg",u=l.anim.length-1;return s&&(a=n),r.open(i.extend({content:e,time:3e3,shade:!1,skin:c,title:!1,closeBtn:!1,btn:!1,resize:!1,end:a},s&&!o.config.skin?{skin:c+" layui-layer-hui",anim:u}:function(){return n=n||{},(n.icon===-1||n.icon===t&&!o.config.skin)&&(n.skin=c+" "+(n.skin||"layui-layer-hui")),n}()))},load:function(e,t){return r.open(i.extend({type:3,icon:e||0,resize:!1,shade:.01},t))},tips:function(e,t,n){return r.open(i.extend({type:4,content:[e,t],closeBtn:!1,time:3e3,shade:!1,resize:!1,fixed:!1,maxWidth:210},n))}},s=function(e){var t=this;t.index=++r.index,t.config=i.extend({},t.config,o.config,e),document.body?t.creat():setTimeout(function(){t.creat()},30)};s.pt=s.prototype;var l=["layui-layer",".layui-layer-title",".layui-layer-main",".layui-layer-dialog","layui-layer-iframe","layui-layer-content","layui-layer-btn","layui-layer-close"];l.anim=["layer-anim-00","layer-anim-01","layer-anim-02","layer-anim-03","layer-anim-04","layer-anim-05","layer-anim-06"],s.pt.config={type:0,shade:.3,fixed:!0,move:l[1],title:"信息",offset:"auto",area:"auto",closeBtn:1,time:0,zIndex:19891014,maxWidth:360,anim:0,isOutAnim:!0,icon:-1,moveType:1,resize:!0,scrollbar:!0,tips:2},s.pt.vessel=function(e,t){var n=this,a=n.index,r=n.config,s=r.zIndex+a,f="object"==typeof r.title,c=r.maxmin&&(1===r.type||2===r.type),u=r.title?'
        '+(f?r.title[0]:r.title)+"
        ":"";return r.zIndex=s,t([r.shade?'
        ':"",'
        '+(e&&2!=r.type?"":u)+'
        '+(0==r.type&&r.icon!==-1?'':"")+(1==r.type&&e?"":r.content||"")+'
        '+function(){var e=c?'':"";return r.closeBtn&&(e+=''),e}()+""+(r.btn?function(){var e="";"string"==typeof r.btn&&(r.btn=[r.btn]);for(var t=0,i=r.btn.length;t'+r.btn[t]+"";return'
        '+e+"
        "}():"")+(r.resize?'':"")+"
        "],u,i('
        ')),n},s.pt.creat=function(){var e=this,t=e.config,a=e.index,s=t.content,f="object"==typeof s,c=i("body");if(!t.id||!i("#"+t.id)[0]){switch("string"==typeof t.area&&(t.area="auto"===t.area?["",""]:[t.area,""]),t.shift&&(t.anim=t.shift),6==r.ie&&(t.fixed=!1),t.type){case 0:t.btn="btn"in t?t.btn:o.btn[0],r.closeAll("dialog");break;case 2:var s=t.content=f?t.content:[t.content||"http://layer.layui.com","auto"];t.content='';break;case 3:delete t.title,delete t.closeBtn,t.icon===-1&&0===t.icon,r.closeAll("loading");break;case 4:f||(t.content=[t.content,"body"]),t.follow=t.content[1],t.content=t.content[0]+'',delete t.title,t.tips="object"==typeof t.tips?t.tips:[t.tips,!0],t.tipsMore||r.closeAll("tips")}if(e.vessel(f,function(n,r,u){c.append(n[0]),f?function(){2==t.type||4==t.type?function(){i("body").append(n[1])}():function(){s.parents("."+l[0])[0]||(s.data("display",s.css("display")).show().addClass("layui-layer-wrap").wrap(n[1]),i("#"+l[0]+a).find("."+l[5]).before(r))}()}():c.append(n[1]),i(".layui-layer-move")[0]||c.append(o.moveElem=u),e.layero=i("#"+l[0]+a),t.scrollbar||l.html.css("overflow","hidden").attr("layer-full",a)}).auto(a),i("#layui-layer-shade"+e.index).css({"background-color":t.shade[1]||"#000",opacity:t.shade[0]||t.shade}),2==t.type&&6==r.ie&&e.layero.find("iframe").attr("src",s[0]),4==t.type?e.tips():e.offset(),t.fixed&&n.on("resize",function(){e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(a),4==t.type&&e.tips()}),t.time<=0||setTimeout(function(){r.close(e.index)},t.time),e.move().callback(),l.anim[t.anim]){var u="layer-anim "+l.anim[t.anim];e.layero.addClass(u).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){i(this).removeClass(u)})}t.isOutAnim&&e.layero.data("isOutAnim",!0)}},s.pt.auto=function(e){var t=this,a=t.config,o=i("#"+l[0]+e);""===a.area[0]&&a.maxWidth>0&&(r.ie&&r.ie<8&&a.btn&&o.width(o.innerWidth()),o.outerWidth()>a.maxWidth&&o.width(a.maxWidth));var s=[o.innerWidth(),o.innerHeight()],f=o.find(l[1]).outerHeight()||0,c=o.find("."+l[6]).outerHeight()||0,u=function(e){e=o.find(e),e.height(s[1]-f-c-2*(0|parseFloat(e.css("padding-top"))))};switch(a.type){case 2:u("iframe");break;default:""===a.area[1]?a.maxHeight>0&&o.outerHeight()>a.maxHeight?(s[1]=a.maxHeight,u("."+l[5])):a.fixed&&s[1]>=n.height()&&(s[1]=n.height(),u("."+l[5])):u("."+l[5])}return t},s.pt.offset=function(){var e=this,t=e.config,i=e.layero,a=[i.outerWidth(),i.outerHeight()],o="object"==typeof t.offset;e.offsetTop=(n.height()-a[1])/2,e.offsetLeft=(n.width()-a[0])/2,o?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=n.width()-a[0]:"b"===t.offset?e.offsetTop=n.height()-a[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=n.width()-a[0]):"rb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=n.width()-a[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?n.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?n.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=n.scrollTop(),e.offsetLeft+=n.scrollLeft()),i.attr("minLeft")&&(e.offsetTop=n.height()-(i.find(l[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},s.pt.tips=function(){var e=this,t=e.config,a=e.layero,o=[a.outerWidth(),a.outerHeight()],r=i(t.follow);r[0]||(r=i("body"));var s={width:r.outerWidth(),height:r.outerHeight(),top:r.offset().top,left:r.offset().left},f=a.find(".layui-layer-TipsG"),c=t.tips[0];t.tips[1]||f.remove(),s.autoLeft=function(){s.left+o[0]-n.width()>0?(s.tipLeft=s.left+s.width-o[0],f.css({right:12,left:"auto"})):s.tipLeft=s.left},s.where=[function(){s.autoLeft(),s.tipTop=s.top-o[1]-10,f.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left+s.width+10,s.tipTop=s.top,f.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color",t.tips[1])},function(){s.autoLeft(),s.tipTop=s.top+s.height+10,f.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left-o[0]-10,s.tipTop=s.top,f.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color",t.tips[1])}],s.where[c-1](),1===c?s.top-(n.scrollTop()+o[1]+16)<0&&s.where[2]():2===c?n.width()-(s.left+s.width+o[0]+16)>0||s.where[3]():3===c?s.top-n.scrollTop()+s.height+o[1]+16-n.height()>0&&s.where[0]():4===c&&o[0]+16-s.left>0&&s.where[1](),a.find("."+l[5]).css({"background-color":t.tips[1],"padding-right":t.closeBtn?"30px":""}),a.css({left:s.tipLeft-(t.fixed?n.scrollLeft():0),top:s.tipTop-(t.fixed?n.scrollTop():0)})},s.pt.move=function(){var e=this,t=e.config,a=i(document),s=e.layero,l=s.find(t.move),f=s.find(".layui-layer-resize"),c={};return t.move&&l.css("cursor","move"),l.on("mousedown",function(e){e.preventDefault(),t.move&&(c.moveStart=!0,c.offset=[e.clientX-parseFloat(s.css("left")),e.clientY-parseFloat(s.css("top"))],o.moveElem.css("cursor","move").show())}),f.on("mousedown",function(e){e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],c.area=[s.outerWidth(),s.outerHeight()],o.moveElem.css("cursor","se-resize").show()}),a.on("mousemove",function(i){if(c.moveStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1],l="fixed"===s.css("position");if(i.preventDefault(),c.stX=l?0:n.scrollLeft(),c.stY=l?0:n.scrollTop(),!t.moveOut){var f=n.width()-s.outerWidth()+c.stX,u=n.height()-s.outerHeight()+c.stY;af&&(a=f),ou&&(o=u)}s.css({left:a,top:o})}if(t.resize&&c.resizeStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1];i.preventDefault(),r.style(e.index,{width:c.area[0]+a,height:c.area[1]+o}),c.isResize=!0,t.resizing&&t.resizing(s)}}).on("mouseup",function(e){c.moveStart&&(delete c.moveStart,o.moveElem.hide(),t.moveEnd&&t.moveEnd(s)),c.resizeStart&&(delete c.resizeStart,o.moveElem.hide())}),e},s.pt.callback=function(){function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)}var t=this,n=t.layero,a=t.config;t.openLayer(),a.success&&(2==a.type?n.find("iframe").on("load",function(){a.success(n,t.index)}):a.success(n,t.index)),6==r.ie&&t.IE6(n),n.find("."+l[6]).children("a").on("click",function(){var e=i(this).index();if(0===e)a.yes?a.yes(t.index,n):a.btn1?a.btn1(t.index,n):r.close(t.index);else{var o=a["btn"+(e+1)]&&a["btn"+(e+1)](t.index,n);o===!1||r.close(t.index)}}),n.find("."+l[7]).on("click",e),a.shadeClose&&i("#layui-layer-shade"+t.index).on("click",function(){r.close(t.index)}),n.find(".layui-layer-min").on("click",function(){var e=a.min&&a.min(n);e===!1||r.min(t.index,a)}),n.find(".layui-layer-max").on("click",function(){i(this).hasClass("layui-layer-maxmin")?(r.restore(t.index),a.restore&&a.restore(n)):(r.full(t.index,a),setTimeout(function(){a.full&&a.full(n)},100))}),a.end&&(o.end[t.index]=a.end)},o.reselect=function(){i.each(i("select"),function(e,t){var n=i(this);n.parents("."+l[0])[0]||1==n.attr("layer")&&i("."+l[0]).length<1&&n.removeAttr("layer").show(),n=null})},s.pt.IE6=function(e){i("select").each(function(e,t){var n=i(this);n.parents("."+l[0])[0]||"none"===n.css("display")||n.attr({layer:"1"}).hide(),n=null})},s.pt.openLayer=function(){var e=this;r.zIndex=e.config.zIndex,r.setTop=function(e){var t=function(){r.zIndex++,e.css("z-index",r.zIndex+1)};return r.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",t),r.zIndex}},o.record=function(e){var t=[e.width(),e.height(),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:t})},o.rescollbar=function(e){l.html.attr("layer-full")==e&&(l.html[0].style.removeProperty?l.html[0].style.removeProperty("overflow"):l.html[0].style.removeAttribute("overflow"),l.html.removeAttr("layer-full"))},e.layer=r,r.getChildFrame=function(e,t){return t=t||i("."+l[4]).attr("times"),i("#"+l[0]+t).find("iframe").contents().find(e)},r.getFrameIndex=function(e){return i("#"+e).parents("."+l[4]).attr("times")},r.iframeAuto=function(e){if(e){var t=r.getChildFrame("html",e).outerHeight(),n=i("#"+l[0]+e),a=n.find(l[1]).outerHeight()||0,o=n.find("."+l[6]).outerHeight()||0;n.css({height:t+a+o}),n.find("iframe").css({height:t})}},r.iframeSrc=function(e,t){i("#"+l[0]+e).find("iframe").attr("src",t)},r.style=function(e,t,n){var a=i("#"+l[0]+e),r=a.find(".layui-layer-content"),s=a.attr("type"),f=a.find(l[1]).outerHeight()||0,c=a.find("."+l[6]).outerHeight()||0;a.attr("minLeft");s!==o.type[3]&&s!==o.type[4]&&(n||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-f-c<=64&&(t.height=64+f+c)),a.css(t),c=a.find("."+l[6]).outerHeight(),s===o.type[2]?a.find("iframe").css({height:parseFloat(t.height)-f-c}):r.css({height:parseFloat(t.height)-f-c-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom"))}))},r.min=function(e,t){var a=i("#"+l[0]+e),s=a.find(l[1]).outerHeight()||0,f=a.attr("minLeft")||181*o.minIndex+"px",c=a.css("position");o.record(a),o.minLeft[0]&&(f=o.minLeft[0],o.minLeft.shift()),a.attr("position",c),r.style(e,{width:180,height:s,left:f,top:n.height()-s,position:"fixed",overflow:"hidden"},!0),a.find(".layui-layer-min").hide(),"page"===a.attr("type")&&a.find(l[4]).hide(),o.rescollbar(e),a.attr("minLeft")||o.minIndex++,a.attr("minLeft",f)},r.restore=function(e){var t=i("#"+l[0]+e),n=t.attr("area").split(",");t.attr("type");r.style(e,{width:parseFloat(n[0]),height:parseFloat(n[1]),top:parseFloat(n[2]),left:parseFloat(n[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===t.attr("type")&&t.find(l[4]).show(),o.rescollbar(e)},r.full=function(e){var t,a=i("#"+l[0]+e);o.record(a),l.html.attr("layer-full")||l.html.css("overflow","hidden").attr("layer-full",e),clearTimeout(t),t=setTimeout(function(){var t="fixed"===a.css("position");r.style(e,{top:t?0:n.scrollTop(),left:t?0:n.scrollLeft(),width:n.width(),height:n.height()},!0),a.find(".layui-layer-min").hide()},100)},r.title=function(e,t){var n=i("#"+l[0]+(t||r.index)).find(l[1]);n.html(e)},r.close=function(e){var t=i("#"+l[0]+e),n=t.attr("type"),a="layer-anim-close";if(t[0]){var s="layui-layer-wrap",f=function(){if(n===o.type[1]&&"object"===t.attr("conType")){t.children(":not(."+l[5]+")").remove();for(var a=t.find("."+s),r=0;r<2;r++)a.unwrap();a.css("display",a.data("display")).removeClass(s)}else{if(n===o.type[2])try{var f=i("#"+l[4]+e)[0];f.contentWindow.document.write(""),f.contentWindow.close(),t.find("."+l[5])[0].removeChild(f)}catch(c){}t[0].innerHTML="",t.remove()}"function"==typeof o.end[e]&&o.end[e](),delete o.end[e]};t.data("isOutAnim")&&t.addClass("layer-anim "+a),i("#layui-layer-moves, #layui-layer-shade"+e).remove(),6==r.ie&&o.reselect(),o.rescollbar(e),t.attr("minLeft")&&(o.minIndex--,o.minLeft.push(t.attr("minLeft"))),r.ie&&r.ie<10||!t.data("isOutAnim")?f():setTimeout(function(){f()},200)}},r.closeAll=function(e){i.each(i("."+l[0]),function(){var t=i(this),n=e?t.attr("type")===e:1;n&&r.close(t.attr("times")),n=null})};var f=r.cache||{},c=function(e){return f.skin?" "+f.skin+" "+f.skin+"-"+e:""};r.prompt=function(e,t){var a="";if(e=e||{},"function"==typeof e&&(t=e),e.area){var o=e.area;a='style="width: '+o[0]+"; height: "+o[1]+';"',delete e.area}var s,l=2==e.formType?'":function(){return''}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:["确定","取消"],content:l,skin:"layui-layer-prompt"+c("prompt"),maxWidth:n.width(),success:function(t){s=t.find(".layui-layer-input"),s.val(e.value||"").focus(),"function"==typeof f&&f(t)},resize:!1,yes:function(i){var n=s.val();""===n?s.focus():n.length>(e.maxlength||500)?r.tips("最多输入"+(e.maxlength||500)+"个字数",s,{tips:1}):t&&t(n,i,s)}},e))},r.tab=function(e){e=e||{};var t=e.tab||{},n="layui-this",a=e.success;return delete e.success,r.open(i.extend({type:1,skin:"layui-layer-tab"+c("tab"),resize:!1,title:function(){var e=t.length,i=1,a="";if(e>0)for(a=''+t[0].title+"";i"+t[i].title+"";return a}(),content:'
          '+function(){var e=t.length,i=1,a="";if(e>0)for(a='
        • '+(t[0].content||"no content")+"
        • ";i'+(t[i].content||"no content")+"";return a}()+"
        ",success:function(t){var o=t.find(".layui-layer-title").children(),r=t.find(".layui-layer-tabmain").children();o.on("mousedown",function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0;var a=i(this),o=a.index();a.addClass(n).siblings().removeClass(n),r.eq(o).show().siblings().hide(),"function"==typeof e.change&&e.change(o)}),"function"==typeof a&&a(t)}},e))},r.photos=function(t,n,a){function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,i(e)}))}var s={};if(t=t||{},t.photos){var l=t.photos.constructor===Object,f=l?t.photos:{},u=f.data||[],d=f.start||0;s.imgIndex=(0|d)+1,t.img=t.img||"img";var y=t.success;if(delete t.success,l){if(0===u.length)return r.msg("没有图片")}else{var p=i(t.photos),h=function(){u=[],p.find(t.img).each(function(e){var t=i(this);t.attr("layer-index",e),u.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(h(),0===u.length)return;if(n||p.on("click",t.img,function(){var e=i(this),n=e.attr("layer-index");r.photos(i.extend(t,{photos:{start:n,data:u,tab:t.tab},full:t.full}),!0),h()}),!n)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=u.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>u.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){if(!s.end){var t=e.keyCode;e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&r.close(s.index)}},s.tabimg=function(e){if(!(u.length<=1))return f.start=s.imgIndex-1,r.close(s.index),r.photos(t,!0,e)},s.event=function(){s.bigimg.hover(function(){s.imgsee.show()},function(){s.imgsee.hide()}),s.bigimg.find(".layui-layer-imgprev").on("click",function(e){e.preventDefault(),s.imgprev()}),s.bigimg.find(".layui-layer-imgnext").on("click",function(e){e.preventDefault(),s.imgnext()}),i(document).on("keyup",s.keyup)},s.loadi=r.load(1,{shade:!("shade"in t)&&.9,scrollbar:!1}),o(u[d].src,function(n){r.close(s.loadi),s.index=r.open(i.extend({type:1,id:"layui-layer-photos",area:function(){var a=[n.width,n.height],o=[i(e).width()-100,i(e).height()-100];if(!t.full&&(a[0]>o[0]||a[1]>o[1])){var r=[a[0]/o[0],a[1]/o[1]];r[0]>r[1]?(a[0]=a[0]/r[0],a[1]=a[1]/r[0]):r[0]'+(u[d].alt||
        '+(u.length>1?'':"")+'
        '+(u[d].alt||"")+""+s.imgIndex+"/"+u.length+"
        ",success:function(e,i){s.bigimg=e.find(".layui-layer-phimg"),s.imgsee=e.find(".layui-layer-imguide,.layui-layer-imgbar"),s.event(e),t.tab&&t.tab(u[d],e),"function"==typeof y&&y(e)},end:function(){s.end=!0,i(document).off("keyup",s.keyup)}},t))},function(){r.close(s.loadi),r.msg("当前图片地址异常
        是否继续查看下一张?",{time:3e4,btn:["下一张","不看了"],yes:function(){u.length>1&&s.imgnext(!0,!0)}})})}},o.run=function(t){i=t,n=i(e),l.html=i("html"),r.open=function(e){var t=new s(e);return t.index}},e.layui&&layui.define?(r.ready(),layui.define("jquery",function(t){r.path=layui.cache.dir,o.run(layui.$),e.layer=r,t("layer",r)})):"function"==typeof define&&define.amd?define(["jquery"],function(){return o.run(e.jQuery),r}):function(){o.run(e.jQuery),r.ready()}()}(window);layui.define("jquery",function(t){"use strict";var a=layui.$,i=(layui.hint(),layui.device()),e="element",l="layui-this",n="layui-show",s=function(){this.config={}};s.prototype.set=function(t){var i=this;return a.extend(!0,i.config,t),i},s.prototype.on=function(t,a){return layui.onevent.call(this,e,t,a)},s.prototype.tabAdd=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.children(".layui-tab-bar"),o=l.children(".layui-tab-content"),r='
      • "+(i.title||"unnaming")+"
      • ";return s[0]?s.before(r):n.append(r),o.append('
        '+(i.content||"")+"
        "),f.hideTabMore(!0),f.tabAuto(),this},s.prototype.tabDelete=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.find('>li[lay-id="'+i+'"]');return f.tabDelete(null,s),this},s.prototype.tabChange=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.find('>li[lay-id="'+i+'"]');return f.tabClick.call(s[0],null,null,s),this},s.prototype.tab=function(t){t=t||{},b.on("click",t.headerElem,function(i){var e=a(this).index();f.tabClick.call(this,i,e,null,t)})},s.prototype.progress=function(t,i){var e="layui-progress",l=a("."+e+"[lay-filter="+t+"]"),n=l.find("."+e+"-bar"),s=n.find("."+e+"-text");return n.css("width",i),s.text(i),this};var o=".layui-nav",r="layui-nav-item",c="layui-nav-bar",u="layui-nav-tree",d="layui-nav-child",y="layui-nav-more",h="layui-anim layui-anim-upbit",f={tabClick:function(t,i,s,o){o=o||{};var r=s||a(this),i=i||r.parent().children("li").index(r),c=o.headerElem?r.parent():r.parents(".layui-tab").eq(0),u=o.bodyElem?a(o.bodyElem):c.children(".layui-tab-content").children(".layui-tab-item"),d=r.find("a"),y=c.attr("lay-filter");"javascript:;"!==d.attr("href")&&"_blank"===d.attr("target")||(r.addClass(l).siblings().removeClass(l),u.eq(i).addClass(n).siblings().removeClass(n)),layui.event.call(this,e,"tab("+y+")",{elem:c,index:i})},tabDelete:function(t,i){var n=i||a(this).parent(),s=n.index(),o=n.parents(".layui-tab").eq(0),r=o.children(".layui-tab-content").children(".layui-tab-item"),c=o.attr("lay-filter");n.hasClass(l)&&(n.next()[0]?f.tabClick.call(n.next()[0],null,s+1):n.prev()[0]&&f.tabClick.call(n.prev()[0],null,s-1)),n.remove(),r.eq(s).remove(),setTimeout(function(){f.tabAuto()},50),layui.event.call(this,e,"tabDelete("+c+")",{elem:o,index:s})},tabAuto:function(){var t="layui-tab-more",e="layui-tab-bar",l="layui-tab-close",n=this;a(".layui-tab").each(function(){var s=a(this),o=s.children(".layui-tab-title"),r=(s.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),c=a('');if(n===window&&8!=i.ie&&f.hideTabMore(!0),s.attr("lay-allowClose")&&o.find("li").each(function(){var t=a(this);if(!t.find("."+l)[0]){var i=a('ဆ');i.on("click",f.tabDelete),t.append(i)}}),"string"!=typeof s.attr("lay-unauto"))if(o.prop("scrollWidth")>o.outerWidth()+1){if(o.find("."+e)[0])return;o.append(c),s.attr("overflow",""),c.on("click",function(a){o[this.title?"removeClass":"addClass"](t),this.title=this.title?"":"收缩"})}else o.find("."+e).remove(),s.removeAttr("overflow")})},hideTabMore:function(t){var i=a(".layui-tab-title");t!==!0&&"tabmore"===a(t.target).attr("lay-stope")||(i.removeClass("layui-tab-more"),i.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var t=a(this),i=t.parents(o),n=i.attr("lay-filter"),s=t.parent(),c=t.siblings("."+d),y="string"==typeof s.attr("lay-unselect");"javascript:;"!==t.attr("href")&&"_blank"===t.attr("target")||y||c[0]||(i.find("."+l).removeClass(l),s.addClass(l)),i.hasClass(u)&&(c.removeClass(h),c[0]&&(s["none"===c.css("display")?"addClass":"removeClass"](r+"ed"),"all"===i.attr("lay-shrink")&&s.siblings().removeClass(r+"ed"))),layui.event.call(this,e,"nav("+n+")",t)},collapse:function(){var t=a(this),i=t.find(".layui-colla-icon"),l=t.siblings(".layui-colla-content"),s=t.parents(".layui-collapse").eq(0),o=s.attr("lay-filter"),r="none"===l.css("display");if("string"==typeof s.attr("lay-accordion")){var c=s.children(".layui-colla-item").children("."+n);c.siblings(".layui-colla-title").children(".layui-colla-icon").html(""),c.removeClass(n)}l[r?"addClass":"removeClass"](n),i.html(r?"":""),layui.event.call(this,e,"collapse("+o+")",{title:t,content:l,show:r})}};s.prototype.init=function(t,e){var l=function(){return e?'[lay-filter="'+e+'"]':""}(),s={tab:function(){f.tabAuto.call({})},nav:function(){var t=200,e={},s={},p={},b=function(l,o,r){var c=a(this),f=c.find("."+d);o.hasClass(u)?l.css({top:c.position().top,height:c.children("a").outerHeight(),opacity:1}):(f.addClass(h),l.css({left:c.position().left+parseFloat(c.css("marginLeft")),top:c.position().top+c.height()-l.height()}),e[r]=setTimeout(function(){l.css({width:c.width(),opacity:1})},i.ie&&i.ie<10?0:t),clearTimeout(p[r]),"block"===f.css("display")&&clearTimeout(s[r]),s[r]=setTimeout(function(){f.addClass(n),c.find("."+y).addClass(y+"d")},300))};a(o+l).each(function(i){var l=a(this),o=a(''),h=l.find("."+r);l.find("."+c)[0]||(l.append(o),h.on("mouseenter",function(){b.call(this,o,l,i)}).on("mouseleave",function(){l.hasClass(u)||(clearTimeout(s[i]),s[i]=setTimeout(function(){l.find("."+d).removeClass(n),l.find("."+y).removeClass(y+"d")},300))}),l.on("mouseleave",function(){clearTimeout(e[i]),p[i]=setTimeout(function(){l.hasClass(u)?o.css({height:0,top:o.position().top+o.height()/2,opacity:0}):o.css({width:0,left:o.position().left+o.width()/2,opacity:0})},t)})),h.find("a").each(function(){var t=a(this),i=(t.parent(),t.siblings("."+d));i[0]&&!t.children("."+y)[0]&&t.append(''),t.off("click",f.clickThis).on("click",f.clickThis)})})},breadcrumb:function(){var t=".layui-breadcrumb";a(t+l).each(function(){var t=a(this),i="lay-separator",e=t.attr(i)||"/",l=t.find("a");l.next("span["+i+"]")[0]||(l.each(function(t){t!==l.length-1&&a(this).after(""+e+"")}),t.css("visibility","visible"))})},progress:function(){var t="layui-progress";a("."+t+l).each(function(){var i=a(this),e=i.find(".layui-progress-bar"),l=e.attr("lay-percent");e.css("width",function(){return/^.+\/.+$/.test(l)?100*new Function("return "+l)()+"%":l}()),i.attr("lay-showPercent")&&setTimeout(function(){e.html(''+l+"")},350)})},collapse:function(){var t="layui-collapse";a("."+t+l).each(function(){var t=a(this).find(".layui-colla-item");t.each(function(){var t=a(this),i=t.find(".layui-colla-title"),e=t.find(".layui-colla-content"),l="none"===e.css("display");i.find(".layui-colla-icon").remove(),i.append(''+(l?"":"")+""),i.off("click",f.collapse).on("click",f.collapse)})})}};return s[t]?s[t]():layui.each(s,function(t,a){a()})},s.prototype.render=s.prototype.init;var p=new s,b=a(document);p.render();var v=".layui-tab-title li";b.on("click",v,f.tabClick),b.on("click",f.hideTabMore),a(window).on("resize",f.tabAuto),t(e,p)});layui.define("layer",function(e){"use strict";var i=layui.$,t=layui.layer,n=layui.hint(),a=layui.device(),o={config:{},set:function(e){var t=this;return t.config=i.extend({},t.config,e),t},on:function(e,i){return layui.onevent.call(this,r,e,i)}},l=function(){var e=this;return{upload:function(i){e.upload.call(e,i)},config:e.config}},r="upload",u="layui-upload-file",c="layui-upload-form",f="layui-upload-iframe",s="layui-upload-choose",p=function(e){var t=this;t.config=i.extend({},t.config,o.config,e),t.render()};p.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",field:"file",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1},p.prototype.render=function(e){var t=this,e=t.config;e.elem=i(e.elem),e.bindAction=i(e.bindAction),t.file(),t.events()},p.prototype.file=function(){var e=this,t=e.config,n=e.elemFile=i(['"].join("")),o=t.elem.next();(o.hasClass(u)||o.hasClass(c))&&o.remove(),a.ie&&a.ie<10&&t.elem.wrap('
        '),e.isFile()?(e.elemFile=t.elem,t.field=t.elem[0].name):t.elem.after(n),a.ie&&a.ie<10&&e.initIE()},p.prototype.initIE=function(){var e=this,t=e.config,n=i(''),a=i(['
        ',"
        "].join(""));i("#"+f)[0]||i("body").append(n),t.elem.next().hasClass(c)||(e.elemFile.wrap(a),t.elem.next("."+c).append(function(){var e=[];return layui.each(t.data,function(i,t){t="function"==typeof t?t():t,e.push('')}),e.join("")}()))},p.prototype.msg=function(e){return t.msg(e,{icon:2,shift:6})},p.prototype.isFile=function(){var e=this.config.elem[0];if(e)return"input"===e.tagName.toLocaleLowerCase()&&"file"===e.type},p.prototype.preview=function(e){var i=this;window.FileReader&&layui.each(i.chooseFiles,function(i,t){var n=new FileReader;n.readAsDataURL(t),n.onload=function(){e&&e(i,t,this.result)}})},p.prototype.upload=function(e,t){var n,o=this,l=o.config,r=o.elemFile[0],u=function(){var t=0,n=0,a=e||o.files||o.chooseFiles||r.files,u=function(){l.multiple&&t+n===o.fileLength&&"function"==typeof l.allDone&&l.allDone({total:o.fileLength,successful:t,aborted:n})};layui.each(a,function(e,a){var r=new FormData;r.append(l.field,a),layui.each(l.data,function(e,i){i="function"==typeof i?i():i,r.append(e,i)}),i.ajax({url:l.url,type:l.method,data:r,contentType:!1,processData:!1,dataType:"json",headers:l.headers||{},success:function(i){t++,d(e,i),u()},error:function(){n++,o.msg("请求上传接口出现异常"),m(e),u()}})})},c=function(){var e=i("#"+f);o.elemFile.parent().submit(),clearInterval(p.timer),p.timer=setInterval(function(){var i,t=e.contents().find("body");try{i=t.text()}catch(n){o.msg("获取上传后的响应信息出现异常"),clearInterval(p.timer),m()}i&&(clearInterval(p.timer),t.html(""),d(0,i))},30)},d=function(e,i){if(o.elemFile.next("."+s).remove(),r.value="","object"!=typeof i)try{i=JSON.parse(i)}catch(t){return i={},o.msg("请对上传接口返回有效JSON")}"function"==typeof l.done&&l.done(i,e||0,function(e){o.upload(e)})},m=function(e){l.auto&&(r.value=""),"function"==typeof l.error&&l.error(e||0,function(e){o.upload(e)})},h=l.exts,v=function(){var i=[];return layui.each(e||o.chooseFiles,function(e,t){i.push(t.name)}),i}(),g={preview:function(e){o.preview(e)},upload:function(e,i){var t={};t[e]=i,o.upload(t)},pushFile:function(){return o.files=o.files||{},layui.each(o.chooseFiles,function(e,i){o.files[e]=i}),o.files},resetFile:function(e,i,t){var n=new File([i],t);o.files=o.files||{},o.files[e]=n}},y=function(){if("choose"!==t&&!l.auto||(l.choose&&l.choose(g),"choose"!==t))return l.before&&l.before(g),a.ie?a.ie>9?u():c():void u()};if(v=0===v.length?r.value.match(/[^\/\\]+\..+/g)||[]||"":v,0!==v.length){switch(l.accept){case"file":if(h&&!RegExp("\\w\\.("+h+")$","i").test(escape(v)))return o.msg("选择的文件中包含不支持的格式"),r.value="";break;case"video":if(!RegExp("\\w\\.("+(h||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(v)))return o.msg("选择的视频中包含不支持的格式"),r.value="";break;case"audio":if(!RegExp("\\w\\.("+(h||"mp3|wav|mid")+")$","i").test(escape(v)))return o.msg("选择的音频中包含不支持的格式"),r.value="";break;default:if(layui.each(v,function(e,i){RegExp("\\w\\.("+(h||"jpg|png|gif|bmp|jpeg$")+")","i").test(escape(i))||(n=!0)}),n)return o.msg("选择的图片中包含不支持的格式"),r.value=""}if(o.fileLength=function(){var i=0,t=e||o.files||o.chooseFiles||r.files;return layui.each(t,function(){i++}),i}(),l.number&&o.fileLength>l.number)return o.msg("同时最多只能上传的数量为:"+l.number);if(l.size>0&&!(a.ie&&a.ie<10)){var F;if(layui.each(o.chooseFiles,function(e,i){if(i.size>1024*l.size){var t=l.size/1024;t=t>=1?t.toFixed(2)+"MB":l.size+"KB",r.value="",F=t}}),F)return o.msg("文件不能超过"+F)}y()}},p.prototype.events=function(){var e=this,t=e.config,o=function(i){e.chooseFiles={},layui.each(i,function(i,t){var n=(new Date).getTime();e.chooseFiles[n+"-"+i]=t})},l=function(i,n){var a=e.elemFile,o=i.length>1?i.length+"个文件":(i[0]||{}).name||a[0].value.match(/[^\/\\]+\..+/g)||[]||"";a.next().hasClass(s)&&a.next().remove(),e.upload(null,"choose"),e.isFile()||t.choose||a.after(''+o+"")};t.elem.off("upload.start").on("upload.start",function(){var a=i(this),o=a.attr("lay-data");if(o)try{o=new Function("return "+o)(),e.config=i.extend({},t,o)}catch(l){n.error("Upload element property lay-data configuration item has a syntax error: "+o)}e.config.item=a,e.elemFile[0].click()}),a.ie&&a.ie<10||t.elem.off("upload.over").on("upload.over",function(){var e=i(this);e.attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){var e=i(this);e.removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(n,a){var r=i(this),u=a.originalEvent.dataTransfer.files||[];r.removeAttr("lay-over"),o(u),t.auto?e.upload(u):l(u)}),e.elemFile.off("upload.change").on("upload.change",function(){var i=this.files||[];o(i),t.auto?e.upload():l(i)}),t.bindAction.off("upload.action").on("upload.action",function(){e.upload()}),t.elem.data("haveEvents")||(e.elemFile.on("change",function(){i(this).trigger("upload.change")}),t.elem.on("click",function(){e.isFile()||i(this).trigger("upload.start")}),t.drag&&t.elem.on("dragover",function(e){e.preventDefault(),i(this).trigger("upload.over")}).on("dragleave",function(e){i(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),i(this).trigger("upload.drop",e)}),t.bindAction.on("click",function(){i(this).trigger("upload.action")}),t.elem.data("haveEvents",!0))},o.render=function(e){var i=new p(e);return l.call(i)},e(r,o)});layui.define("layer",function(e){"use strict";var i=layui.$,t=layui.layer,a=layui.hint(),n=layui.device(),l="form",r=".layui-form",s="layui-this",o="layui-hide",c="layui-disabled",u=function(){this.config={verify:{required:[/[\S]+/,"必填项不能为空"],phone:[/^1\d{10}$/,"请输入正确的手机号"],email:[/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,"邮箱格式不正确"],url:[/(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/,"链接格式不正确"],number:function(e){if(!e||isNaN(e))return"只能填写数字"},date:[/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/,"日期格式不正确"],identity:[/(^\d{15}$)|(^\d{17}(x|X|\d)$)/,"请输入正确的身份证号"]}}};u.prototype.set=function(e){var t=this;return i.extend(!0,t.config,e),t},u.prototype.verify=function(e){var t=this;return i.extend(!0,t.config.verify,e),t},u.prototype.on=function(e,i){return layui.onevent.call(this,l,e,i)},u.prototype.val=function(e,t){var a=i(r+'[lay-filter="'+e+'"]');a.each(function(e,a){var n=i(this);layui.each(t,function(e,i){var t,a=n.find('[name="'+e+'"]');a[0]&&(t=a[0].type,"checkbox"===t?a[0].checked=i:"radio"===t?a.each(function(){this.value===i&&(this.checked=!0)}):a.val(i))})}),f.render(null,e)},u.prototype.render=function(e,t){var n=this,u=i(r+function(){return t?'[lay-filter="'+t+'"]':""}()),d={select:function(){var e,t="请选择",a="layui-form-select",n="layui-select-title",r="layui-select-none",d="",f=u.find("select"),v=function(t,l){i(t.target).parent().hasClass(n)&&!l||(i("."+a).removeClass(a+"ed "+a+"up"),e&&d&&e.val(d)),e=null},y=function(t,u,f){var y,p=i(this),m=t.find("."+n),k=m.find("input"),g=t.find("dl"),x=g.children("dd"),b=this.selectedIndex;if(!u){var C=function(){var e=t.offset().top+t.outerHeight()+5-h.scrollTop(),i=g.outerHeight();b=p[0].selectedIndex,t.addClass(a+"ed"),x.removeClass(o),y=null,x.eq(b).addClass(s).siblings().removeClass(s),e+i>h.height()&&e>=i&&t.addClass(a+"up")},w=function(e){t.removeClass(a+"ed "+a+"up"),k.blur(),y=null,e||$(k.val(),function(e){e&&(d=g.find("."+s).html(),k&&k.val(d))})};m.on("click",function(e){t.hasClass(a+"ed")?w():(v(e,!0),C()),g.find("."+r).remove()}),m.find(".layui-edge").on("click",function(){k.focus()}),k.on("keyup",function(e){var i=e.keyCode;9===i&&C()}).on("keydown",function(e){var i=e.keyCode;9===i&&w();var t=function(i,a){var n,l;if(e.preventDefault(),a=function(){return a&&a[0]?a:y&&y[0]?y:x.eq(b)}(),l=a[i](),n=a[i]("dd"),l[0]){if(y=a[i](),!n[0]||n.hasClass(c))return t(i,y);n.addClass(s).siblings().removeClass(s);var r=g.children("dd.layui-this"),o=r.position().top,u=g.height(),d=r.height();o>u&&g.scrollTop(o+g.scrollTop()-u+d-5),o<0&&g.scrollTop(o+g.scrollTop())}};38===i&&t("prev"),40===i&&t("next"),13===i&&(e.preventDefault(),g.children("dd."+s).trigger("click"))});var $=function(e,t,a){var n=0;layui.each(x,function(){var t=i(this),l=t.text(),r=l.indexOf(e)===-1;(""===e||"blur"===a?e!==l:r)&&n++,"keyup"===a&&t[r?"addClass":"removeClass"](o)});var l=n===x.length;return t(l),l},T=function(e){var i=this.value,t=e.keyCode;return 9!==t&&13!==t&&37!==t&&38!==t&&39!==t&&40!==t&&($(i,function(e){e?g.find("."+r)[0]||g.append('

        无匹配项

        '):g.find("."+r).remove()},"keyup"),void(""===i&&g.find("."+r).remove()))};f&&k.on("keyup",T).on("blur",function(t){var a=p[0].selectedIndex;e=k,d=i(p[0].options[a]).html(),setTimeout(function(){$(k.val(),function(e){d||k.val("")},"blur")},200)}),x.on("click",function(){var e=i(this),a=e.attr("lay-value"),n=p.attr("lay-filter");return!e.hasClass(c)&&(e.hasClass("layui-select-tips")?k.val(""):(k.val(e.text()),e.addClass(s)),e.siblings().removeClass(s),p.val(a).removeClass("layui-form-danger"),layui.event.call(this,l,"select("+n+")",{elem:p[0],value:a,othis:t}),w(!0),!1)}),t.find("dl>dt").on("click",function(e){return!1}),i(document).off("click",v).on("click",v)}};f.each(function(e,l){var r=i(this),o=r.next("."+a),u=this.disabled,d=l.value,f=i(l.options[l.selectedIndex]),v=l.options[0];if("string"==typeof r.attr("lay-ignore"))return r.show();var h="string"==typeof r.attr("lay-search"),p=v?v.value?t:v.innerHTML||t:t,m=i(['
        ','
        ','','
        ','
        ',function(e){var i=[];return layui.each(e,function(e,a){0!==e||a.value?"optgroup"===a.tagName.toLowerCase()?i.push("
        "+a.label+"
        "):i.push('
        '+a.innerHTML+"
        "):i.push('
        '+(a.innerHTML||t)+"
        ")}),0===i.length&&i.push('
        没有选项
        '),i.join("")}(r.find("*"))+"
        ","
        "].join(""));o[0]&&o.remove(),r.after(m),y.call(this,m,u,h)})},checkbox:function(){var e={checkbox:["layui-form-checkbox","layui-form-checked","checkbox"],_switch:["layui-form-switch","layui-form-onswitch","switch"]},t=u.find("input[type=checkbox]"),a=function(e,t){var a=i(this);e.on("click",function(){var i=a.attr("lay-filter"),n=(a.attr("lay-text")||"").split("|");a[0].disabled||(a[0].checked?(a[0].checked=!1,e.removeClass(t[1]).find("em").text(n[1])):(a[0].checked=!0,e.addClass(t[1]).find("em").text(n[0])),layui.event.call(a[0],l,t[2]+"("+i+")",{elem:a[0],value:a[0].value,othis:e}))})};t.each(function(t,n){var l=i(this),r=l.attr("lay-skin"),s=(l.attr("lay-text")||"").split("|"),o=this.disabled;"switch"===r&&(r="_"+r);var u=e[r]||e.checkbox;if("string"==typeof l.attr("lay-ignore"))return l.show();var d=l.next("."+u[0]),f=i(['
        ",function(){var e=n.title.replace(/\s/g,""),i={checkbox:[e?""+n.title+"":"",''].join(""),_switch:""+((n.checked?s[0]:s[1])||"")+""};return i[r]||i.checkbox}(),"
        "].join(""));d[0]&&d.remove(),l.after(f),a.call(this,f,u)})},radio:function(){var e="layui-form-radio",t=["",""],a=u.find("input[type=radio]"),n=function(a){var n=i(this),s="layui-anim-scaleSpring";a.on("click",function(){var o=n[0].name,c=n.parents(r),u=n.attr("lay-filter"),d=c.find("input[name="+o.replace(/(\.|#|\[|\])/g,"\\$1")+"]");n[0].disabled||(layui.each(d,function(){var a=i(this).next("."+e);this.checked=!1,a.removeClass(e+"ed"),a.find(".layui-icon").removeClass(s).html(t[1])}),n[0].checked=!0,a.addClass(e+"ed"),a.find(".layui-icon").addClass(s).html(t[0]),layui.event.call(n[0],l,"radio("+u+")",{elem:n[0],value:n[0].value,othis:a}))})};a.each(function(a,l){var r=i(this),s=r.next("."+e),o=this.disabled;if("string"==typeof r.attr("lay-ignore"))return r.show();s[0]&&s.remove();var u=i(['
        ',''+t[l.checked?0:1]+"","
        "+function(){var e=l.title||"";return"string"==typeof r.next().attr("lay-radio")&&(e=r.next().html(),r.next().remove()),e}()+"
        ","
        "].join(""));r.after(u),n.call(this,u)})}};return e?d[e]?d[e]():a.error("不支持的"+e+"表单渲染"):layui.each(d,function(e,i){i()}),n};var d=function(){var e=i(this),a=f.config.verify,s=null,o="layui-form-danger",c={},u=e.parents(r),d=u.find("*[lay-verify]"),v=e.parents("form")[0],h=u.find("input,select,textarea"),y=e.attr("lay-filter");if(layui.each(d,function(e,l){var r=i(this),c=r.attr("lay-verify").split("|"),u=r.attr("lay-verType"),d=r.val();if(r.removeClass(o),layui.each(c,function(e,i){var c,f="",v="function"==typeof a[i];if(a[i]){var c=v?f=a[i](d,l):!a[i][0].test(d);if(f=f||a[i][1],c)return"tips"===u?t.tips(f,function(){return"string"==typeof r.attr("lay-ignore")||"select"!==l.tagName.toLowerCase()&&!/^checkbox|radio$/.test(l.type)?r:r.next()}(),{tips:1}):"alert"===u?t.alert(f,{title:"提示",shadeClose:!0}):t.msg(f,{icon:5,shift:6}),n.android||n.ios||l.focus(),r.addClass(o),s=!0}}),s)return s}),s)return!1;var p={};return layui.each(h,function(e,i){if(i.name=(i.name||"").replace(/^\s*|\s*&/,""),i.name){if(/^.*\[\]$/.test(i.name)){var t=i.name.match(/^(.*)\[\]$/g)[0];p[t]=0|p[t],i.name=i.name.replace(/^(.*)\[\]$/,"$1["+p[t]++ +"]")}/^checkbox|radio$/.test(i.type)&&!i.checked||(c[i.name]=i.value)}}),layui.event.call(this,l,"submit("+y+")",{elem:this,form:v,field:c})},f=new u,v=i(document),h=i(window);f.render(),v.on("reset",r,function(){var e=i(this).attr("lay-filter");setTimeout(function(){f.render(null,e)},50)}),v.on("submit",r,d).on("click","*[lay-submit]",d),e(l,f)});layui.define("jquery",function(e){"use strict";var o=layui.$,a=layui.hint(),i="layui-tree-enter",r=function(e){this.options=e},t={arrow:["",""],checkbox:["",""],radio:["",""],branch:["",""],leaf:""};r.prototype.init=function(e){var o=this;e.addClass("layui-box layui-tree"),o.options.skin&&e.addClass("layui-tree-skin-"+o.options.skin),o.tree(e),o.on(e)},r.prototype.tree=function(e,a){var i=this,r=i.options,n=a||r.nodes;layui.each(n,function(a,n){var l=n.children&&n.children.length>0,c=o('
          '),s=o(["
        • ",function(){return l?''+(n.spread?t.arrow[1]:t.arrow[0])+"":""}(),function(){return r.check?''+("checkbox"===r.check?t.checkbox[0]:"radio"===r.check?t.radio[0]:"")+"":""}(),function(){return'"+(''+(l?n.spread?t.branch[1]:t.branch[0]:t.leaf)+"")+(""+(n.name||"未命名")+"")}(),"
        • "].join(""));l&&(s.append(c),i.tree(c,n.children)),e.append(s),"function"==typeof r.click&&i.click(s,n),i.spread(s,n),r.drag&&i.drag(s,n)})},r.prototype.click=function(e,o){var a=this,i=a.options;e.children("a").on("click",function(e){layui.stope(e),i.click(o)})},r.prototype.spread=function(e,o){var a=this,i=(a.options,e.children(".layui-tree-spread")),r=e.children("ul"),n=e.children("a"),l=function(){e.data("spread")?(e.data("spread",null),r.removeClass("layui-show"),i.html(t.arrow[0]),n.find(".layui-icon").html(t.branch[0])):(e.data("spread",!0),r.addClass("layui-show"),i.html(t.arrow[1]),n.find(".layui-icon").html(t.branch[1]))};r[0]&&(i.on("click",l),n.on("dblclick",l))},r.prototype.on=function(e){var a=this,r=a.options,t="layui-tree-drag";e.find("i").on("selectstart",function(e){return!1}),r.drag&&o(document).on("mousemove",function(e){var i=a.move;if(i.from){var r=(i.to,o('
          '));e.preventDefault(),o("."+t)[0]||o("body").append(r);var n=o("."+t)[0]?o("."+t):r;n.addClass("layui-show").html(i.from.elem.children("a").html()),n.css({left:e.pageX+10,top:e.pageY+10})}}).on("mouseup",function(){var e=a.move;e.from&&(e.from.elem.children("a").removeClass(i),e.to&&e.to.elem.children("a").removeClass(i),a.move={},o("."+t).remove())})},r.prototype.move={},r.prototype.drag=function(e,a){var r=this,t=(r.options,e.children("a")),n=function(){var t=o(this),n=r.move;n.from&&(n.to={item:a,elem:e},t.addClass(i))};t.on("mousedown",function(){var o=r.move;o.from={item:a,elem:e}}),t.on("mouseenter",n).on("mousemove",n).on("mouseleave",function(){var e=o(this),a=r.move;a.from&&(delete a.to,e.removeClass(i))})},e("tree",function(e){var i=new r(e=e||{}),t=o(e.elem);return t[0]?void i.init(t):a.error("layui.tree 没有找到"+e.elem+"元素")})});layui.define(["laytpl","laypage","layer","form"],function(e){"use strict";var t=layui.$,i=layui.laytpl,a=layui.laypage,l=layui.layer,n=layui.form,o=layui.hint(),r=layui.device(),d={config:{checkName:"LAY_CHECKED",indexName:"LAY_TABLE_INDEX"},cache:{},index:layui.table?layui.table.index+1e4:0,set:function(e){var i=this;return i.config=t.extend({},i.config,e),i},on:function(e,t){return layui.onevent.call(this,s,e,t)}},c=function(){var e=this,t=e.config,i=t.id;return i&&(c.config[i]=t),{reload:function(t){e.reload.call(e,t)},config:t}},s="table",u=".layui-table",h="layui-hide",f="layui-none",y="layui-table-view",p=".layui-table-header",m=".layui-table-body",v=".layui-table-main",g=".layui-table-fixed",x=".layui-table-fixed-l",b=".layui-table-fixed-r",k=".layui-table-tool",C=".layui-table-page",w=".layui-table-sort",N="layui-table-edit",T="layui-table-hover",F=function(e){var t='{{#if(item2.colspan){}} colspan="{{item2.colspan}}"{{#} if(item2.rowspan){}} rowspan="{{item2.rowspan}}"{{#}}}';return e=e||{},['',"","{{# layui.each(d.data.cols, function(i1, item1){ }}","","{{# layui.each(item1, function(i2, item2){ }}",'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}','{{# if(item2.fixed === "right"){ right = true; } }}',function(){return e.fixed&&"right"!==e.fixed?'{{# if(item2.fixed && item2.fixed !== "right"){ }}':"right"===e.fixed?'{{# if(item2.fixed === "right"){ }}':""}(),'",e.fixed?"{{# }; }}":"","{{# }); }}","","{{# }); }}","","
          ','
          1){ }}","group","{{# } else { }}","{{d.index}}-{{item2.field || i2}}",'{{# if(item2.type !== "normal"){ }}'," laytable-cell-{{ item2.type }}","{{# } }}","{{# } }}",'" {{#if(item2.align){}}align="{{item2.align}}"{{#}}}>','{{# if(item2.type === "checkbox"){ }}','',"{{# } else { }}",'{{item2.title||""}}',"{{# if(!(item2.colspan > 1) && item2.sort){ }}",'',"{{# } }}","{{# } }}","
          ","
          "].join("")},W=['',"","
          "].join(""),z=['
          ',"{{# if(d.data.toolbar){ }}",'
          ',"{{# } }}",'
          ',"{{# var left, right; }}",'
          ',F(),"
          ",'
          ',W,"
          ","{{# if(left){ }}",'
          ','
          ',F({fixed:!0}),"
          ",'
          ',W,"
          ","
          ","{{# }; }}","{{# if(right){ }}",'
          ','
          ',F({fixed:"right"}),'
          ',"
          ",'
          ',W,"
          ","
          ","{{# }; }}","
          ","{{# if(d.data.page){ }}",'
          ','
          ',"
          ","{{# } }}","","
          "].join(""),A=t(window),S=t(document),M=function(e){var i=this;i.index=++d.index,i.config=t.extend({},i.config,d.config,e),i.render()};M.prototype.config={limit:10,loading:!0,cellMinWidth:60,text:{none:"无数据"}},M.prototype.render=function(){var e=this,a=e.config;if(a.elem=t(a.elem),a.where=a.where||{},a.id=a.id||a.elem.attr("id"),a.request=t.extend({pageName:"page",limitName:"limit"},a.request),a.response=t.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",countName:"count"},a.response),"object"==typeof a.page&&(a.limit=a.page.limit||a.limit,a.limits=a.page.limits||a.limits,e.page=a.page.curr=a.page.curr||1,delete a.page.elem,delete a.page.jump),!a.elem[0])return e;e.setArea();var l=a.elem,n=l.next("."+y),o=e.elem=t(i(z).render({VIEW_CLASS:y,data:a,index:e.index}));if(a.index=e.index,n[0]&&n.remove(),l.after(o),e.layHeader=o.find(p),e.layMain=o.find(v),e.layBody=o.find(m),e.layFixed=o.find(g),e.layFixLeft=o.find(x),e.layFixRight=o.find(b),e.layTool=o.find(k),e.layPage=o.find(C),e.layTool.html(i(t(a.toolbar).html()||"").render(a)),a.height&&e.fullSize(),a.cols.length>1){var r=e.layFixed.find(p).find("th");r.height(e.layHeader.height()-1-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom")))}e.pullData(e.page),e.events()},M.prototype.initOpts=function(e){var t=this,i=(t.config,{checkbox:48,space:15,numbers:40});e.checkbox&&(e.type="checkbox"),e.space&&(e.type="space"),e.type||(e.type="normal"),"normal"!==e.type&&(e.unresize=!0,e.width=e.width||i[e.type])},M.prototype.setArea=function(){var e=this,t=e.config,i=0,a=0,l=0,n=0,o=t.width||function(){var e=function(i){var a,l;i=i||t.elem.parent(),a=i.width();try{l="none"===i.css("display")}catch(n){}return!i[0]||a&&!l?a:e(i.parent())};return e()}();e.eachCols(function(){i++}),o-=function(){return"line"===t.skin||"nob"===t.skin?2:i+1}(),layui.each(t.cols,function(t,i){layui.each(i,function(t,l){var r;return l?(e.initOpts(l),r=l.width||0,void(l.colspan>1||(/\d+%$/.test(r)?l.width=r=Math.floor(parseFloat(r)/100*o):r||(l.width=r=0,a++),n+=r))):void i.splice(t,1)})}),e.autoColNums=a,o>n&&a&&(l=(o-n)/a),layui.each(t.cols,function(e,i){layui.each(i,function(e,i){var a=i.minWidth||t.cellMinWidth;i.colspan>1||0===i.width&&(i.width=Math.floor(l>=a?l:a))})}),t.height&&/^full-\d+$/.test(t.height)&&(e.fullHeightGap=t.height.split("-")[1],t.height=A.height()-e.fullHeightGap)},M.prototype.reload=function(e){var i=this;i.config.data&&i.config.data.constructor===Array&&delete i.config.data,i.config=t.extend({},i.config,e),i.render()},M.prototype.page=1,M.prototype.pullData=function(e,i){var a=this,n=a.config,o=n.request,r=n.response,d=function(){"object"==typeof n.initSort&&a.sort(n.initSort.field,n.initSort.type)};if(a.startTime=(new Date).getTime(),n.url){var c={};c[o.pageName]=e,c[o.limitName]=n.limit;var s=t.extend(c,n.where);n.contentType&&0==n.contentType.indexOf("application/json")&&(s=JSON.stringify(s)),t.ajax({type:n.method||"get",url:n.url,contentType:n.contentType,data:s,dataType:"json",headers:n.headers||{},success:function(t){t[r.statusName]!=r.statusCode?(a.renderForm(),a.layMain.html('
          '+(t[r.msgName]||"返回的数据状态异常")+"
          ")):(a.renderData(t,e,t[r.countName]),d(),n.time=(new Date).getTime()-a.startTime+" ms"),i&&l.close(i),"function"==typeof n.done&&n.done(t,e,t[r.countName])},error:function(e,t){a.layMain.html('
          数据接口请求异常
          '),a.renderForm(),i&&l.close(i)}})}else if(n.data&&n.data.constructor===Array){var u={},h=e*n.limit-n.limit;u[r.dataName]=n.data.concat().splice(h,n.limit),u[r.countName]=n.data.length,a.renderData(u,e,n.data.length),d(),"function"==typeof n.done&&n.done(u,e,u[r.countName])}},M.prototype.eachCols=function(e){var i=t.extend(!0,[],this.config.cols),a=[],l=0;layui.each(i,function(e,t){layui.each(t,function(t,n){if(n.colspan>1){var o=0;l++,n.CHILD_COLS=[],layui.each(i[e+1],function(e,t){t.PARENT_COL||o==n.colspan||(t.PARENT_COL=l,n.CHILD_COLS.push(t),o+=t.colspan>1?t.colspan:1)})}n.PARENT_COL||a.push(n)})});var n=function(t){layui.each(t||a,function(t,i){return i.CHILD_COLS?n(i.CHILD_COLS):void e(t,i)})};n()},M.prototype.renderData=function(e,n,o,r){var c=this,s=c.config,u=e[s.response.dataName]||[],y=[],p=[],m=[],v=function(){return!r&&c.sortKey?c.sort(c.sortKey.field,c.sortKey.sort,!0):(layui.each(u,function(e,a){var l=[],o=[],u=[],h=e+s.limit*(n-1)+1;0!==a.length&&(r||(a[d.config.indexName]=e),c.eachCols(function(e,n){var r=n.field||e,f=a[r];c.getColElem(c.layHeader,r);if(void 0!==f&&null!==f||(f=""),!(n.colspan>1)){var y=['",'
          '+function(){var e=t.extend(!0,{LAY_INDEX:h},a);return"checkbox"===n.type?'":"numbers"===n.type?h:n.toolbar?i(t(n.toolbar).html()||"").render(e):n.templet?function(){return"function"==typeof n.templet?n.templet(e):i(t(n.templet).html()||String(f)).render(e)}():f}(),"
          "].join("");l.push(y),n.fixed&&"right"!==n.fixed&&o.push(y),"right"===n.fixed&&u.push(y)}}),y.push(''+l.join("")+""),p.push(''+o.join("")+""),m.push(''+u.join("")+""))}),c.layBody.scrollTop(0),c.layMain.find("."+f).remove(),c.layMain.find("tbody").html(y.join("")),c.layFixLeft.find("tbody").html(p.join("")),c.layFixRight.find("tbody").html(m.join("")),c.renderForm(),c.syncCheckAll(),c.haveInit?c.scrollPatch():setTimeout(function(){c.scrollPatch()},50),c.haveInit=!0,void l.close(c.tipsIndex))};return c.key=s.id||s.index,d.cache[c.key]=u,c.layPage[0===u.length&&1==n?"addClass":"removeClass"](h),r?v():0===u.length?(c.renderForm(),c.layFixed.remove(),c.layMain.find("tbody").html(""),c.layMain.find("."+f).remove(),c.layMain.append('
          '+s.text.none+"
          ")):(v(),void(s.page&&(s.page=t.extend({elem:"layui-table-page"+s.index,count:o,limit:s.limit,limits:s.limits||[10,20,30,40,50,60,70,80,90],groups:3,layout:["prev","page","next","skip","count","limit"],prev:'',next:'',jump:function(e,t){t||(c.page=e.curr,s.limit=e.limit,c.pullData(e.curr,c.loading()))}},s.page),s.page.count=o,a.render(s.page))))},M.prototype.getColElem=function(e,t){var i=this,a=i.config;return e.eq(0).find(".laytable-cell-"+(a.index+"-"+t)+":eq(0)")},M.prototype.renderForm=function(e){n.render(e,"LAY-table-"+this.index)},M.prototype.sort=function(e,i,a,l){var n,r,c=this,u={},h=c.config,f=h.elem.attr("lay-filter"),y=d.cache[c.key];"string"==typeof e&&c.layHeader.find("th").each(function(i,a){var l=t(this),o=l.data("field");if(o===e)return e=l,n=o,!1});try{var n=n||e.data("field");if(c.sortKey&&!a&&n===c.sortKey.field&&i===c.sortKey.sort)return;var p=c.layHeader.find("th .laytable-cell-"+h.index+"-"+n).find(w);c.layHeader.find("th").find(w).removeAttr("lay-sort"),p.attr("lay-sort",i||null),c.layFixed.find("th")}catch(m){return o.error("Table modules: Did not match to field")}c.sortKey={field:n,sort:i},"asc"===i?r=layui.sort(y,n):"desc"===i?r=layui.sort(y,n,!0):(r=layui.sort(y,d.config.indexName),delete c.sortKey),u[h.response.dataName]=r,c.renderData(u,c.page,c.count,!0),l&&layui.event.call(e,s,"sort("+f+")",{field:n,type:i})},M.prototype.loading=function(){var e=this,t=e.config;if(t.loading&&t.url)return l.msg("数据请求中",{icon:16,offset:[e.elem.offset().top+e.elem.height()/2-35-A.scrollTop()+"px",e.elem.offset().left+e.elem.width()/2-90-A.scrollLeft()+"px"],time:-1,anim:-1,fixed:!1})},M.prototype.setCheckData=function(e,t){var i=this,a=i.config,l=d.cache[i.key];l[e]&&l[e].constructor!==Array&&(l[e][a.checkName]=t)},M.prototype.syncCheckAll=function(){var e=this,t=e.config,i=e.layHeader.find('input[name="layTableCheckbox"]'),a=function(i){return e.eachCols(function(e,a){"checkbox"===a.type&&(a[t.checkName]=i)}),i};i[0]&&(d.checkStatus(e.key).isAll?(i[0].checked||(i.prop("checked",!0),e.renderForm("checkbox")),a(!0)):(i[0].checked&&(i.prop("checked",!1),e.renderForm("checkbox")),a(!1)))},M.prototype.getCssRule=function(e,t){var i=this,a=i.elem.find("style")[0],l=a.sheet||a.styleSheet||{},n=l.cssRules||l.rules;layui.each(n,function(a,l){if(l.selectorText===".laytable-cell-"+i.index+"-"+e)return t(l),!0})},M.prototype.fullSize=function(){var e,t=this,i=t.config,a=i.height;t.fullHeightGap&&(a=A.height()-t.fullHeightGap,a<135&&(a=135),t.elem.css("height",a)),e=parseFloat(a)-parseFloat(t.layHeader.height())-1,i.toolbar&&(e-=t.layTool.outerHeight()),i.page&&(e=e-t.layPage.outerHeight()-1),t.layMain.css("height",e)},M.prototype.getScrollWidth=function(e){var t=0;return e?t=e.offsetWidth-e.clientWidth:(e=document.createElement("div"),e.style.width="100px",e.style.height="100px",e.style.overflowY="scroll",document.body.appendChild(e),t=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),t},M.prototype.scrollPatch=function(){var e=this,i=e.layMain.children("table"),a=e.layMain.width()-e.layMain.prop("clientWidth"),l=e.layMain.height()-e.layMain.prop("clientHeight"),n=e.getScrollWidth(e.layMain[0]),o=i.outerWidth()-e.layMain.width();if(e.autoColNums&&o<5&&!e.scrollPatchWStatus){var r=e.layHeader.eq(0).find("thead th:last-child"),d=r.data("field");e.getCssRule(d,function(t){var i=t.style.width||r.outerWidth();t.style.width=parseFloat(i)-n-o+"px",e.layMain.height()-e.layMain.prop("clientHeight")>0&&(t.style.width=parseFloat(t.style.width)-1+"px"),e.scrollPatchWStatus=!0})}if(a&&l){if(!e.elem.find(".layui-table-patch")[0]){var c=t('
          ');c.find("div").css({width:a}),e.layHeader.eq(0).find("thead tr").append(c)}}else e.layHeader.eq(0).find(".layui-table-patch").remove();var s=e.layMain.height(),u=s-l;e.layFixed.find(m).css("height",i.height()>u?u:"auto"),e.layFixRight[o>0?"removeClass":"addClass"](h),e.layFixRight.css("right",a-1)},M.prototype.events=function(){var e,a=this,n=a.config,o=t("body"),c={},u=a.layHeader.find("th"),h=".layui-table-cell",f=n.elem.attr("lay-filter");u.on("mousemove",function(e){var i=t(this),a=i.offset().left,l=e.clientX-a;i.attr("colspan")>1||i.data("unresize")||c.resizeStart||(c.allowResize=i.width()-l<=10,o.css("cursor",c.allowResize?"col-resize":""))}).on("mouseleave",function(){t(this);c.resizeStart||o.css("cursor","")}).on("mousedown",function(e){var i=t(this);if(c.allowResize){var l=i.data("field");e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],a.getCssRule(l,function(e){var t=e.style.width||i.outerWidth();c.rule=e,c.ruleWidth=parseFloat(t),c.minWidth=i.data("minwidth")||n.cellMinWidth})}}),S.on("mousemove",function(t){if(c.resizeStart){if(t.preventDefault(),c.rule){var i=c.ruleWidth+t.clientX-c.offset[0];i');d[0].value=e.data("content")||o.text(),e.find("."+N)[0]||e.append(d),d.focus()}else o.find(".layui-form-switch,.layui-form-checkbox")[0]||Math.round(o.prop("scrollWidth"))>Math.round(o.outerWidth())&&(a.tipsIndex=l.tips(['
          ',o.html(),"
          ",'ဆ'].join(""),o[0],{tips:[3,""],time:-1,anim:-1,maxWidth:r.ios||r.android?300:600,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){l.close(t)})}}))}),a.layBody.on("click","*[lay-event]",function(){var e=t(this),l=e.parents("tr").eq(0).data("index"),n=a.layBody.find('tr[data-index="'+l+'"]'),o="layui-table-click",r=d.cache[a.key][l];layui.event.call(this,s,"tool("+f+")",{data:d.clearCacheKey(r),event:e.attr("lay-event"),tr:n,del:function(){d.cache[a.key][l]=[],n.remove(),a.scrollPatch()},update:function(e){e=e||{},layui.each(e,function(e,l){if(e in r){var o,d=n.children('td[data-field="'+e+'"]');r[e]=l,a.eachCols(function(t,i){i.field==e&&i.templet&&(o=i.templet)}),d.children(h).html(o?i(t(o).html()||l).render(r):l),d.data("content",l)}})}}),n.addClass(o).siblings("tr").removeClass(o)}),a.layMain.on("scroll",function(){var e=t(this),i=e.scrollLeft(),n=e.scrollTop();a.layHeader.scrollLeft(i),a.layFixed.find(m).scrollTop(n),l.close(a.tipsIndex)}),A.on("resize",function(){a.fullSize(),a.scrollPatch()})},d.init=function(e,i){i=i||{};var a=this,l=t(e?'table[lay-filter="'+e+'"]':u+"[lay-data]"),n="Table element property lay-data configuration item has a syntax error: ";return l.each(function(){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){o.error(n+l)}var c=[],s=t.extend({elem:this,cols:[],data:[],skin:a.attr("lay-skin"),size:a.attr("lay-size"),even:"string"==typeof a.attr("lay-even")},d.config,i,l);e&&a.hide(),a.find("thead>tr").each(function(e){s.cols[e]=[],t(this).children().each(function(i){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){return o.error(n+l)}var d=t.extend({title:a.text(),colspan:a.attr("colspan")||0,rowspan:a.attr("rowspan")||0},l);d.colspan<2&&c.push(d),s.cols[e].push(d)})}),a.find("tbody>tr").each(function(e){var i=t(this),a={};i.children("td").each(function(e,i){var l=t(this),n=l.data("field");if(n)return a[n]=l.html()}),layui.each(c,function(e,t){var l=i.children("td").eq(e);a[t.field]=l.html()}),s.data[e]=a}),d.render(s)}),a},d.checkStatus=function(e){var t=0,i=0,a=[],l=d.cache[e]||[];return layui.each(l,function(e,l){return l.constructor===Array?void i++:void(l[d.config.checkName]&&(t++,a.push(d.clearCacheKey(l))))}),{data:a,isAll:!!l.length&&t===l.length-i}},c.config={},d.reload=function(e,i){var a=c.config[e];return i=i||{},a?(i.data&&i.data.constructor===Array&&delete a.data,d.render(t.extend(!0,{},a,i))):o.error("The ID option was not found in the table instance")},d.render=function(e){var t=new M(e);return c.call(t)},d.clearCacheKey=function(e){return e=t.extend({},e),delete e[d.config.checkName],delete e[d.config.indexName],e},d.init(),e(s,d)});layui.define("jquery",function(e){"use strict";var i=layui.$,n=(layui.hint(),layui.device(),{config:{},set:function(e){var n=this;return n.config=i.extend({},n.config,e),n},on:function(e,i){return layui.onevent.call(this,t,e,i)}}),t="carousel",a="layui-this",l=">*[carousel-item]>*",o="layui-carousel-left",r="layui-carousel-right",d="layui-carousel-prev",s="layui-carousel-next",u="layui-carousel-arrow",c="layui-carousel-ind",m=function(e){var t=this;t.config=i.extend({},t.config,n.config,e),t.render()};m.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},m.prototype.render=function(){var e=this,n=e.config;n.elem=i(n.elem),n.elem[0]&&(e.elemItem=n.elem.find(l),n.index<0&&(n.index=0),n.index>=e.elemItem.length&&(n.index=e.elemItem.length-1),n.interval<800&&(n.interval=800),n.full?n.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):n.elem.css({width:n.width,height:n.height}),n.elem.attr("lay-anim",n.anim),e.elemItem.eq(n.index).addClass(a),e.elemItem.length<=1||(e.indicator(),e.arrow(),e.autoplay(),e.events()))},m.prototype.reload=function(e){var n=this;clearInterval(n.timer),n.config=i.extend({},n.config,e),n.render()},m.prototype.prevIndex=function(){var e=this,i=e.config,n=i.index-1;return n<0&&(n=e.elemItem.length-1),n},m.prototype.nextIndex=function(){var e=this,i=e.config,n=i.index+1;return n>=e.elemItem.length&&(n=0),n},m.prototype.addIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index+e,n.index>=i.elemItem.length&&(n.index=0)},m.prototype.subIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index-e,n.index<0&&(n.index=i.elemItem.length-1)},m.prototype.autoplay=function(){var e=this,i=e.config;i.autoplay&&(e.timer=setInterval(function(){e.slide()},i.interval))},m.prototype.arrow=function(){var e=this,n=e.config,t=i(['",'"].join(""));n.elem.attr("lay-arrow",n.arrow),n.elem.find("."+u)[0]&&n.elem.find("."+u).remove(),n.elem.append(t),t.on("click",function(){var n=i(this),t=n.attr("lay-type");e.slide(t)})},m.prototype.indicator=function(){var e=this,n=e.config,t=e.elemInd=i(['
            ',function(){var i=[];return layui.each(e.elemItem,function(e){i.push("")}),i.join("")}(),"
          "].join(""));n.elem.attr("lay-indicator",n.indicator),n.elem.find("."+c)[0]&&n.elem.find("."+c).remove(),n.elem.append(t),"updown"===n.anim&&t.css("margin-top",-(t.height()/2)),t.find("li").on("hover"===n.trigger?"mouseover":n.trigger,function(){var t=i(this),a=t.index();a>n.index?e.slide("add",a-n.index):a",u=1;u<=i.length;u++){var r='
        • ";i.half&&parseInt(i.value)!==i.value&&u==Math.ceil(i.value)?n=n+'
        • ":n+=r}n+=""+(i.text?''+i.value+"星":"")+"";var c=i.elem,f=c.next("."+t);f[0]&&f.remove(),e.elemTemp=a(n),i.span=e.elemTemp.next("span"),i.setText&&i.setText(i.value),c.html(e.elemTemp),c.addClass("layui-inline"),i.readonly||e.action()},v.prototype.setvalue=function(e){var a=this,i=a.config;i.value=e,a.render()},v.prototype.action=function(){var e=this,i=e.config,l=e.elemTemp,n=l.find("i").width();l.children("li").each(function(e){var t=e+1,v=a(this);v.on("click",function(e){if(i.value=t,i.half){var o=e.pageX-a(this).offset().left;o<=n/2&&(i.value=i.value-.5)}i.text&&l.next("span").text(i.value+"星"),i.choose&&i.choose(i.value),i.setText&&i.setText(i.value)}),v.on("mousemove",function(e){if(l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+t+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half){var c=e.pageX-a(this).offset().left;c<=n/2&&v.children("i").addClass(u).removeClass(s)}}),v.on("mouseleave",function(){l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+Math.floor(i.value)+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half&&parseInt(i.value)!==i.value&&l.children("li:eq("+Math.floor(i.value)+")").children("i").addClass(u).removeClass(c)})})},v.prototype.events=function(){var e=this;e.config},i.render=function(e){var a=new v(e);return l.call(a)},e(n,i)});layui.define("jquery",function(e){"use strict";var t=layui.$,i={fixbar:function(e){var i,a,o="layui-fixbar",r="layui-fixbar-top",l=t(document),n=t("body");e=t.extend({showHeight:200},e),e.bar1=e.bar1===!0?"":e.bar1,e.bar2=e.bar2===!0?"":e.bar2,e.bgcolor=e.bgcolor?"background-color:"+e.bgcolor:"";var c=[e.bar1,e.bar2,""],g=t(['
            ',e.bar1?'
          • '+c[0]+"
          • ":"",e.bar2?'
          • '+c[1]+"
          • ":"",'
          • '+c[2]+"
          • ","
          "].join("")),u=g.find("."+r),s=function(){var t=l.scrollTop();t>=e.showHeight?i||(u.show(),i=1):i&&(u.hide(),i=0)};t("."+o)[0]||("object"==typeof e.css&&g.css(e.css),n.append(g),s(),g.find("li").on("click",function(){var i=t(this),a=i.attr("lay-type");"top"===a&&t("html,body").animate({scrollTop:0},200),e.click&&e.click.call(this,a)}),l.on("scroll",function(){clearTimeout(a),a=setTimeout(function(){s()},100)}))},countdown:function(e,t,i){var a=this,o="function"==typeof t,r=new Date(e).getTime(),l=new Date(!t||o?(new Date).getTime():t).getTime(),n=r-l,c=[Math.floor(n/864e5),Math.floor(n/36e5)%24,Math.floor(n/6e4)%60,Math.floor(n/1e3)%60];o&&(i=t);var g=setTimeout(function(){a.countdown(e,l+1e3,i)},1e3);return i&&i(n>0?c:[0,0,0,0],t,g),n<=0&&clearTimeout(g),g},timeAgo:function(e,t){var i=this,a=[[],[]],o=(new Date).getTime()-new Date(e).getTime();return o>6912e5?(o=new Date(e),a[0][0]=i.digit(o.getFullYear(),4),a[0][1]=i.digit(o.getMonth()+1),a[0][2]=i.digit(o.getDate()),t||(a[1][0]=i.digit(o.getHours()),a[1][1]=i.digit(o.getMinutes()),a[1][2]=i.digit(o.getSeconds())),a[0].join("-")+" "+a[1].join(":")):o>=864e5?(o/1e3/60/60/24|0)+"天前":o>=36e5?(o/1e3/60/60|0)+"小时前":o>=12e4?(o/1e3/60|0)+"分钟前":o<0?"未来":"刚刚"},digit:function(e,t){var i="";e=String(e),t=t||2;for(var a=e.length;a/g,">").replace(/'/g,"'").replace(/"/g,""")}};e("util",i)});layui.define("jquery",function(e){"use strict";var l=layui.$,o=function(e){},t='';o.prototype.load=function(e){var o,i,n,r,a=this,c=0;e=e||{};var f=l(e.elem);if(f[0]){var m=l(e.scrollElem||document),u=e.mb||50,s=!("isAuto"in e)||e.isAuto,v=e.end||"没有更多了",y=e.scrollElem&&e.scrollElem!==document,d="加载更多",h=l('");f.find(".layui-flow-more")[0]||f.append(h);var p=function(e,t){e=l(e),h.before(e),t=0==t||null,t?h.html(v):h.find("a").html(d),i=t,o=null,n&&n()},g=function(){o=!0,h.find("a").html(t),"function"==typeof e.done&&e.done(++c,p)};if(g(),h.find("a").on("click",function(){l(this);i||o||g()}),e.isLazyimg)var n=a.lazyimg({elem:e.elem+" img",scrollElem:e.scrollElem});return s?(m.on("scroll",function(){var e=l(this),t=e.scrollTop();r&&clearTimeout(r),i||(r=setTimeout(function(){var i=y?e.height():l(window).height(),n=y?e.prop("scrollHeight"):document.documentElement.scrollHeight;n-t-i<=u&&(o||g())},100))}),a):a}},o.prototype.lazyimg=function(e){var o,t=this,i=0;e=e||{};var n=l(e.scrollElem||document),r=e.elem||"img",a=e.scrollElem&&e.scrollElem!==document,c=function(e,l){var o=n.scrollTop(),r=o+l,c=a?function(){return e.offset().top-n.offset().top+o}():e.offset().top;if(c>=o&&c<=r&&!e.attr("src")){var m=e.attr("lay-src");layui.img(m,function(){var l=t.lazyimg.elem.eq(i);e.attr("src",m).removeAttr("lay-src"),l[0]&&f(l),i++})}},f=function(e,o){var f=a?(o||n).height():l(window).height(),m=n.scrollTop(),u=m+f;if(t.lazyimg.elem=l(r),e)c(e,f);else for(var s=0;su)break}};if(f(),!o){var m;n.on("scroll",function(){var e=l(this);m&&clearTimeout(m),m=setTimeout(function(){f(null,e)},50)}),o=!0}return f},e("flow",new o)});layui.define("jquery",function(e){"use strict";var a=layui.$,l="http://www.layui.com/doc/modules/code.html";e("code",function(e){var t=[];e=e||{},e.elem=a(e.elem||".layui-code"),e.about=!("about"in e)||e.about,e.elem.each(function(){t.push(this)}),layui.each(t.reverse(),function(t,i){var c=a(i),o=c.html();(c.attr("lay-encode")||e.encode)&&(o=o.replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")),c.html('
          1. '+o.replace(/[\r\t\n]+/g,"
          2. ")+"
          "),c.find(">.layui-code-h3")[0]||c.prepend('

          '+(c.attr("lay-title")||e.title||"code")+(e.about?'layui.code':"")+"

          ");var d=c.find(">.layui-code-ol");c.addClass("layui-box layui-code-view"),(c.attr("lay-skin")||e.skin)&&c.addClass("layui-code-"+(c.attr("lay-skin")||e.skin)),(d.find("li").length/100|0)>0&&d.css("margin-left",(d.find("li").length/100|0)+"px"),(c.attr("lay-height")||e.height)&&d.css("max-height",c.attr("lay-height")||e.height)})})}).addcss("modules/code.css","skincodecss");layui.define(["layer","form"],function(t){"use strict";var e=layui.$,i=layui.layer,a=layui.form,l=(layui.hint(),layui.device()),n="layedit",o="layui-show",r="layui-disabled",c=function(){var t=this;t.index=0,t.config={tool:["strong","italic","underline","del","|","left","center","right","|","link","unlink","face","image"],hideTool:[],height:280}};c.prototype.set=function(t){var i=this;return e.extend(!0,i.config,t),i},c.prototype.on=function(t,e){return layui.onevent(n,t,e)},c.prototype.build=function(t,i){i=i||{};var a=this,n=a.config,r="layui-layedit",c=e("string"==typeof t?"#"+t:t),u="LAY_layedit_"+ ++a.index,d=c.next("."+r),y=e.extend({},n,i),f=function(){var t=[],e={};return layui.each(y.hideTool,function(t,i){e[i]=!0}),layui.each(y.tool,function(i,a){C[a]&&!e[a]&&t.push(C[a])}),t.join("")}(),m=e(['
          ','
          '+f+"
          ",'
          ','',"
          ","
          "].join(""));return l.ie&&l.ie<8?c.removeClass("layui-hide").addClass(o):(d[0]&&d.remove(),s.call(a,m,c[0],y),c.addClass("layui-hide").after(m),a.index)},c.prototype.getContent=function(t){var e=u(t);if(e[0])return d(e[0].document.body.innerHTML)},c.prototype.getText=function(t){var i=u(t);if(i[0])return e(i[0].document.body).text()},c.prototype.setContent=function(t,i,a){var l=u(t);l[0]&&(a?e(l[0].document.body).append(i):e(l[0].document.body).html(i),layedit.sync(t))},c.prototype.sync=function(t){var i=u(t);if(i[0]){var a=e("#"+i[1].attr("textarea"));a.val(d(i[0].document.body.innerHTML))}},c.prototype.getSelection=function(t){var e=u(t);if(e[0]){var i=m(e[0].document);return document.selection?i.text:i.toString()}};var s=function(t,i,a){var l=this,n=t.find("iframe");n.css({height:a.height}).on("load",function(){var o=n.contents(),r=n.prop("contentWindow"),c=o.find("head"),s=e([""].join("")),u=o.find("body");c.append(s),u.attr("contenteditable","true").css({"min-height":a.height}).html(i.value||""),y.apply(l,[r,n,i,a]),g.call(l,r,t,a)})},u=function(t){var i=e("#LAY_layedit_"+t),a=i.prop("contentWindow");return[a,i]},d=function(t){return 8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),t},y=function(t,a,n,o){var r=t.document,c=e(r.body);c.on("keydown",function(t){var e=t.keyCode;if(13===e){var a=m(r),l=p(a),n=l.parentNode;if("pre"===n.tagName.toLowerCase()){if(t.shiftKey)return;return i.msg("请暂时用shift+enter"),!1}r.execCommand("formatBlock",!1,"

          ")}}),e(n).parents("form").on("submit",function(){var t=c.html();8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),n.value=t}),c.on("paste",function(e){r.execCommand("formatBlock",!1,"

          "),setTimeout(function(){f.call(t,c),n.value=c.html()},100)})},f=function(t){var i=this;i.document;t.find("*[style]").each(function(){var t=this.style.textAlign;this.removeAttribute("style"),e(this).css({"text-align":t||""})}),t.find("table").addClass("layui-table"),t.find("script,link").remove()},m=function(t){return t.selection?t.selection.createRange():t.getSelection().getRangeAt(0)},p=function(t){return t.endContainer||t.parentElement().childNodes[0]},v=function(t,i,a){var l=this.document,n=document.createElement(t);for(var o in i)n.setAttribute(o,i[o]);if(n.removeAttribute("text"),l.selection){var r=a.text||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.pasteHTML(e(n).prop("outerHTML")),a.select()}else{var r=a.toString()||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.deleteContents(),a.insertNode(n)}},h=function(t,i){var a=this.document,l="layedit-tool-active",n=p(m(a)),o=function(e){return t.find(".layedit-tool-"+e)};i&&i[i.hasClass(l)?"removeClass":"addClass"](l),t.find(">i").removeClass(l),o("unlink").addClass(r),e(n).parents().each(function(){var t=this.tagName.toLowerCase(),e=this.style.textAlign;"b"!==t&&"strong"!==t||o("b").addClass(l),"i"!==t&&"em"!==t||o("i").addClass(l),"u"===t&&o("u").addClass(l),"strike"===t&&o("d").addClass(l),"p"===t&&("center"===e?o("center").addClass(l):"right"===e?o("right").addClass(l):o("left").addClass(l)),"a"===t&&(o("link").addClass(l),o("unlink").removeClass(r))})},g=function(t,a,l){var n=t.document,o=e(n.body),c={link:function(i){var a=p(i),l=e(a).parent();b.call(o,{href:l.attr("href"),target:l.attr("target")},function(e){var a=l[0];"A"===a.tagName?a.href=e.url:v.call(t,"a",{target:e.target,href:e.url,text:e.url},i)})},unlink:function(t){n.execCommand("unlink")},face:function(e){x.call(this,function(i){v.call(t,"img",{src:i.src,alt:i.alt},e)})},image:function(a){var n=this;layui.use("upload",function(o){var r=l.uploadImage||{};o.render({url:r.url,method:r.type,elem:e(n).find("input")[0],done:function(e){0==e.code?(e.data=e.data||{},v.call(t,"img",{src:e.data.src,alt:e.data.title},a)):i.msg(e.msg||"上传失败")}})})},code:function(e){k.call(o,function(i){v.call(t,"pre",{text:i.code,"lay-lang":i.lang},e)})},help:function(){i.open({type:2,title:"帮助",area:["600px","380px"],shadeClose:!0,shade:.1,skin:"layui-layer-msg",content:["http://www.layui.com/about/layedit/help.html","no"]})}},s=a.find(".layui-layedit-tool"),u=function(){var i=e(this),a=i.attr("layedit-event"),l=i.attr("lay-command");if(!i.hasClass(r)){o.focus();var u=m(n);u.commonAncestorContainer;l?(n.execCommand(l),/justifyLeft|justifyCenter|justifyRight/.test(l)&&n.execCommand("formatBlock",!1,"

          "),setTimeout(function(){o.focus()},10)):c[a]&&c[a].call(this,u),h.call(t,s,i)}},d=/image/;s.find(">i").on("mousedown",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)||u.call(this)}).on("click",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)&&u.call(this)}),o.on("click",function(){h.call(t,s),i.close(x.index)})},b=function(t,e){var l=this,n=i.open({type:1,id:"LAY_layedit_link",area:"350px",shade:.05,shadeClose:!0,moveType:1,title:"超链接",skin:"layui-layer-msg",content:['

            ','
          • ','','
            ','',"
            ","
          • ",'
          • ','','
            ','",'","
            ","
          • ",'
          • ','','',"
          • ","
          "].join(""),success:function(t,n){var o="submit(layedit-link-yes)";a.render("radio"),t.find(".layui-btn-primary").on("click",function(){i.close(n),l.focus()}),a.on(o,function(t){i.close(b.index),e&&e(t.field)})}});b.index=n},x=function(t){var a=function(){var t=["[微笑]","[嘻嘻]","[哈哈]","[可爱]","[可怜]","[挖鼻]","[吃惊]","[害羞]","[挤眼]","[闭嘴]","[鄙视]","[爱你]","[泪]","[偷笑]","[亲亲]","[生病]","[太开心]","[白眼]","[右哼哼]","[左哼哼]","[嘘]","[衰]","[委屈]","[吐]","[哈欠]","[抱抱]","[怒]","[疑问]","[馋嘴]","[拜拜]","[思考]","[汗]","[困]","[睡]","[钱]","[失望]","[酷]","[色]","[哼]","[鼓掌]","[晕]","[悲伤]","[抓狂]","[黑线]","[阴险]","[怒骂]","[互粉]","[心]","[伤心]","[猪头]","[熊猫]","[兔子]","[ok]","[耶]","[good]","[NO]","[赞]","[来]","[弱]","[草泥马]","[神马]","[囧]","[浮云]","[给力]","[围观]","[威武]","[奥特曼]","[礼物]","[钟]","[话筒]","[蜡烛]","[蛋糕]"],e={};return layui.each(t,function(t,i){e[i]=layui.cache.dir+"images/face/"+t+".gif"}),e}();return x.hide=x.hide||function(t){"face"!==e(t.target).attr("layedit-event")&&i.close(x.index)},x.index=i.tips(function(){var t=[];return layui.each(a,function(e,i){t.push('
        • '+e+'
        • ')}),'
            '+t.join("")+"
          "}(),this,{tips:1,time:0,skin:"layui-box layui-util-face",maxWidth:500,success:function(l,n){l.css({marginTop:-4,marginLeft:-10}).find(".layui-clear>li").on("click",function(){t&&t({src:a[this.title],alt:this.title}),i.close(n)}),e(document).off("click",x.hide).on("click",x.hide)}})},k=function(t){var e=this,l=i.open({type:1,id:"LAY_layedit_code",area:"550px",shade:.05,shadeClose:!0,moveType:1,title:"插入代码",skin:"layui-layer-msg",content:['
            ','
          • ','','
            ','","
            ","
          • ",'
          • ','','
            ','',"
            ","
          • ",'
          • ','','',"
          • ","
          "].join(""),success:function(l,n){var o="submit(layedit-code-yes)";a.render("select"),l.find(".layui-btn-primary").on("click",function(){i.close(n),e.focus()}),a.on(o,function(e){i.close(k.index),t&&t(e.field)})}});k.index=l},C={html:'',strong:'',italic:'',underline:'',del:'',"|":'',left:'',center:'',right:'',link:'',unlink:'',face:'',image:'',code:'',help:''},w=new c;t(n,w)}); \ No newline at end of file diff --git a/static/frame/layui/layui.js b/static/frame/layui/layui.js new file mode 100644 index 0000000..0806c13 --- /dev/null +++ b/static/frame/layui/layui.js @@ -0,0 +1,2 @@ +/** layui-v2.3.0 MIT License By https://www.layui.com */ + ;!function(e){"use strict";var t=document,n={modules:{},status:{},timeout:10,event:{}},o=function(){this.v="2.3.0"},r=function(){var e=t.currentScript?t.currentScript.src:function(){for(var e,n=t.scripts,o=n.length-1,r=o;r>0;r--)if("interactive"===n[r].readyState){e=n[r].src;break}return e||n[o].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),a=function(t){e.console&&console.error&&console.error("Layui hint: "+t)},i="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),u={layer:"modules/layer",laydate:"modules/laydate",laypage:"modules/laypage",laytpl:"modules/laytpl",layim:"modules/layim",layedit:"modules/layedit",form:"modules/form",upload:"modules/upload",tree:"modules/tree",table:"modules/table",element:"modules/element",rate:"modules/rate",carousel:"modules/carousel",flow:"modules/flow",util:"modules/util",code:"modules/code",jquery:"modules/jquery",mobile:"modules/mobile","layui.all":"../layui.all"};o.prototype.cache=n,o.prototype.define=function(e,t){var o=this,r="function"==typeof e,a=function(){var e=function(e,t){layui[e]=t,n.status[e]=!0};return"function"==typeof t&&t(function(o,r){e(o,r),n.callback[o]=function(){t(e)}}),this};return r&&(t=e,e=[]),layui["layui.all"]||!layui["layui.all"]&&layui["layui.mobile"]?a.call(o):(o.use(e,a),o)},o.prototype.use=function(e,o,l){function s(e,t){var o="PLaySTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/;("load"===e.type||o.test((e.currentTarget||e.srcElement).readyState))&&(n.modules[d]=t,f.removeChild(v),function r(){return++m>1e3*n.timeout/4?a(d+" is not a valid module"):void(n.status[d]?c():setTimeout(r,4))}())}function c(){l.push(layui[d]),e.length>1?y.use(e.slice(1),o,l):"function"==typeof o&&o.apply(layui,l)}var y=this,p=n.dir=n.dir?n.dir:r,f=t.getElementsByTagName("head")[0];e="string"==typeof e?[e]:e,window.jQuery&&jQuery.fn.on&&(y.each(e,function(t,n){"jquery"===n&&e.splice(t,1)}),layui.jquery=layui.$=jQuery);var d=e[0],m=0;if(l=l||[],n.host=n.host||(p.match(/\/\/([\s\S]+?)\//)||["//"+location.host+"/"])[0],0===e.length||layui["layui.all"]&&u[d]||!layui["layui.all"]&&layui["layui.mobile"]&&u[d])return c(),y;if(n.modules[d])!function g(){return++m>1e3*n.timeout/4?a(d+" is not a valid module"):void("string"==typeof n.modules[d]&&n.status[d]?c():setTimeout(g,4))}();else{var v=t.createElement("script"),h=(u[d]?p+"lay/":/^\{\/\}/.test(y.modules[d])?"":n.base||"")+(y.modules[d]||d)+".js";h=h.replace(/^\{\/\}/,""),v.async=!0,v.charset="utf-8",v.src=h+function(){var e=n.version===!0?n.v||(new Date).getTime():n.version||"";return e?"?v="+e:""}(),f.appendChild(v),!v.attachEvent||v.attachEvent.toString&&v.attachEvent.toString().indexOf("[native code")<0||i?v.addEventListener("load",function(e){s(e,h)},!1):v.attachEvent("onreadystatechange",function(e){s(e,h)}),n.modules[d]=h}return y},o.prototype.getStyle=function(t,n){var o=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return o[o.getPropertyValue?"getPropertyValue":"getAttribute"](n)},o.prototype.link=function(e,o,r){var i=this,u=t.createElement("link"),l=t.getElementsByTagName("head")[0];"string"==typeof o&&(r=o);var s=(r||e).replace(/\.|\//g,""),c=u.id="layuicss-"+s,y=0;return u.rel="stylesheet",u.href=e+(n.debug?"?v="+(new Date).getTime():""),u.media="all",t.getElementById(c)||l.appendChild(u),"function"!=typeof o?i:(function p(){return++y>1e3*n.timeout/100?a(e+" timeout"):void(1989===parseInt(i.getStyle(t.getElementById(c),"width"))?function(){o()}():setTimeout(p,100))}(),i)},n.callback={},o.prototype.factory=function(e){if(layui[e])return"function"==typeof n.callback[e]?n.callback[e]:null},o.prototype.addcss=function(e,t,o){return layui.link(n.dir+"css/"+e,t,o)},o.prototype.img=function(e,t,n){var o=new Image;return o.src=e,o.complete?t(o):(o.onload=function(){o.onload=null,"function"==typeof t&&t(o)},void(o.onerror=function(e){o.onerror=null,"function"==typeof n&&n(e)}))},o.prototype.config=function(e){e=e||{};for(var t in e)n[t]=e[t];return this},o.prototype.modules=function(){var e={};for(var t in u)e[t]=u[t];return e}(),o.prototype.extend=function(e){var t=this;e=e||{};for(var n in e)t[n]||t.modules[n]?a("模块名 "+n+" 已被占用"):t.modules[n]=e[n];return t},o.prototype.router=function(e){var t=this,e=e||location.hash,n={path:[],search:{},hash:(e.match(/[^#](#.*$)/)||[])[1]||""};return/^#\//.test(e)?(e=e.replace(/^#\//,""),n.href="/"+e,e=e.replace(/([^#])(#.*$)/,"$1").split("/")||[],t.each(e,function(e,t){/^\w+=/.test(t)?function(){t=t.split("="),n.search[t[0]]=t[1]}():n.path.push(t)}),n):n},o.prototype.data=function(t,n,o){if(t=t||"layui",o=o||localStorage,e.JSON&&e.JSON.parse){if(null===n)return delete o[t];n="object"==typeof n?n:{key:n};try{var r=JSON.parse(o[t])}catch(a){var r={}}return"value"in n&&(r[n.key]=n.value),n.remove&&delete r[n.key],o[t]=JSON.stringify(r),n.key?r[n.key]:r}},o.prototype.sessionData=function(e,t){return this.data(e,t,sessionStorage)},o.prototype.device=function(t){var n=navigator.userAgent.toLowerCase(),o=function(e){var t=new RegExp(e+"/([^\\s\\_\\-]+)");return e=(n.match(t)||[])[1],e||!1},r={os:function(){return/windows/.test(n)?"windows":/linux/.test(n)?"linux":/iphone|ipod|ipad|ios/.test(n)?"ios":/mac/.test(n)?"mac":void 0}(),ie:function(){return!!(e.ActiveXObject||"ActiveXObject"in e)&&((n.match(/msie\s(\d+)/)||[])[1]||"11")}(),weixin:o("micromessenger")};return t&&!r[t]&&(r[t]=o(t)),r.android=/android/.test(n),r.ios="ios"===r.os,r},o.prototype.hint=function(){return{error:a}},o.prototype.each=function(e,t){var n,o=this;if("function"!=typeof t)return o;if(e=e||[],e.constructor===Object){for(n in e)if(t.call(e[n],n,e[n]))break}else for(n=0;na?1:r .layui-tab-title li span i { + margin-right: 5px; +} + +.my-side ul.layui-nav li dl dd a i { + margin-left: 15px; +} + +.my-body { + position: fixed; + top: 60px; + bottom: 0; + left: 200px; + right: 0; + z-index: 1; + overflow: hidden; +} + +.body { + padding: 10px; +} + +.my-body .layui-tab, .my-body .layui-tab .layui-tab-content { + margin: 0; + padding: 0; +} + +.my-body .layui-tab .layui-tab-title li:first-child > i { + display: none; +} + +.my-body .layui-tab, .my-body .layui-tab .layui-tab-content, .my-body .layui-tab .layui-tab-item { + height: 100%; +} + +.my-body iframe { + width: 100%; + height: 100%; + border: none; + outline: none; +} + +.layui-layout-admin .my-footer { + height: 40px; + padding: 2px 0; +} + +.layui-layout-admin .my-footer p { + height: 20px; + line-height: 20px; + font-size: 12px; + text-align: center; +} + +.my-btn-box { + height: 38px; + margin-bottom: 10px; +} + +.my-pay-box > div p { + text-align: center; + margin-bottom: 10px; +} + +/* welcome */ +.my-index-main button.layui-icon { + width: 100%; + font-size: 20px; +} + +.my-index-main .my-nav-btn { + background: #efefef; + cursor: pointer; + border-radius: 2px; + overflow: hidden; +} + +.my-index-main .my-nav-text:first-child { + height: 24px; + line-height: 25px; + font-size: 16px; + font-weight: bold; +} + +.my-index-main .my-nav-text:last-child { + height: 20px; + line-height: 20px; + font-size: 12px; +} + +/* login */ +.login-body { + background: url("../image/bg.png") repeat fixed; +} + +.login-box { + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + margin: auto; + width: 320px; + height: 241px; + max-height: 300px; +} + +.login-body .login-box h3 { + color: #444; + font-size: 22px; + font-weight: 100; + text-align: center; +} + +.login-box .layui-input[type='number'] { + display: inline-block; + width: 50%; + vertical-align: top; +} + +.login-box img { + display: inline-block; + width: 46%; + height: 38px; + border: none; + vertical-align: top; + cursor: pointer; + margin-left: 4%; +} +.hr { + border: none; + height: 1px; + background-color: #626a79; + +} + +.login-box button.btn-reset { + width: 95px; +} + +.login-box button.btn-submit { + width: 190px; +} + +.login-main { + position: absolute; + top: 50%; + right: 0; + bottom: 0; + left: 50%; + width: 350px; + margin: auto; + color: #ffffff; + background-color: rgba(255,255,255,0.06); + height: 380px; + margin-left: -175px; + margin-top: -200px; + -webkit-box-shadow: 0 0 2px 2px rgba(34,43,57,0.2);; + border-style: solid; + border-width: 1px; + border-color: rgba(0,0,0,0.2); +} + +.login-main header { + padding-top: 30px; + height: 35px; + line-height: 35px; + font-size: 30px; + font-weight: 100; + text-align: center; +} + +.login-main header, .login-main form, .login-main form .layui-input-inline { + margin-bottom: 20px; +} + +.login-main form .layui-input-inline, .login-main form .layui-input-inline input, .login-main form .layui-input-inline button { + width: 100%; +} + +.login-main form .login-btn { + margin-bottom: 5px; +} + +/* demo */ +.site-demo-button div { + margin: 20px 30px 10px; +} + +.site-demo-button .layui-btn { + margin: 0 7px 10px 0; +} + +/* check */ +input[type='checkbox'] { + vertical-align: middle; +} + +.my-checkbox { + -webkit-appearance: none; + position: relative; + width: 20px; + height: 20px; + background-color: #FFFFFF; + border: solid 2px #28B779; + border-radius: 2px; + background-clip: padding-box; + display: inline-block; + cursor: pointer; +} + +.my-checkbox:checked { + background-color: #28B779; + border: solid 0 #28B779; +} + +.my-checkbox:checked:before { + position: absolute; + display: inline-block; + right: 50%; + bottom: 50%; + -webkit-transform: translate(50%, 50%); + -ms-transform: translate(50%, 50%); + transform: translate(50%, 50%); + font-family: "Microsoft Yahei"; + content: "√"; + color: #FFFFFF; + font-size: 16px; + font-weight: 600; +} + +/* dblclick css */ +.dblclick-tab tr td { + height: 30px; + line-height: 30px; + padding: 0 6px; + border-radius: 2px; + cursor: pointer; +} + +.dblclick-tab tr td:hover { + color: black; + background: white; +} + +.dblclick-tab tr td i { + position: relative; + top: 2px; + display: inline-block; + margin-right: 5px; +} + +/* tips 404 */ +.my-page-box { + font-family: "Segoe UI", "Lucida Grande", Helvetica, Arial, "Microsoft YaHei", FreeSans, Arimo, "Droid Sans", "wenquanyi micro hei", "Hiragino Sans GB", "Hiragino Sans GB W3", FontAwesome, sans-serif; + text-align: center; + padding: 20px; + background-color: white; +} + +.my-page-box i { + font-size: 100px; +} + +.my-page-box h2, .my-page-box h3, .my-page-box h4, .my-page-box h5 { + font-size: 80px; +} + +.my-page-box p.msg { + color: #dce2ec; + font-size: 20px; + margin-top: 20px; +} + +.my-page-box p.text { + color: #666; + font-size: 16px; + margin-top: 20px; +} + +.my-page-box .my-btn-box { + margin-top: 20px; + margin-bottom: 20px; +} + +/* tree table */ +.my-tree-table-box .tree-table-tree-box { + width: 20%; + min-height: 200px; + display: inline-block; + vertical-align: top; + overflow-y: auto; + overflow-x: auto; +} + +.my-tree-table-box .tree-table-table-box { + display: inline-block; + vertical-align: top; + width: 79%; + margin-left: 1%; +} + +/* skin0 */ +html .skin-0 .dblclick-tips-box .layui-layer-content { + background-color: #009688; +} + +html .skin-0 .dblclick-tips-box i.layui-layer-TipsB { + border-right-color: #009688; +} + +/* skin1 */ +html .skin-1 .my-header .my-header-logo, +html .skin-1 .layui-nav .layui-nav-item a, +html .skin-1 .layui-nav .layui-nav-item a:hover { + color: #444; +} + +html .skin-1 .my-header, +html .skin-1 .layui-nav, +html .skin-1 .layui-nav-child { + background: white; +} + +html .skin-1 .layui-nav .layui-nav-item .layui-nav-child dd.layui-this a { + color: white; +} + +html .skin-1 .layui-nav .layui-nav-item .layui-nav-child dd.layui-this, +html .skin-1 .layui-nav .layui-nav-item .layui-nav-child dd.layui-this > a, +html .skin-1 .layui-nav-tree .layui-nav-item > a:hover, +html .skin-1 .layui-nav .layui-nav-item .layui-nav-child dd:hover > a, +html .skin-1 .layui-tab-title li .layui-tab-close:hover, +html .skin-1 .dblclick-tips-box .layui-layer-content { + color: white !important; + background-color: #666 !important; +} + +html .skin-1 .dblclick-tips-box i.layui-layer-TipsB { + border-right-color: #666; +} + +html .skin-1 .layui-nav .layui-nav-itemed > a { + background: #444 !important; +} + +html .skin-1 .layui-nav .layui-nav-more { + border-color: #444 transparent transparent; +} + +html .skin-1 .layui-nav .layui-nav-mored { + border-color: transparent transparent #444; +} + +/* skin2 */ +html .skin-2 .my-header .my-header-logo, +html .skin-2 .layui-nav .layui-nav-item a, +html .skin-2 .layui-nav .layui-nav-item a:hover { + color: white; +} + +html .skin-2 .my-header, +html .skin-2 .layui-nav, +html .skin-2 .layui-nav-child { + background-color: #01AAED; +} + +html .skin-2 .layui-nav .layui-nav-item .layui-nav-child dd.layui-this a { + color: white; +} + +html .skin-2 .layui-nav .layui-nav-item .layui-nav-child dd.layui-this, +html .skin-2 .layui-nav .layui-nav-item .layui-nav-child dd.layui-this > a, +html .skin-2 .layui-nav-tree .layui-nav-item > a:hover, +html .skin-2 .layui-nav .layui-nav-item .layui-nav-child dd:hover > a, +html .skin-2 .layui-tab-title li .layui-tab-close:hover, +html .skin-2 .dblclick-tips-box .layui-layer-content { + color: white !important; + background-color: #00C0F7 !important; +} + +html .skin-2 .dblclick-tips-box i.layui-layer-TipsB { + border-right-color: #00C0F7; +} + +html .skin-2 .layui-nav .layui-nav-itemed > a { + background-color: #1684af !important; +} + +/* skin0-2 */ +html .skin-2 .layui-nav .layui-nav-more, +html .skin-1 .layui-nav-tree .layui-nav-more, +html .skin-2 .layui-nav-tree .layui-nav-more { + border-color: white transparent transparent; +} + +html .skin-2 .layui-nav .layui-nav-mored, +html .skin-1 .layui-nav-itemed .layui-nav-more, +html .skin-2 .layui-nav-itemed .layui-nav-more { + border-color: transparent transparent white; +} + +/* tools */ +.fl { + float: left; + color: #fff; +} + +.fr { + float: right; + color: #fff; +} + +.none { + display: none; +} + +.block { + display: block; +} + +.tc { + text-align: center; +} + +.max-auto { + max-height: 450px; + overflow-y: auto; +} + +/* layui css cover */ +html body .layui-nav .layui-nav-bar { + opacity: 0 !important; + overflow: hidden !important; +} + +.layui-nav .layui-this:after, .layui-nav-bar, .layui-nav-tree .layui-nav-itemed:after { + background-color: transparent; +} + +.my-body .layui-tab-card > .layui-tab-title li { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.layui-layer-tips .layui-layer-content { + padding: 5px; +} + +/* media */ +@media screen and (max-width: 1023px) { + .my-header ul.layui-nav, .my-header-btn, .my-side, .layui-field-title, .my-btn-box .fr { + display: none; + } + + .layui-side-scroll { + width: 170px; + } + + body div.my-mobile { + background: #393D49; + } + + body div.my-mobile .layui-layer-content { + overflow-x: hidden; + } + + .my-header ul.my-header-user-nav { + display: inline-block; + padding-left: 0; + padding-right: 10px; + } + + .my-header ul.my-header-user-nav a { + padding: 0 10px; + } + + .my-header ul.my-header-user-nav:last-child a:first-child { + padding-right: 20px; + } + + .my-side, .layui-nav-tree, .my-btn-box input[type='text'] { + width: 150px; + } + + .my-body { + left: 0; + width: 100%; + overflow-x: auto; + } + + .my-body iframe { + width: 100%; + } + + select { + background: white; + } + + .layui-layout-admin .layui-footer { + left: 0; + } +} + +@media screen and ( max-width: 450px) { + .my-header ul.my-header-user-nav li a.pay { + display: none; + } +} diff --git a/static/frame/static/image/bg.png b/static/frame/static/image/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..3c598b02ef705cd0e0d7bf5bc38a9f33b825dadb GIT binary patch literal 5932 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 literal 0 HcmV?d00001 diff --git a/static/frame/static/image/code.png b/static/frame/static/image/code.png new file mode 100644 index 0000000000000000000000000000000000000000..e7ca1e1ebe1b3b502ec45d7d70a9af85573d99a9 GIT binary patch literal 2108 zcmXArdpJ~k7sr3I_nt9h#@HFRsnn2Wl#t^xbkR0+K}1pRCMrZVggTAbGgH!qmse5b z5_P(Yav362l1{I}Q8;cxNynv3IW;sVXL{a0)>_ZA*7vW^^Ihv%r#(G3Yp5?&2LNce zY;oSMs`$?!lT`VM!|oRVkYN{RNAIJ-Q~B=4`fSmZ@S2DmcMs3!9D#@D7!t3WSrHX0 zw&UCo{!Dde&u<)HINLjRQhmoMp%xQFj^@q6&6yit;?1wX2`RK244owqk^uU7s3-ua z1$__vwH447i)k2%FEd*`Jw8UxAm|^Z((32zp*?^!2*G7Z>41rgq)kn?3zuOqux92% zBT---p=db>8i|`Vw+a3QsA*ptE6MTHPF|w;OZ_^xY`d5RmtSY+r!RS=Sp%9ktDS85 zyrLoGG=r|^Hs0^499yW!QOq@&cnf!|%iH+Rjwn;#9U4<1Z-5j3>J9-55cS#089PoHJW z=jq|xQ{ifJl{yzp;BqSVMVWlz%m>CxT~2X!nz0v&uZLHZjE{c&+jAfAS#JgEz}A+- znDW{J{C?uerP;eO;|_XRT7e;Wx+;cP{?RV_TEGF<*Ib7hF4;DQa zQTF&qLzlpaBWO2D8lcqXRHw5ud|A_Ue5KqV4-3VcOhImQnQ%imEagKTbP*R+o^Dj1 zPuj}LHJpa~y% z;yulJZD3s?qNOe#1kNiQq)2oGl&PQ_NAj?CDz5*uOxQS*g(W(*GjZRiA*bfQW?^7( zc;~>JFB`xq)9#pw(t_4u`_yDD4Zcy@EEPh zc0tyK+WP}`J0_Vg6OnQ6W<4{4>3T}D4zdcQ2?ywzZUVLR{yK5Gkt;9j=r+hQ1uM__ zuNod=6>=!9-J&6a#P3CniaS}E3lMQc3*6NE+r-W^r^F5|fuBRnz4<0A%=V@}^eEVs z0Ai-%qoN)@7}m0*I4eEazMbz0s3u`pY9ABCsid4REqr(6o+5sqGU3<~{B@*3$7Fm| z8n~>{FQGUa#qLF&sspvLGo0ELXrmRd znhvB%q5Ba}Veq^CS1yS?xwHuymA-8>4xsLU%|VSYn<-7txUb z7+Z@>(tybgit%~HPC`3PRF;K3ps5)?mD2H@ z4_A3Zo(~lfp#yBxePpc~1|zvD8#RA}un2Mw6X!5eH_0CoP%Y@IF{;T%OGku6mNs(5 zot69a8yzG6)TkCAK`sF@29!YQxk51}$t46CRqUxUceAEC#vvoZfrRe2P8YGzKDWp{ z>QkTZNrao~+it#09r`eB0O)rmyCAb1P*-iwZWLof_yh~V*5Y{=pRB6C(jVU$c4DyBLIOr?5XR zL_L0ZurIOZIG*x}(cjbfPoukV#f85Ut3cNi$JePRa)N?DZEwPh`*U?)lD9yh`*nV-< z0xEWS;@+30?f?o=3kxvLnO&|94jW!o!E+mq9?fTi{@6Qej8rpG;8@m5u>Yr6pjJiA_x|Lm(qmB`x<0*1`oQFfKd5{Ndl%GykGXmySSU1*nuB#w@6fIF^NU5PWF(s6RlF$PXr<%fc-!0~|9pU12~CbdVZ zVB!sC`m 0) { + id = flag; + } else { + if (src) { + //新增 + element.tabAdd(card, { + title: '' + title + '' + , content: '' + , id: id + }); + // 关闭弹窗 + layer.closeAll(); + } + } + // 切换相应的ID tab + element.tabChange(card, id); + // 提示信息 + // layer.msg(title); + }; + + // 监听顶部左侧导航 + element.on('nav(side-top-left)', function (elem) { + // 添加tab方法 + window.addTab(elem); + }); + + // 监听顶部右侧导航 + element.on('nav(side-top-right)', function (elem) { + // 修改skin + if ($(this).attr('data-skin')) { + localStorage.skin = $(this).attr('data-skin'); + skin(); + } else { + // 添加tab方法 + window.addTab(elem); + } + }); + + // 监听导航(side-main)点击切换页面 + element.on('nav(side-main)', function (elem) { + // 添加tab方法 + window.addTab(elem); + }); + + // 删除选项卡 + window.delTab = function (layId) { + // 删除 + element.tabDelete('card', layId); + }; + + // 删除所有选项卡 + window.delAllTab = function () { + // 选项卡对象 + layui.each($('.my-body .layui-tab-title > li'), function (k, v) { + var layId = $(v).attr('lay-id'); + if (layId > 1) { + // 删除 + element.tabDelete('card', layId); + } + }); + }; + + // 获取当前选中选项卡lay-id + window.getThisTabID = function () { + // 当前选中的选项卡id + return $(document).find('body .my-body .layui-tab-card > .layui-tab-title .layui-this').attr('lay-id'); + }; + + // 双击关闭相应选项卡 + $(document).on('dblclick', '.my-body .layui-tab-card > .layui-tab-title li', function () { + // 欢迎页面以外,删除选项卡 + if ($(this).index() > 0) { + element.tabDelete('card', $(this).attr('lay-id')); + } else { + layer.msg('欢迎页面不能关闭') + } + }); + + // 选项卡右键事件阻止 + $(document).on("contextmenu", '.my-body .layui-tab-card > .layui-tab-title li', function () { + return false; + }); + + // 选项卡右键事件 + $(document).on("mousedown", '.my-body .layui-tab-card > .layui-tab-title li', function (e) { + // 判断是右键点击事件并且不是欢迎页面选项卡 + if (3 == e.which && $(this).index() > 0) { + // 赋值 + cardIdx = $(this).index(); + cardLayId = $(this).attr('lay-id'); + console.log('lay-id:' + cardLayId); + // 选择框 + layer.tips($('.my-dblclick-box').html(), $(this), { + skin: 'dblclick-tips-box', + tips: 3, + time: false + }); + } + }); + + // 点击body关闭tips + $(document).on('click', 'html', function () { + layer.closeAll('tips'); + }); + + // 右键提示框菜单操作-刷新页面 + $(document).on('click', '.card-refresh', function () { + // 窗体对象 + var ifr = $(document).find('.my-body .layui-tab-content .layui-tab-item iframe').eq(cardIdx); + // 刷新当前页 + ifr.attr('src', ifr.attr('src')); + // 切换到当前选项卡 + element.tabChange('card', cardLayId); + }); + + // 右键提示框菜单操作-关闭页面 + $(document).on('click', '.card-close', function () { + // 删除 + window.delTab(cardLayId); + }); + + // 右键提示框菜单操作-关闭所有页面 + $(document).on('click', '.card-close-all', function () { + // 删除 + window.delAllTab(); + }); + + // 打赏 + $('.pay').on('click', function () { + layer.open({ + type: 1, + title: false, // 标题不显示 + closeBtn: false, // 关闭按钮不显示 + shadeClose: true, // 点击遮罩关闭 + area: ['auto', 'auto'], // 宽高 + content: $('.my-pay-box') // 弹出内容 + }); + }); + + // 皮肤 + function skin() { + var skin = localStorage.skin ? localStorage.skin : 2; + var body = $('body'); + body.removeClass('skin-0'); + body.removeClass('skin-1'); + body.removeClass('skin-2'); + body.addClass('skin-' + skin); + } + + // 工具 + function _util() { + var bar = $('.layui-fixbar'); + // 分辨率小于1023 使用内部工具组件 + if ($(window).width() < 1023) { + util.fixbar({ + bar1: '' + , css: {left: 10, bottom: 54, width: 50} + , click: function (type) { + if (type === 'bar1') { + //iframe层 + layer.open({ + type: 1, // 类型 + title: false, // 标题 + offset: 'l', // 定位 左边 + closeBtn: 0, // 关闭按钮 + anim: 0, // 动画 + shadeClose: true, // 点击遮罩关闭 + shade: 0.8, // 半透明 + area: ['150px', '100%'], // 区域 + skin: 'my-mobile', // 样式 + content: $('body .my-side').html() // 内容 + }); + } + element.init(); + } + }); + bar.removeClass('layui-hide'); + bar.addClass('layui-show'); + } else { + bar.removeClass('layui-show'); + bar.addClass('layui-hide'); + } + }; + + // 自适应 + $(window).on('resize', function () { + if ($(window).width() > 1023) { + navShow(10); + } else { + navHide(10); + } + _util(); + }); + + // 监听控制content高度 + function init() { + // 起始判断-收缩/展开 + if (!localStorage.log) { + if ($(window).width() > 1023) { + if (localStorage.log == 0) { + navHide(10); + } else { + navShow(10); + } + } else { + navHide(10); + } + } else { + if (localStorage.log == 0) { + navHide(10); + } else { + navShow(10); + } + } + // 工具 + _util(); + // skin + skin(); + // 选项卡高度 + cardTitleHeight = $(document).find(".layui-tab[lay-filter='card'] ul.layui-tab-title").height(); + // 需要减去的高度 + height = $(window).height() - $('.layui-header').height() - cardTitleHeight - $('.layui-footer').height(); + // 设置高度 + $(document).find(".layui-tab[lay-filter='card'] div.layui-tab-content").height(height - 2); + } + + // 初始化 + init(); +}); \ No newline at end of file diff --git a/static/frame/static/js/vip_nav.js b/static/frame/static/js/vip_nav.js new file mode 100644 index 0000000..106e3bd --- /dev/null +++ b/static/frame/static/js/vip_nav.js @@ -0,0 +1,73 @@ +/** + * Created by Administrator on 2017/5/20. + * @name: vip-admin 后台模板 菜单navJS + * @author: 随丶 + */ +layui.define(['layer', 'element'], function (exports) { + // 操作对象 + var layer = layui.layer + , element = layui.element + , $ = layui.jquery; + + // 封装方法 + var mod = { + // 添加 HTMl + addHtml: function (addr, obj, treeStatus, data) { + // 请求数据 + $.get(addr, data, function (res) { + var view = ""; + if (res.data) { + $(res.data).each(function (k, v) { + v.subset && treeStatus ? view += '
        • ' : view += '
        • '; + if (v.subset) { + view += '' + v.icon + '' + v.text + '
          '; + $(v.subset).each(function (ko, vo) { + view += '
          '; + if (vo.target) { + view += ''; + } else { + view += ''; + } + view += '' + vo.icon + '' + vo.text + '
          '; + }); + view += '
          '; + } else { + if (v.target) { + view += ''; + } else { + view += ''; + } + view += '' + v.icon + '' + v.text + ''; + } + view += '
        • '; + }); + } else { + layer.msg('接受的菜单数据不符合规范,无法解析'); + } + // 添加到 HTML + $(document).find(".layui-nav[lay-filter=" + obj + "]").html(view); + // 更新渲染 + element.init(); + }, 'json'); + } + // 左侧主体菜单 [请求地址,过滤ID,是否展开,携带参数] + , main: function (addr, obj, treeStatus, data) { + // 添加HTML + this.addHtml(addr, obj, treeStatus, data); + } + // 顶部左侧菜单 [请求地址,过滤ID,是否展开,携带参数] + , top_left: function (addr, obj, treeStatus, data) { + // 添加HTML + this.addHtml(addr, obj, treeStatus, data); + } + /*// 顶部右侧菜单 + ,top_right: function(){ + + }*/ + }; + + // 输出 + exports('vip_nav', mod); +}); + + diff --git a/static/frame/static/js/vip_tab.js b/static/frame/static/js/vip_tab.js new file mode 100644 index 0000000..9deb8da --- /dev/null +++ b/static/frame/static/js/vip_tab.js @@ -0,0 +1,29 @@ +/** + * Created by Administrator on 2017/05/20 1582. + * @name: vip-admin 后台模板 选项卡JS操作 + * @author: 随丶 + */ +layui.define('layer', function (exports) { + + // 封装方法 + var mod = { + // 添加选项卡 [操作对象,标签标题,url地址] + add: function (elem, tit, url) { + parent.addTab(elem, tit, url); + } + // 获取当前选中的选项卡的lay-id + , getThisTabId: function () { + // 获取并返回 id + return parent.getThisTabID(); + } + // 删除选项卡[标签lay-id] + , del: function (id) { + parent.delTab(id); + } + }; + + // 输出 + exports('vip_tab', mod); +}); + + diff --git a/static/frame/static/js/vip_table.js b/static/frame/static/js/vip_table.js new file mode 100644 index 0000000..bbe9b9d --- /dev/null +++ b/static/frame/static/js/vip_table.js @@ -0,0 +1,115 @@ +/** + * Created by Administrator on 2017/08/25. + * @name: vip-admin 后台模板 表格JS功能 + * @author: 随丶 + */ +layui.define(['layer', 'element'], function (exports) { + + var $ = layui.jquery; + + // 封装方法 + var mod = { + // 删除公共方法 deleteAll(ids,请求的url,操作成功跳转url,操作失败跳转url) + deleteAll: function (ids, url, sUrl, eUrl) { + // ids不能为空 + if (ids == null || ids == '') { + layer.msg('请选择要删除的数据', {time: 2000}); + return false; + } else { + layer.confirm('确认删除选中数据?', { + title: '删除', + btn: ['确认', '取消'] // 按钮 + }, function (index, layero) { + // 确认 + $.post(url, {ids: ids}, function (res) { + // 大于0表示删除成功 + if (res.status > 0) { + // 提示信息并跳转 + layer.msg(res.msg, {time: 1500}, function () { + location.href = sUrl; + }) + } else { + // 提示信息并跳转 + layer.msg(res.msg, {time: 1500}, function () { + location.href = eUrl; + }) + } + }); + }, function (index) { + // 关闭 + layer.close(index); + }); + } + } + // 转换时间戳为日期时间(时间戳,是否只显示年月日时分,8) + , unixToDate: function (unixTime, isFull, timeZone) { + if (unixTime == '' || unixTime == null) { + return ''; + } + if (typeof (timeZone) == 'number') { + unixTime = parseInt(unixTime) + parseInt(timeZone) * 60 * 60; + } + var time = new Date(unixTime * 1000); + var ymdhis = ""; + var year, month, date, hours, minutes, seconds; + if (time.getUTCFullYear() < 10) { + year = '0' + time.getUTCFullYear(); + } else { + year = time.getUTCFullYear(); + } + if ((time.getUTCMonth() + 1) < 10) { + month = '0' + (time.getUTCMonth() + 1); + } else { + month = (time.getUTCMonth() + 1); + } + if (time.getUTCDate() < 10) { + date = '0' + time.getUTCDate(); + } else { + date = time.getUTCDate(); + } + ymdhis += year + "-"; + ymdhis += month + "-"; + ymdhis += date; + if (isFull === true) { + if (time.getUTCHours() < 10) { + hours = '0' + time.getUTCHours(); + } else { + hours = time.getUTCHours(); + } + if (time.getUTCMinutes() < 10) { + minutes = '0' + time.getUTCMinutes(); + } else { + minutes = time.getUTCMinutes(); + } + if (time.getUTCSeconds() < 10) { + seconds = '0' + time.getUTCSeconds(); + } else { + seconds = time.getUTCSeconds(); + } + ymdhis += " " + hours + ":"; + ymdhis += minutes; + // ymdhis += seconds; + } + return ymdhis; + } + // 批量删除 返回需要的 ids + , getIds: function (o, str) { + var obj = o.find('tbody tr td:first-child input[type="checkbox"]:checked'); + var list = ''; + obj.each(function (index, elem) { + list += $(elem).attr(str) + ','; + }); + // 去除最后一位逗号 + list = list.substr(0, (list.length - 1)); + return list; + } + // 获取高度 + , getFullHeight: function () { + return $(window).height() - ($('.my-btn-box').outerHeight(true) ? $('.my-btn-box').outerHeight(true) + 35 : 40); + } + }; + + // 输出 + exports('vip_table', mod); +}); + diff --git a/static/jquery-3.3.1.js b/static/jquery-3.3.1.js new file mode 100644 index 0000000..4c6818e --- /dev/null +++ b/static/jquery-3.3.1.js @@ -0,0 +1,10328 @@ +/*! + * jQuery JavaScript Library v3.3.1 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2018-01-20T17:24Z + */ +(function (global, factory) { + + "use strict"; + + if (typeof module === "object" && typeof module.exports === "object") { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory(global, true) : + function (w) { + if (!w.document) { + throw new Error("jQuery requires a window with a document"); + } + return factory(w); + }; + } else { + factory(global); + } + +// Pass this if window is not defined yet +})(typeof window !== "undefined" ? window : this, function (window, noGlobal) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. + "use strict"; + + var arr = []; + + var document = window.document; + + var getProto = Object.getPrototypeOf; + + var slice = arr.slice; + + var concat = arr.concat; + + var push = arr.push; + + var indexOf = arr.indexOf; + + var class2type = {}; + + var toString = class2type.toString; + + var hasOwn = class2type.hasOwnProperty; + + var fnToString = hasOwn.toString; + + var ObjectFunctionString = fnToString.call(Object); + + var support = {}; + + var isFunction = function isFunction(obj) { + + // Support: Chrome <=57, Firefox <=52 + // In some browsers, typeof returns "function" for HTML elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + return typeof obj === "function" && typeof obj.nodeType !== "number"; + }; + + + var isWindow = function isWindow(obj) { + return obj != null && obj === obj.window; + }; + + + var preservedScriptAttributes = { + type: true, + src: true, + noModule: true + }; + + function DOMEval(code, doc, node) { + doc = doc || document; + + var i, + script = doc.createElement("script"); + + script.text = code; + if (node) { + for (i in preservedScriptAttributes) { + if (node[i]) { + script[i] = node[i]; + } + } + } + doc.head.appendChild(script).parentNode.removeChild(script); + } + + + function toType(obj) { + if (obj == null) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[toString.call(obj)] || "object" : + typeof obj; + } + + /* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + var + version = "3.3.1", + + // Define a local copy of jQuery + jQuery = function (selector, context) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init(selector, context); + }, + + // Support: Android <=4.0 only + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; + + jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function () { + return slice.call(this); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function (num) { + + // Return all the elements in a clean array + if (num == null) { + return slice.call(this); + } + + // Return just the one element from the set + return num < 0 ? this[num + this.length] : this[num]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function (elems) { + + // Build a new jQuery matched element set + var ret = jQuery.merge(this.constructor(), elems); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function (callback) { + return jQuery.each(this, callback); + }, + + map: function (callback) { + return this.pushStack(jQuery.map(this, function (elem, i) { + return callback.call(elem, i, elem); + })); + }, + + slice: function () { + return this.pushStack(slice.apply(this, arguments)); + }, + + first: function () { + return this.eq(0); + }, + + last: function () { + return this.eq(-1); + }, + + eq: function (i) { + var len = this.length, + j = +i + (i < 0 ? len : 0); + return this.pushStack(j >= 0 && j < len ? [this[j]] : []); + }, + + end: function () { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice + }; + + jQuery.extend = jQuery.fn.extend = function () { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if (typeof target === "boolean") { + deep = target; + + // Skip the boolean and the target + target = arguments[i] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if (typeof target !== "object" && !isFunction(target)) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if (i === length) { + target = this; + i--; + } + + for (; i < length; i++) { + + // Only deal with non-null/undefined values + if ((options = arguments[i]) != null) { + + // Extend the base object + for (name in options) { + src = target[name]; + copy = options[name]; + + // Prevent never-ending loop + if (target === copy) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if (deep && copy && (jQuery.isPlainObject(copy) || + (copyIsArray = Array.isArray(copy)))) { + + if (copyIsArray) { + copyIsArray = false; + clone = src && Array.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[name] = jQuery.extend(deep, clone, copy); + + // Don't bring in undefined values + } else if (copy !== undefined) { + target[name] = copy; + } + } + } + } + + // Return the modified object + return target; + }; + + jQuery.extend({ + + // Unique for each copy of jQuery on the page + expando: "jQuery" + (version + Math.random()).replace(/\D/g, ""), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function (msg) { + throw new Error(msg); + }, + + noop: function () { + }, + + isPlainObject: function (obj) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if (!obj || toString.call(obj) !== "[object Object]") { + return false; + } + + proto = getProto(obj); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if (!proto) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call(proto, "constructor") && proto.constructor; + return typeof Ctor === "function" && fnToString.call(Ctor) === ObjectFunctionString; + }, + + isEmptyObject: function (obj) { + + /* eslint-disable no-unused-vars */ + // See https://github.com/eslint/eslint/issues/6125 + var name; + + for (name in obj) { + return false; + } + return true; + }, + + // Evaluates a script in a global context + globalEval: function (code) { + DOMEval(code); + }, + + each: function (obj, callback) { + var length, i = 0; + + if (isArrayLike(obj)) { + length = obj.length; + for (; i < length; i++) { + if (callback.call(obj[i], i, obj[i]) === false) { + break; + } + } + } else { + for (i in obj) { + if (callback.call(obj[i], i, obj[i]) === false) { + break; + } + } + } + + return obj; + }, + + // Support: Android <=4.0 only + trim: function (text) { + return text == null ? + "" : + (text + "").replace(rtrim, ""); + }, + + // results is for internal usage only + makeArray: function (arr, results) { + var ret = results || []; + + if (arr != null) { + if (isArrayLike(Object(arr))) { + jQuery.merge(ret, + typeof arr === "string" ? + [arr] : arr + ); + } else { + push.call(ret, arr); + } + } + + return ret; + }, + + inArray: function (elem, arr, i) { + return arr == null ? -1 : indexOf.call(arr, elem, i); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function (first, second) { + var len = +second.length, + j = 0, + i = first.length; + + for (; j < len; j++) { + first[i++] = second[j]; + } + + first.length = i; + + return first; + }, + + grep: function (elems, callback, invert) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for (; i < length; i++) { + callbackInverse = !callback(elems[i], i); + if (callbackInverse !== callbackExpect) { + matches.push(elems[i]); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function (elems, callback, arg) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if (isArrayLike(elems)) { + length = elems.length; + for (; i < length; i++) { + value = callback(elems[i], i, arg); + + if (value != null) { + ret.push(value); + } + } + + // Go through every key on the object, + } else { + for (i in elems) { + value = callback(elems[i], i, arg); + + if (value != null) { + ret.push(value); + } + } + } + + // Flatten any nested arrays + return concat.apply([], ret); + }, + + // A global GUID counter for objects + guid: 1, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support + }); + + if (typeof Symbol === "function") { + jQuery.fn[Symbol.iterator] = arr[Symbol.iterator]; + } + +// Populate the class2type map + jQuery.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "), + function (i, name) { + class2type["[object " + name + "]"] = name.toLowerCase(); + }); + + function isArrayLike(obj) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = toType(obj); + + if (isFunction(obj) || isWindow(obj)) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && (length - 1) in obj; + } + + var Sizzle = + /*! + * Sizzle CSS Selector Engine v2.3.3 + * https://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-08-08 + */ + (function (window) { + + var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function (a, b) { + if (a === b) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function (list, elem) { + var i = 0, + len = list.length; + for (; i < len; i++) { + if (list[i] === elem) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp(whitespace + "+", "g"), + rtrim = new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g"), + + rcomma = new RegExp("^" + whitespace + "*," + whitespace + "*"), + rcombinators = new RegExp("^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*"), + + rattributeQuotes = new RegExp("=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g"), + + rpseudo = new RegExp(pseudos), + ridentifier = new RegExp("^" + identifier + "$"), + + matchExpr = { + "ID": new RegExp("^#(" + identifier + ")"), + "CLASS": new RegExp("^\\.(" + identifier + ")"), + "TAG": new RegExp("^(" + identifier + "|[*])"), + "ATTR": new RegExp("^" + attributes), + "PSEUDO": new RegExp("^" + pseudos), + "CHILD": new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i"), + "bool": new RegExp("^(?:" + booleans + ")$", "i"), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp("^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i") + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp("\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig"), + funescape = function (_, escaped, escapedWhitespace) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode(high + 0x10000) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode(high >> 10 | 0xD800, high & 0x3FF | 0xDC00); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function (ch, asCodePoint) { + if (asCodePoint) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if (ch === "\0") { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice(0, -1) + "\\" + ch.charCodeAt(ch.length - 1).toString(16) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function () { + setDocument(); + }, + + disabledAncestor = addCombinator( + function (elem) { + return elem.disabled === true && ("form" in elem || "label" in elem); + }, + {dir: "parentNode", next: "legend"} + ); + +// Optimize for push.apply( _, NodeList ) + try { + push.apply( + (arr = slice.call(preferredDoc.childNodes)), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[preferredDoc.childNodes.length].nodeType; + } catch (e) { + push = { + apply: arr.length ? + + // Leverage slice if possible + function (target, els) { + push_native.apply(target, slice.call(els)); + } : + + // Support: IE<9 + // Otherwise append directly + function (target, els) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ((target[j++] = els[i++])) { + } + target.length = j - 1; + } + }; + } + + function Sizzle(selector, context, results, seed) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if (typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if (!seed) { + + if ((context ? context.ownerDocument || context : preferredDoc) !== document) { + setDocument(context); + } + context = context || document; + + if (documentIsHTML) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if (nodeType !== 11 && (match = rquickExpr.exec(selector))) { + + // ID selector + if ((m = match[1])) { + + // Document context + if (nodeType === 9) { + if ((elem = context.getElementById(m))) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if (elem.id === m) { + results.push(elem); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if (newContext && (elem = newContext.getElementById(m)) && + contains(context, elem) && + elem.id === m) { + + results.push(elem); + return results; + } + } + + // Type selector + } else if (match[2]) { + push.apply(results, context.getElementsByTagName(selector)); + return results; + + // Class selector + } else if ((m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName) { + + push.apply(results, context.getElementsByClassName(m)); + return results; + } + } + + // Take advantage of querySelectorAll + if (support.qsa && + !compilerCache[selector + " "] && + (!rbuggyQSA || !rbuggyQSA.test(selector))) { + + if (nodeType !== 1) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if (context.nodeName.toLowerCase() !== "object") { + + // Capture the context ID, setting it first if necessary + if ((nid = context.getAttribute("id"))) { + nid = nid.replace(rcssescape, fcssescape); + } else { + context.setAttribute("id", (nid = expando)); + } + + // Prefix every selector in the list + groups = tokenize(selector); + i = groups.length; + while (i--) { + groups[i] = "#" + nid + " " + toSelector(groups[i]); + } + newSelector = groups.join(","); + + // Expand context for sibling selectors + newContext = rsibling.test(selector) && testContext(context.parentNode) || + context; + } + + if (newSelector) { + try { + push.apply(results, + newContext.querySelectorAll(newSelector) + ); + return results; + } catch (qsaError) { + } finally { + if (nid === expando) { + context.removeAttribute("id"); + } + } + } + } + } + } + + // All others + return select(selector.replace(rtrim, "$1"), context, results, seed); + } + + /** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ + function createCache() { + var keys = []; + + function cache(key, value) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if (keys.push(key + " ") > Expr.cacheLength) { + // Only keep the most recent entries + delete cache[keys.shift()]; + } + return (cache[key + " "] = value); + } + + return cache; + } + + /** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ + function markFunction(fn) { + fn[expando] = true; + return fn; + } + + /** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ + function assert(fn) { + var el = document.createElement("fieldset"); + + try { + return !!fn(el); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if (el.parentNode) { + el.parentNode.removeChild(el); + } + // release memory in IE + el = null; + } + } + + /** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ + function addHandle(attrs, handler) { + var arr = attrs.split("|"), + i = arr.length; + + while (i--) { + Expr.attrHandle[arr[i]] = handler; + } + } + + /** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ + function siblingCheck(a, b) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if (diff) { + return diff; + } + + // Check if b follows a + if (cur) { + while ((cur = cur.nextSibling)) { + if (cur === b) { + return -1; + } + } + } + + return a ? 1 : -1; + } + + /** + * Returns a function to use in pseudos for input types + * @param {String} type + */ + function createInputPseudo(type) { + return function (elem) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; + } + + /** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ + function createButtonPseudo(type) { + return function (elem) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; + } + + /** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ + function createDisabledPseudo(disabled) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function (elem) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ("form" in elem) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if (elem.parentNode && elem.disabled === false) { + + // Option elements defer to a parent optgroup if present + if ("label" in elem) { + if ("label" in elem.parentNode) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + disabledAncestor(elem) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ("label" in elem) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; + } + + /** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ + function createPositionalPseudo(fn) { + return markFunction(function (argument) { + argument = +argument; + return markFunction(function (seed, matches) { + var j, + matchIndexes = fn([], seed.length, argument), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while (i--) { + if (seed[(j = matchIndexes[i])]) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); + } + + /** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ + function testContext(context) { + return context && typeof context.getElementsByTagName !== "undefined" && context; + } + +// Expose support vars for convenience + support = Sizzle.support = {}; + + /** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ + isXML = Sizzle.isXML = function (elem) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; + }; + + /** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ + setDocument = Sizzle.setDocument = function (node) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if (doc === document || doc.nodeType !== 9 || !doc.documentElement) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML(document); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if (preferredDoc !== document && + (subWindow = document.defaultView) && subWindow.top !== subWindow) { + + // Support: IE 11, Edge + if (subWindow.addEventListener) { + subWindow.addEventListener("unload", unloadHandler, false); + + // Support: IE 9 - 10 only + } else if (subWindow.attachEvent) { + subWindow.attachEvent("onunload", unloadHandler); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function (el) { + el.className = "i"; + return !el.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function (el) { + el.appendChild(document.createComment("")); + return !el.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test(document.getElementsByClassName); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function (el) { + docElem.appendChild(el).id = expando; + return !document.getElementsByName || !document.getElementsByName(expando).length; + }); + + // ID filter and find + if (support.getById) { + Expr.filter["ID"] = function (id) { + var attrId = id.replace(runescape, funescape); + return function (elem) { + return elem.getAttribute("id") === attrId; + }; + }; + Expr.find["ID"] = function (id, context) { + if (typeof context.getElementById !== "undefined" && documentIsHTML) { + var elem = context.getElementById(id); + return elem ? [elem] : []; + } + }; + } else { + Expr.filter["ID"] = function (id) { + var attrId = id.replace(runescape, funescape); + return function (elem) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find["ID"] = function (id, context) { + if (typeof context.getElementById !== "undefined" && documentIsHTML) { + var node, i, elems, + elem = context.getElementById(id); + + if (elem) { + + // Verify the id attribute + node = elem.getAttributeNode("id"); + if (node && node.value === id) { + return [elem]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName(id); + i = 0; + while ((elem = elems[i++])) { + node = elem.getAttributeNode("id"); + if (node && node.value === id) { + return [elem]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function (tag, context) { + if (typeof context.getElementsByTagName !== "undefined") { + return context.getElementsByTagName(tag); + + // DocumentFragment nodes don't have gEBTN + } else if (support.qsa) { + return context.querySelectorAll(tag); + } + } : + + function (tag, context) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName(tag); + + // Filter out possible comments + if (tag === "*") { + while ((elem = results[i++])) { + if (elem.nodeType === 1) { + tmp.push(elem); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function (className, context) { + if (typeof context.getElementsByClassName !== "undefined" && documentIsHTML) { + return context.getElementsByClassName(className); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ((support.qsa = rnative.test(document.querySelectorAll))) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function (el) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild(el).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if (el.querySelectorAll("[msallowcapture^='']").length) { + rbuggyQSA.push("[*^$]=" + whitespace + "*(?:''|\"\")"); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if (!el.querySelectorAll("[selected]").length) { + rbuggyQSA.push("\\[" + whitespace + "*(?:value|" + booleans + ")"); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if (!el.querySelectorAll("[id~=" + expando + "-]").length) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if (!el.querySelectorAll(":checked").length) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if (!el.querySelectorAll("a#" + expando + "+*").length) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function (el) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute("type", "hidden"); + el.appendChild(input).setAttribute("name", "D"); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if (el.querySelectorAll("[name=d]").length) { + rbuggyQSA.push("name" + whitespace + "*[*^$|!~]?="); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if (el.querySelectorAll(":enabled").length !== 2) { + rbuggyQSA.push(":enabled", ":disabled"); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild(el).disabled = true; + if (el.querySelectorAll(":disabled").length !== 2) { + rbuggyQSA.push(":enabled", ":disabled"); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ((support.matchesSelector = rnative.test((matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector)))) { + + assert(function (el) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call(el, "*"); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call(el, "[s!='']:x"); + rbuggyMatches.push("!=", pseudos); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join("|")); + rbuggyMatches = rbuggyMatches.length && new RegExp(rbuggyMatches.join("|")); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test(docElem.compareDocumentPosition); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test(docElem.contains) ? + function (a, b) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!(bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains(bup) : + a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16 + )); + } : + function (a, b) { + if (b) { + while ((b = b.parentNode)) { + if (b === a) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function (a, b) { + + // Flag for duplicate removal + if (a === b) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if (compare) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = (a.ownerDocument || a) === (b.ownerDocument || b) ? + a.compareDocumentPosition(b) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if (compare & 1 || + (!support.sortDetached && b.compareDocumentPosition(a) === compare)) { + + // Choose the first element that is related to our preferred document + if (a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a)) { + return -1; + } + if (b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b)) { + return 1; + } + + // Maintain original order + return sortInput ? + (indexOf(sortInput, a) - indexOf(sortInput, b)) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function (a, b) { + // Exit early if the nodes are identical + if (a === b) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [a], + bp = [b]; + + // Parentless nodes are either documents or disconnected + if (!aup || !bup) { + return a === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + (indexOf(sortInput, a) - indexOf(sortInput, b)) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if (aup === bup) { + return siblingCheck(a, b); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ((cur = cur.parentNode)) { + ap.unshift(cur); + } + cur = b; + while ((cur = cur.parentNode)) { + bp.unshift(cur); + } + + // Walk down the tree looking for a discrepancy + while (ap[i] === bp[i]) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck(ap[i], bp[i]) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; + }; + + Sizzle.matches = function (expr, elements) { + return Sizzle(expr, null, null, elements); + }; + + Sizzle.matchesSelector = function (elem, expr) { + // Set document vars if needed + if ((elem.ownerDocument || elem) !== document) { + setDocument(elem); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace(rattributeQuotes, "='$1']"); + + if (support.matchesSelector && documentIsHTML && + !compilerCache[expr + " "] && + (!rbuggyMatches || !rbuggyMatches.test(expr)) && + (!rbuggyQSA || !rbuggyQSA.test(expr))) { + + try { + var ret = matches.call(elem, expr); + + // IE 9's matchesSelector returns false on disconnected nodes + if (ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11) { + return ret; + } + } catch (e) { + } + } + + return Sizzle(expr, document, null, [elem]).length > 0; + }; + + Sizzle.contains = function (context, elem) { + // Set document vars if needed + if ((context.ownerDocument || context) !== document) { + setDocument(context); + } + return contains(context, elem); + }; + + Sizzle.attr = function (elem, name) { + // Set document vars if needed + if ((elem.ownerDocument || elem) !== document) { + setDocument(elem); + } + + var fn = Expr.attrHandle[name.toLowerCase()], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call(Expr.attrHandle, name.toLowerCase()) ? + fn(elem, name, !documentIsHTML) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute(name) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; + }; + + Sizzle.escape = function (sel) { + return (sel + "").replace(rcssescape, fcssescape); + }; + + Sizzle.error = function (msg) { + throw new Error("Syntax error, unrecognized expression: " + msg); + }; + + /** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ + Sizzle.uniqueSort = function (results) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice(0); + results.sort(sortOrder); + + if (hasDuplicate) { + while ((elem = results[i++])) { + if (elem === results[i]) { + j = duplicates.push(i); + } + } + while (j--) { + results.splice(duplicates[j], 1); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; + }; + + /** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ + getText = Sizzle.getText = function (elem) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if (!nodeType) { + // If no nodeType, this is expected to be an array + while ((node = elem[i++])) { + // Do not traverse comment nodes + ret += getText(node); + } + } else if (nodeType === 1 || nodeType === 9 || nodeType === 11) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if (typeof elem.textContent === "string") { + return elem.textContent; + } else { + // Traverse its children + for (elem = elem.firstChild; elem; elem = elem.nextSibling) { + ret += getText(elem); + } + } + } else if (nodeType === 3 || nodeType === 4) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; + }; + + Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": {dir: "parentNode", first: true}, + " ": {dir: "parentNode"}, + "+": {dir: "previousSibling", first: true}, + "~": {dir: "previousSibling"} + }, + + preFilter: { + "ATTR": function (match) { + match[1] = match[1].replace(runescape, funescape); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = (match[3] || match[4] || match[5] || "").replace(runescape, funescape); + + if (match[2] === "~=") { + match[3] = " " + match[3] + " "; + } + + return match.slice(0, 4); + }, + + "CHILD": function (match) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if (match[1].slice(0, 3) === "nth") { + // nth-* requires argument + if (!match[3]) { + Sizzle.error(match[0]); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +(match[4] ? match[5] + (match[6] || 1) : 2 * (match[3] === "even" || match[3] === "odd")); + match[5] = +((match[7] + match[8]) || match[3] === "odd"); + + // other types prohibit arguments + } else if (match[3]) { + Sizzle.error(match[0]); + } + + return match; + }, + + "PSEUDO": function (match) { + var excess, + unquoted = !match[6] && match[2]; + + if (matchExpr["CHILD"].test(match[0])) { + return null; + } + + // Accept quoted arguments as-is + if (match[3]) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if (unquoted && rpseudo.test(unquoted) && + // Get excess from tokenize (recursively) + (excess = tokenize(unquoted, true)) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf(")", unquoted.length - excess) - unquoted.length)) { + + // excess is a negative index + match[0] = match[0].slice(0, excess); + match[2] = unquoted.slice(0, excess); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice(0, 3); + } + }, + + filter: { + + "TAG": function (nodeNameSelector) { + var nodeName = nodeNameSelector.replace(runescape, funescape).toLowerCase(); + return nodeNameSelector === "*" ? + function () { + return true; + } : + function (elem) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function (className) { + var pattern = classCache[className + " "]; + + return pattern || + (pattern = new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)")) && + classCache(className, function (elem) { + return pattern.test(typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || ""); + }); + }, + + "ATTR": function (name, operator, check) { + return function (elem) { + var result = Sizzle.attr(elem, name); + + if (result == null) { + return operator === "!="; + } + if (!operator) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf(check) === 0 : + operator === "*=" ? check && result.indexOf(check) > -1 : + operator === "$=" ? check && result.slice(-check.length) === check : + operator === "~=" ? (" " + result.replace(rwhitespace, " ") + " ").indexOf(check) > -1 : + operator === "|=" ? result === check || result.slice(0, check.length + 1) === check + "-" : + false; + }; + }, + + "CHILD": function (type, what, argument, first, last) { + var simple = type.slice(0, 3) !== "nth", + forward = type.slice(-4) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function (elem) { + return !!elem.parentNode; + } : + + function (elem, context, xml) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if (parent) { + + // :(first|last|only)-(child|of-type) + if (simple) { + while (dir) { + node = elem; + while ((node = node[dir])) { + if (ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1) { + + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [forward ? parent.firstChild : parent.lastChild]; + + // non-xml :nth-child(...) stores cache data on `parent` + if (forward && useCache) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[expando] || (node[expando] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[node.uniqueID] || + (outerCache[node.uniqueID] = {}); + + cache = uniqueCache[type] || []; + nodeIndex = cache[0] === dirruns && cache[1]; + diff = nodeIndex && cache[2]; + node = nodeIndex && parent.childNodes[nodeIndex]; + + while ((node = ++nodeIndex && node && node[dir] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop())) { + + // When found, cache indexes on `parent` and break + if (node.nodeType === 1 && ++diff && node === elem) { + uniqueCache[type] = [dirruns, nodeIndex, diff]; + break; + } + } + + } else { + // Use previously-cached element index if available + if (useCache) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[expando] || (node[expando] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[node.uniqueID] || + (outerCache[node.uniqueID] = {}); + + cache = uniqueCache[type] || []; + nodeIndex = cache[0] === dirruns && cache[1]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if (diff === false) { + // Use the same loop as above to seek `elem` from the start + while ((node = ++nodeIndex && node && node[dir] || + (diff = nodeIndex = 0) || start.pop())) { + + if ((ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1) && + ++diff) { + + // Cache the index of each encountered element + if (useCache) { + outerCache = node[expando] || (node[expando] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[node.uniqueID] || + (outerCache[node.uniqueID] = {}); + + uniqueCache[type] = [dirruns, diff]; + } + + if (node === elem) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || (diff % first === 0 && diff / first >= 0); + } + }; + }, + + "PSEUDO": function (pseudo, argument) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[pseudo] || Expr.setFilters[pseudo.toLowerCase()] || + Sizzle.error("unsupported pseudo: " + pseudo); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if (fn[expando]) { + return fn(argument); + } + + // But maintain support for old signatures + if (fn.length > 1) { + args = [pseudo, pseudo, "", argument]; + return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ? + markFunction(function (seed, matches) { + var idx, + matched = fn(seed, argument), + i = matched.length; + while (i--) { + idx = indexOf(seed, matched[i]); + seed[idx] = !(matches[idx] = matched[i]); + } + }) : + function (elem) { + return fn(elem, 0, args); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function (selector) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile(selector.replace(rtrim, "$1")); + + return matcher[expando] ? + markFunction(function (seed, matches, context, xml) { + var elem, + unmatched = matcher(seed, null, xml, []), + i = seed.length; + + // Match elements unmatched by `matcher` + while (i--) { + if ((elem = unmatched[i])) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function (elem, context, xml) { + input[0] = elem; + matcher(input, null, xml, results); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function (selector) { + return function (elem) { + return Sizzle(selector, elem).length > 0; + }; + }), + + "contains": markFunction(function (text) { + text = text.replace(runescape, funescape); + return function (elem) { + return (elem.textContent || elem.innerText || getText(elem)).indexOf(text) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction(function (lang) { + // lang value must be a valid identifier + if (!ridentifier.test(lang || "")) { + Sizzle.error("unsupported lang: " + lang); + } + lang = lang.replace(runescape, funescape).toLowerCase(); + return function (elem) { + var elemLang; + do { + if ((elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang"))) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf(lang + "-") === 0; + } + } while ((elem = elem.parentNode) && elem.nodeType === 1); + return false; + }; + }), + + // Miscellaneous + "target": function (elem) { + var hash = window.location && window.location.hash; + return hash && hash.slice(1) === elem.id; + }, + + "root": function (elem) { + return elem === docElem; + }, + + "focus": function (elem) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": createDisabledPseudo(false), + "disabled": createDisabledPseudo(true), + + "checked": function (elem) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function (elem) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if (elem.parentNode) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function (elem) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for (elem = elem.firstChild; elem; elem = elem.nextSibling) { + if (elem.nodeType < 6) { + return false; + } + } + return true; + }, + + "parent": function (elem) { + return !Expr.pseudos["empty"](elem); + }, + + // Element/input types + "header": function (elem) { + return rheader.test(elem.nodeName); + }, + + "input": function (elem) { + return rinputs.test(elem.nodeName); + }, + + "button": function (elem) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function (elem) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ((attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text"); + }, + + // Position-in-collection + "first": createPositionalPseudo(function () { + return [0]; + }), + + "last": createPositionalPseudo(function (matchIndexes, length) { + return [length - 1]; + }), + + "eq": createPositionalPseudo(function (matchIndexes, length, argument) { + return [argument < 0 ? argument + length : argument]; + }), + + "even": createPositionalPseudo(function (matchIndexes, length) { + var i = 0; + for (; i < length; i += 2) { + matchIndexes.push(i); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function (matchIndexes, length) { + var i = 1; + for (; i < length; i += 2) { + matchIndexes.push(i); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function (matchIndexes, length, argument) { + var i = argument < 0 ? argument + length : argument; + for (; --i >= 0;) { + matchIndexes.push(i); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function (matchIndexes, length, argument) { + var i = argument < 0 ? argument + length : argument; + for (; ++i < length;) { + matchIndexes.push(i); + } + return matchIndexes; + }) + } + }; + + Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos + for (i in {radio: true, checkbox: true, file: true, password: true, image: true}) { + Expr.pseudos[i] = createInputPseudo(i); + } + for (i in {submit: true, reset: true}) { + Expr.pseudos[i] = createButtonPseudo(i); + } + +// Easy API for creating new setFilters + function setFilters() { + } + + setFilters.prototype = Expr.filters = Expr.pseudos; + Expr.setFilters = new setFilters(); + + tokenize = Sizzle.tokenize = function (selector, parseOnly) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[selector + " "]; + + if (cached) { + return parseOnly ? 0 : cached.slice(0); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while (soFar) { + + // Comma and first run + if (!matched || (match = rcomma.exec(soFar))) { + if (match) { + // Don't consume trailing commas as valid + soFar = soFar.slice(match[0].length) || soFar; + } + groups.push((tokens = [])); + } + + matched = false; + + // Combinators + if ((match = rcombinators.exec(soFar))) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace(rtrim, " ") + }); + soFar = soFar.slice(matched.length); + } + + // Filters + for (type in Expr.filter) { + if ((match = matchExpr[type].exec(soFar)) && (!preFilters[type] || + (match = preFilters[type](match)))) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice(matched.length); + } + } + + if (!matched) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error(selector) : + // Cache the tokens + tokenCache(selector, groups).slice(0); + }; + + function toSelector(tokens) { + var i = 0, + len = tokens.length, + selector = ""; + for (; i < len; i++) { + selector += tokens[i].value; + } + return selector; + } + + function addCombinator(matcher, combinator, base) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function (elem, context, xml) { + while ((elem = elem[dir])) { + if (elem.nodeType === 1 || checkNonElements) { + return matcher(elem, context, xml); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function (elem, context, xml) { + var oldCache, uniqueCache, outerCache, + newCache = [dirruns, doneName]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if (xml) { + while ((elem = elem[dir])) { + if (elem.nodeType === 1 || checkNonElements) { + if (matcher(elem, context, xml)) { + return true; + } + } + } + } else { + while ((elem = elem[dir])) { + if (elem.nodeType === 1 || checkNonElements) { + outerCache = elem[expando] || (elem[expando] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[elem.uniqueID] || (outerCache[elem.uniqueID] = {}); + + if (skip && skip === elem.nodeName.toLowerCase()) { + elem = elem[dir] || elem; + } else if ((oldCache = uniqueCache[key]) && + oldCache[0] === dirruns && oldCache[1] === doneName) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[2] = oldCache[2]); + } else { + // Reuse newcache so results back-propagate to previous elements + uniqueCache[key] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ((newCache[2] = matcher(elem, context, xml))) { + return true; + } + } + } + } + } + return false; + }; + } + + function elementMatcher(matchers) { + return matchers.length > 1 ? + function (elem, context, xml) { + var i = matchers.length; + while (i--) { + if (!matchers[i](elem, context, xml)) { + return false; + } + } + return true; + } : + matchers[0]; + } + + function multipleContexts(selector, contexts, results) { + var i = 0, + len = contexts.length; + for (; i < len; i++) { + Sizzle(selector, contexts[i], results); + } + return results; + } + + function condense(unmatched, map, filter, context, xml) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for (; i < len; i++) { + if ((elem = unmatched[i])) { + if (!filter || filter(elem, context, xml)) { + newUnmatched.push(elem); + if (mapped) { + map.push(i); + } + } + } + } + + return newUnmatched; + } + + function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector) { + if (postFilter && !postFilter[expando]) { + postFilter = setMatcher(postFilter); + } + if (postFinder && !postFinder[expando]) { + postFinder = setMatcher(postFinder, postSelector); + } + return markFunction(function (seed, results, context, xml) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts(selector || "*", context.nodeType ? [context] : context, []), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && (seed || !selector) ? + condense(elems, preMap, preFilter, context, xml) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || (seed ? preFilter : preexisting || postFilter) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if (matcher) { + matcher(matcherIn, matcherOut, context, xml); + } + + // Apply postFilter + if (postFilter) { + temp = condense(matcherOut, postMap); + postFilter(temp, [], context, xml); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while (i--) { + if ((elem = temp[i])) { + matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem); + } + } + } + + if (seed) { + if (postFinder || preFilter) { + if (postFinder) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while (i--) { + if ((elem = matcherOut[i])) { + // Restore matcherIn since elem is not yet a final match + temp.push((matcherIn[i] = elem)); + } + } + postFinder(null, (matcherOut = []), temp, xml); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while (i--) { + if ((elem = matcherOut[i]) && + (temp = postFinder ? indexOf(seed, elem) : preMap[i]) > -1) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice(preexisting, matcherOut.length) : + matcherOut + ); + if (postFinder) { + postFinder(null, results, matcherOut, xml); + } else { + push.apply(results, matcherOut); + } + } + }); + } + + function matcherFromTokens(tokens) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[tokens[0].type], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator(function (elem) { + return elem === checkContext; + }, implicitRelative, true), + matchAnyContext = addCombinator(function (elem) { + return indexOf(checkContext, elem) > -1; + }, implicitRelative, true), + matchers = [function (elem, context, xml) { + var ret = (!leadingRelative && (xml || context !== outermostContext)) || ( + (checkContext = context).nodeType ? + matchContext(elem, context, xml) : + matchAnyContext(elem, context, xml)); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + }]; + + for (; i < len; i++) { + if ((matcher = Expr.relative[tokens[i].type])) { + matchers = [addCombinator(elementMatcher(matchers), matcher)]; + } else { + matcher = Expr.filter[tokens[i].type].apply(null, tokens[i].matches); + + // Return special upon seeing a positional matcher + if (matcher[expando]) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for (; j < len; j++) { + if (Expr.relative[tokens[j].type]) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher(matchers), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice(0, i - 1).concat({value: tokens[i - 2].type === " " ? "*" : ""}) + ).replace(rtrim, "$1"), + matcher, + i < j && matcherFromTokens(tokens.slice(i, j)), + j < len && matcherFromTokens((tokens = tokens.slice(j))), + j < len && toSelector(tokens) + ); + } + matchers.push(matcher); + } + } + + return elementMatcher(matchers); + } + + function matcherFromGroupMatchers(elementMatchers, setMatchers) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function (seed, context, xml, results, outermost) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]("*", outermost), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if (outermost) { + outermostContext = context === document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for (; i !== len && (elem = elems[i]) != null; i++) { + if (byElement && elem) { + j = 0; + if (!context && elem.ownerDocument !== document) { + setDocument(elem); + xml = !documentIsHTML; + } + while ((matcher = elementMatchers[j++])) { + if (matcher(elem, context || document, xml)) { + results.push(elem); + break; + } + } + if (outermost) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if (bySet) { + // They will have gone through all possible matchers + if ((elem = !matcher && elem)) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if (seed) { + unmatched.push(elem); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if (bySet && i !== matchedCount) { + j = 0; + while ((matcher = setMatchers[j++])) { + matcher(unmatched, setMatched, context, xml); + } + + if (seed) { + // Reintegrate element matches to eliminate the need for sorting + if (matchedCount > 0) { + while (i--) { + if (!(unmatched[i] || setMatched[i])) { + setMatched[i] = pop.call(results); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense(setMatched); + } + + // Add matches to results + push.apply(results, setMatched); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if (outermost && !seed && setMatched.length > 0 && + (matchedCount + setMatchers.length) > 1) { + + Sizzle.uniqueSort(results); + } + } + + // Override manipulation of globals by nested matchers + if (outermost) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction(superMatcher) : + superMatcher; + } + + compile = Sizzle.compile = function (selector, match /* Internal Use Only */) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[selector + " "]; + + if (!cached) { + // Generate a function of recursive functions that can be used to check each element + if (!match) { + match = tokenize(selector); + } + i = match.length; + while (i--) { + cached = matcherFromTokens(match[i]); + if (cached[expando]) { + setMatchers.push(cached); + } else { + elementMatchers.push(cached); + } + } + + // Cache the compiled function + cached = compilerCache(selector, matcherFromGroupMatchers(elementMatchers, setMatchers)); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; + }; + + /** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ + select = Sizzle.select = function (selector, context, results, seed) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize((selector = compiled.selector || selector)); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if (match.length === 1) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice(0); + if (tokens.length > 2 && (token = tokens[0]).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[tokens[1].type]) { + + context = (Expr.find["ID"](token.matches[0].replace(runescape, funescape), context) || [])[0]; + if (!context) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if (compiled) { + context = context.parentNode; + } + + selector = selector.slice(tokens.shift().value.length); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test(selector) ? 0 : tokens.length; + while (i--) { + token = tokens[i]; + + // Abort if we hit a combinator + if (Expr.relative[(type = token.type)]) { + break; + } + if ((find = Expr.find[type])) { + // Search, expanding context for leading sibling combinators + if ((seed = find( + token.matches[0].replace(runescape, funescape), + rsibling.test(tokens[0].type) && testContext(context.parentNode) || context + ))) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice(i, 1); + selector = seed.length && toSelector(tokens); + if (!selector) { + push.apply(results, seed); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + (compiled || compile(selector, match))( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test(selector) && testContext(context.parentNode) || context + ); + return results; + }; + +// One-time assignments + +// Sort stability + support.sortStable = expando.split("").sort(sortOrder).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function + support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document + setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* + support.sortDetached = assert(function (el) { + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition(document.createElement("fieldset")) & 1; + }); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx + if (!assert(function (el) { + el.innerHTML = ""; + return el.firstChild.getAttribute("href") === "#"; + })) { + addHandle("type|href|height|width", function (elem, name, isXML) { + if (!isXML) { + return elem.getAttribute(name, name.toLowerCase() === "type" ? 1 : 2); + } + }); + } + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") + if (!support.attributes || !assert(function (el) { + el.innerHTML = ""; + el.firstChild.setAttribute("value", ""); + return el.firstChild.getAttribute("value") === ""; + })) { + addHandle("value", function (elem, name, isXML) { + if (!isXML && elem.nodeName.toLowerCase() === "input") { + return elem.defaultValue; + } + }); + } + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies + if (!assert(function (el) { + return el.getAttribute("disabled") == null; + })) { + addHandle(booleans, function (elem, name, isXML) { + var val; + if (!isXML) { + return elem[name] === true ? name.toLowerCase() : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; + } + }); + } + + return Sizzle; + + })(window); + + + jQuery.find = Sizzle; + jQuery.expr = Sizzle.selectors; + +// Deprecated + jQuery.expr[":"] = jQuery.expr.pseudos; + jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; + jQuery.text = Sizzle.getText; + jQuery.isXMLDoc = Sizzle.isXML; + jQuery.contains = Sizzle.contains; + jQuery.escapeSelector = Sizzle.escape; + + + var dir = function (elem, dir, until) { + var matched = [], + truncate = until !== undefined; + + while ((elem = elem[dir]) && elem.nodeType !== 9) { + if (elem.nodeType === 1) { + if (truncate && jQuery(elem).is(until)) { + break; + } + matched.push(elem); + } + } + return matched; + }; + + + var siblings = function (n, elem) { + var matched = []; + + for (; n; n = n.nextSibling) { + if (n.nodeType === 1 && n !== elem) { + matched.push(n); + } + } + + return matched; + }; + + + var rneedsContext = jQuery.expr.match.needsContext; + + + function nodeName(elem, name) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + + }; + var rsingleTag = (/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i); + + +// Implement the identical functionality for filter and not + function winnow(elements, qualifier, not) { + if (isFunction(qualifier)) { + return jQuery.grep(elements, function (elem, i) { + return !!qualifier.call(elem, i, elem) !== not; + }); + } + + // Single element + if (qualifier.nodeType) { + return jQuery.grep(elements, function (elem) { + return (elem === qualifier) !== not; + }); + } + + // Arraylike of elements (jQuery, arguments, Array) + if (typeof qualifier !== "string") { + return jQuery.grep(elements, function (elem) { + return (indexOf.call(qualifier, elem) > -1) !== not; + }); + } + + // Filtered directly for both simple and complex selectors + return jQuery.filter(qualifier, elements, not); + } + + jQuery.filter = function (expr, elems, not) { + var elem = elems[0]; + + if (not) { + expr = ":not(" + expr + ")"; + } + + if (elems.length === 1 && elem.nodeType === 1) { + return jQuery.find.matchesSelector(elem, expr) ? [elem] : []; + } + + return jQuery.find.matches(expr, jQuery.grep(elems, function (elem) { + return elem.nodeType === 1; + })); + }; + + jQuery.fn.extend({ + find: function (selector) { + var i, ret, + len = this.length, + self = this; + + if (typeof selector !== "string") { + return this.pushStack(jQuery(selector).filter(function () { + for (i = 0; i < len; i++) { + if (jQuery.contains(self[i], this)) { + return true; + } + } + })); + } + + ret = this.pushStack([]); + + for (i = 0; i < len; i++) { + jQuery.find(selector, self[i], ret); + } + + return len > 1 ? jQuery.uniqueSort(ret) : ret; + }, + filter: function (selector) { + return this.pushStack(winnow(this, selector || [], false)); + }, + not: function (selector) { + return this.pushStack(winnow(this, selector || [], true)); + }, + is: function (selector) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test(selector) ? + jQuery(selector) : + selector || [], + false + ).length; + } + }); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) + var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function (selector, context, root) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if (!selector) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if (typeof selector === "string") { + if (selector[0] === "<" && + selector[selector.length - 1] === ">" && + selector.length >= 3) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [null, selector, null]; + + } else { + match = rquickExpr.exec(selector); + } + + // Match html or make sure no context is specified for #id + if (match && (match[1] || !context)) { + + // HANDLE: $(html) -> $(array) + if (match[1]) { + context = context instanceof jQuery ? context[0] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge(this, jQuery.parseHTML( + match[1], + context && context.nodeType ? context.ownerDocument || context : document, + true + )); + + // HANDLE: $(html, props) + if (rsingleTag.test(match[1]) && jQuery.isPlainObject(context)) { + for (match in context) { + + // Properties of context are called as methods if possible + if (isFunction(this[match])) { + this[match](context[match]); + + // ...and otherwise set as attributes + } else { + this.attr(match, context[match]); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById(match[2]); + + if (elem) { + + // Inject the element directly into the jQuery object + this[0] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if (!context || context.jquery) { + return (context || root).find(selector); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor(context).find(selector); + } + + // HANDLE: $(DOMElement) + } else if (selector.nodeType) { + this[0] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if (isFunction(selector)) { + return root.ready !== undefined ? + root.ready(selector) : + + // Execute immediately if ready is not present + selector(jQuery); + } + + return jQuery.makeArray(selector, this); + }; + +// Give the init function the jQuery prototype for later instantiation + init.prototype = jQuery.fn; + +// Initialize central reference + rootjQuery = jQuery(document); + + + var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + + jQuery.fn.extend({ + has: function (target) { + var targets = jQuery(target, this), + l = targets.length; + + return this.filter(function () { + var i = 0; + for (; i < l; i++) { + if (jQuery.contains(this, targets[i])) { + return true; + } + } + }); + }, + + closest: function (selectors, context) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery(selectors); + + // Positional selectors never match, since there's no _selection_ context + if (!rneedsContext.test(selectors)) { + for (; i < l; i++) { + for (cur = this[i]; cur && cur !== context; cur = cur.parentNode) { + + // Always skip document fragments + if (cur.nodeType < 11 && (targets ? + targets.index(cur) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector(cur, selectors))) { + + matched.push(cur); + break; + } + } + } + } + + return this.pushStack(matched.length > 1 ? jQuery.uniqueSort(matched) : matched); + }, + + // Determine the position of an element within the set + index: function (elem) { + + // No argument, return index in parent + if (!elem) { + return (this[0] && this[0].parentNode) ? this.first().prevAll().length : -1; + } + + // Index in selector + if (typeof elem === "string") { + return indexOf.call(jQuery(elem), this[0]); + } + + // Locate the position of the desired element + return indexOf.call(this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem + ); + }, + + add: function (selector, context) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge(this.get(), jQuery(selector, context)) + ) + ); + }, + + addBack: function (selector) { + return this.add(selector == null ? + this.prevObject : this.prevObject.filter(selector) + ); + } + }); + + function sibling(cur, dir) { + while ((cur = cur[dir]) && cur.nodeType !== 1) { + } + return cur; + } + + jQuery.each({ + parent: function (elem) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function (elem) { + return dir(elem, "parentNode"); + }, + parentsUntil: function (elem, i, until) { + return dir(elem, "parentNode", until); + }, + next: function (elem) { + return sibling(elem, "nextSibling"); + }, + prev: function (elem) { + return sibling(elem, "previousSibling"); + }, + nextAll: function (elem) { + return dir(elem, "nextSibling"); + }, + prevAll: function (elem) { + return dir(elem, "previousSibling"); + }, + nextUntil: function (elem, i, until) { + return dir(elem, "nextSibling", until); + }, + prevUntil: function (elem, i, until) { + return dir(elem, "previousSibling", until); + }, + siblings: function (elem) { + return siblings((elem.parentNode || {}).firstChild, elem); + }, + children: function (elem) { + return siblings(elem.firstChild); + }, + contents: function (elem) { + if (nodeName(elem, "iframe")) { + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if (nodeName(elem, "template")) { + elem = elem.content || elem; + } + + return jQuery.merge([], elem.childNodes); + } + }, function (name, fn) { + jQuery.fn[name] = function (until, selector) { + var matched = jQuery.map(this, fn, until); + + if (name.slice(-5) !== "Until") { + selector = until; + } + + if (selector && typeof selector === "string") { + matched = jQuery.filter(selector, matched); + } + + if (this.length > 1) { + + // Remove duplicates + if (!guaranteedUnique[name]) { + jQuery.uniqueSort(matched); + } + + // Reverse order for parents* and prev-derivatives + if (rparentsprev.test(name)) { + matched.reverse(); + } + } + + return this.pushStack(matched); + }; + }); + var rnothtmlwhite = (/[^\x20\t\r\n\f]+/g); + + +// Convert String-formatted options into Object-formatted ones + function createOptions(options) { + var object = {}; + jQuery.each(options.match(rnothtmlwhite) || [], function (_, flag) { + object[flag] = true; + }); + return object; + } + + /* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ + jQuery.Callbacks = function (options) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions(options) : + jQuery.extend({}, options); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function () { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for (; queue.length; firingIndex = -1) { + memory = queue.shift(); + while (++firingIndex < list.length) { + + // Run callback and check for early termination + if (list[firingIndex].apply(memory[0], memory[1]) === false && + options.stopOnFalse) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if (!options.memory) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if (locked) { + + // Keep an empty list if we have data for future add calls + if (memory) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function () { + if (list) { + + // If we have memory from a past run, we should fire after adding + if (memory && !firing) { + firingIndex = list.length - 1; + queue.push(memory); + } + + (function add(args) { + jQuery.each(args, function (_, arg) { + if (isFunction(arg)) { + if (!options.unique || !self.has(arg)) { + list.push(arg); + } + } else if (arg && arg.length && toType(arg) !== "string") { + + // Inspect recursively + add(arg); + } + }); + })(arguments); + + if (memory && !firing) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function () { + jQuery.each(arguments, function (_, arg) { + var index; + while ((index = jQuery.inArray(arg, list, index)) > -1) { + list.splice(index, 1); + + // Handle firing indexes + if (index <= firingIndex) { + firingIndex--; + } + } + }); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function (fn) { + return fn ? + jQuery.inArray(fn, list) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function () { + if (list) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function () { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function () { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function () { + locked = queue = []; + if (!memory && !firing) { + list = memory = ""; + } + return this; + }, + locked: function () { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function (context, args) { + if (!locked) { + args = args || []; + args = [context, args.slice ? args.slice() : args]; + queue.push(args); + if (!firing) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function () { + self.fireWith(this, arguments); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function () { + return !!fired; + } + }; + + return self; + }; + + + function Identity(v) { + return v; + } + + function Thrower(ex) { + throw ex; + } + + function adoptValue(value, resolve, reject, noValue) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if (value && isFunction((method = value.promise))) { + method.call(value).done(resolve).fail(reject); + + // Other thenables + } else if (value && isFunction((method = value.then))) { + method.call(value, resolve, reject); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply(undefined, [value].slice(noValue)); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch (value) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply(undefined, [value]); + } + } + + jQuery.extend({ + + Deferred: function (func) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + ["notify", "progress", jQuery.Callbacks("memory"), + jQuery.Callbacks("memory"), 2], + ["resolve", "done", jQuery.Callbacks("once memory"), + jQuery.Callbacks("once memory"), 0, "resolved"], + ["reject", "fail", jQuery.Callbacks("once memory"), + jQuery.Callbacks("once memory"), 1, "rejected"] + ], + state = "pending", + promise = { + state: function () { + return state; + }, + always: function () { + deferred.done(arguments).fail(arguments); + return this; + }, + "catch": function (fn) { + return promise.then(null, fn); + }, + + // Keep pipe for back-compat + pipe: function (/* fnDone, fnFail, fnProgress */) { + var fns = arguments; + + return jQuery.Deferred(function (newDefer) { + jQuery.each(tuples, function (i, tuple) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = isFunction(fns[tuple[4]]) && fns[tuple[4]]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[tuple[1]](function () { + var returned = fn && fn.apply(this, arguments); + if (returned && isFunction(returned.promise)) { + returned.promise() + .progress(newDefer.notify) + .done(newDefer.resolve) + .fail(newDefer.reject); + } else { + newDefer[tuple[0] + "With"]( + this, + fn ? [returned] : arguments + ); + } + }); + }); + fns = null; + }).promise(); + }, + then: function (onFulfilled, onRejected, onProgress) { + var maxDepth = 0; + + function resolve(depth, deferred, handler, special) { + return function () { + var that = this, + args = arguments, + mightThrow = function () { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if (depth < maxDepth) { + return; + } + + returned = handler.apply(that, args); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if (returned === deferred.promise()) { + throw new TypeError("Thenable self-resolution"); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + (typeof returned === "object" || + typeof returned === "function") && + returned.then; + + // Handle a returned thenable + if (isFunction(then)) { + + // Special processors (notify) just wait for resolution + if (special) { + then.call( + returned, + resolve(maxDepth, deferred, Identity, special), + resolve(maxDepth, deferred, Thrower, special) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve(maxDepth, deferred, Identity, special), + resolve(maxDepth, deferred, Thrower, special), + resolve(maxDepth, deferred, Identity, + deferred.notifyWith) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if (handler !== Identity) { + that = undefined; + args = [returned]; + } + + // Process the value(s) + // Default process is resolve + (special || deferred.resolveWith)(that, args); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function () { + try { + mightThrow(); + } catch (e) { + + if (jQuery.Deferred.exceptionHook) { + jQuery.Deferred.exceptionHook(e, + process.stackTrace); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if (depth + 1 >= maxDepth) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if (handler !== Thrower) { + that = undefined; + args = [e]; + } + + deferred.rejectWith(that, args); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if (depth) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if (jQuery.Deferred.getStackHook) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout(process); + } + }; + } + + return jQuery.Deferred(function (newDefer) { + + // progress_handlers.add( ... ) + tuples[0][3].add( + resolve( + 0, + newDefer, + isFunction(onProgress) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[1][3].add( + resolve( + 0, + newDefer, + isFunction(onFulfilled) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[2][3].add( + resolve( + 0, + newDefer, + isFunction(onRejected) ? + onRejected : + Thrower + ) + ); + }).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function (obj) { + return obj != null ? jQuery.extend(obj, promise) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each(tuples, function (i, tuple) { + var list = tuple[2], + stateString = tuple[5]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[tuple[1]] = list.add; + + // Handle state + if (stateString) { + list.add( + function () { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[3 - i][2].disable, + + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[3 - i][3].disable, + + // progress_callbacks.lock + tuples[0][2].lock, + + // progress_handlers.lock + tuples[0][3].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add(tuple[3].fire); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[tuple[0]] = function () { + deferred[tuple[0] + "With"](this === deferred ? undefined : this, arguments); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[tuple[0] + "With"] = list.fireWith; + }); + + // Make the deferred a promise + promise.promise(deferred); + + // Call given func if any + if (func) { + func.call(deferred, deferred); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function (singleValue) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array(i), + resolveValues = slice.call(arguments), + + // the master Deferred + master = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function (i) { + return function (value) { + resolveContexts[i] = this; + resolveValues[i] = arguments.length > 1 ? slice.call(arguments) : value; + if (!(--remaining)) { + master.resolveWith(resolveContexts, resolveValues); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if (remaining <= 1) { + adoptValue(singleValue, master.done(updateFunc(i)).resolve, master.reject, + !remaining); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if (master.state() === "pending" || + isFunction(resolveValues[i] && resolveValues[i].then)) { + + return master.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while (i--) { + adoptValue(resolveValues[i], updateFunc(i), master.reject); + } + + return master.promise(); + } + }); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. + var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + + jQuery.Deferred.exceptionHook = function (error, stack) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if (window.console && window.console.warn && error && rerrorNames.test(error.name)) { + window.console.warn("jQuery.Deferred exception: " + error.message, error.stack, stack); + } + }; + + + jQuery.readyException = function (error) { + window.setTimeout(function () { + throw error; + }); + }; + + +// The deferred used on DOM ready + var readyList = jQuery.Deferred(); + + jQuery.fn.ready = function (fn) { + + readyList + .then(fn) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch(function (error) { + jQuery.readyException(error); + }); + + return this; + }; + + jQuery.extend({ + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function (wait) { + + // Abort if there are pending holds or we're already ready + if (wait === true ? --jQuery.readyWait : jQuery.isReady) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if (wait !== true && --jQuery.readyWait > 0) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith(document, [jQuery]); + } + }); + + jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method + function completed() { + document.removeEventListener("DOMContentLoaded", completed); + window.removeEventListener("load", completed); + jQuery.ready(); + } + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon + if (document.readyState === "complete" || + (document.readyState !== "loading" && !document.documentElement.doScroll)) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout(jQuery.ready); + + } else { + + // Use the handy event callback + document.addEventListener("DOMContentLoaded", completed); + + // A fallback to window.onload, that will always work + window.addEventListener("load", completed); + } + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function + var access = function (elems, fn, key, value, chainable, emptyGet, raw) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if (toType(key) === "object") { + chainable = true; + for (i in key) { + access(elems, fn, i, key[i], true, emptyGet, raw); + } + + // Sets one value + } else if (value !== undefined) { + chainable = true; + + if (!isFunction(value)) { + raw = true; + } + + if (bulk) { + + // Bulk operations run against the entire set + if (raw) { + fn.call(elems, value); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function (elem, key, value) { + return bulk.call(jQuery(elem), value); + }; + } + } + + if (fn) { + for (; i < len; i++) { + fn( + elems[i], key, raw ? + value : + value.call(elems[i], i, fn(elems[i], key)) + ); + } + } + } + + if (chainable) { + return elems; + } + + // Gets + if (bulk) { + return fn.call(elems); + } + + return len ? fn(elems[0], key) : emptyGet; + }; + + +// Matches dashed string for camelizing + var rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() + function fcamelCase(all, letter) { + return letter.toUpperCase(); + } + +// Convert dashed to camelCase; used by the css and data modules +// Support: IE <=9 - 11, Edge 12 - 15 +// Microsoft forgot to hump their vendor prefix (#9572) + function camelCase(string) { + return string.replace(rmsPrefix, "ms-").replace(rdashAlpha, fcamelCase); + } + + var acceptData = function (owner) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !(+owner.nodeType); + }; + + + function Data() { + this.expando = jQuery.expando + Data.uid++; + } + + Data.uid = 1; + + Data.prototype = { + + cache: function (owner) { + + // Check if the owner object already has a cache + var value = owner[this.expando]; + + // If not, create one + if (!value) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if (acceptData(owner)) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if (owner.nodeType) { + owner[this.expando] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty(owner, this.expando, { + value: value, + configurable: true + }); + } + } + } + + return value; + }, + set: function (owner, data, value) { + var prop, + cache = this.cache(owner); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if (typeof data === "string") { + cache[camelCase(data)] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for (prop in data) { + cache[camelCase(prop)] = data[prop]; + } + } + return cache; + }, + get: function (owner, key) { + return key === undefined ? + this.cache(owner) : + + // Always use camelCase key (gh-2257) + owner[this.expando] && owner[this.expando][camelCase(key)]; + }, + access: function (owner, key, value) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if (key === undefined || + ((key && typeof key === "string") && value === undefined)) { + + return this.get(owner, key); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set(owner, key, value); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function (owner, key) { + var i, + cache = owner[this.expando]; + + if (cache === undefined) { + return; + } + + if (key !== undefined) { + + // Support array or space separated string of keys + if (Array.isArray(key)) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map(camelCase); + } else { + key = camelCase(key); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [key] : + (key.match(rnothtmlwhite) || []); + } + + i = key.length; + + while (i--) { + delete cache[key[i]]; + } + } + + // Remove the expando if there's no more data + if (key === undefined || jQuery.isEmptyObject(cache)) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if (owner.nodeType) { + owner[this.expando] = undefined; + } else { + delete owner[this.expando]; + } + } + }, + hasData: function (owner) { + var cache = owner[this.expando]; + return cache !== undefined && !jQuery.isEmptyObject(cache); + } + }; + var dataPriv = new Data(); + + var dataUser = new Data(); + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + + var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + + function getData(data) { + if (data === "true") { + return true; + } + + if (data === "false") { + return false; + } + + if (data === "null") { + return null; + } + + // Only convert to a number if it doesn't change the string + if (data === +data + "") { + return +data; + } + + if (rbrace.test(data)) { + return JSON.parse(data); + } + + return data; + } + + function dataAttr(elem, key, data) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if (data === undefined && elem.nodeType === 1) { + name = "data-" + key.replace(rmultiDash, "-$&").toLowerCase(); + data = elem.getAttribute(name); + + if (typeof data === "string") { + try { + data = getData(data); + } catch (e) { + } + + // Make sure we set the data so it isn't changed later + dataUser.set(elem, key, data); + } else { + data = undefined; + } + } + return data; + } + + jQuery.extend({ + hasData: function (elem) { + return dataUser.hasData(elem) || dataPriv.hasData(elem); + }, + + data: function (elem, name, data) { + return dataUser.access(elem, name, data); + }, + + removeData: function (elem, name) { + dataUser.remove(elem, name); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function (elem, name, data) { + return dataPriv.access(elem, name, data); + }, + + _removeData: function (elem, name) { + dataPriv.remove(elem, name); + } + }); + + jQuery.fn.extend({ + data: function (key, value) { + var i, name, data, + elem = this[0], + attrs = elem && elem.attributes; + + // Gets all values + if (key === undefined) { + if (this.length) { + data = dataUser.get(elem); + + if (elem.nodeType === 1 && !dataPriv.get(elem, "hasDataAttrs")) { + i = attrs.length; + while (i--) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if (attrs[i]) { + name = attrs[i].name; + if (name.indexOf("data-") === 0) { + name = camelCase(name.slice(5)); + dataAttr(elem, name, data[name]); + } + } + } + dataPriv.set(elem, "hasDataAttrs", true); + } + } + + return data; + } + + // Sets multiple values + if (typeof key === "object") { + return this.each(function () { + dataUser.set(this, key); + }); + } + + return access(this, function (value) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if (elem && value === undefined) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get(elem, key); + if (data !== undefined) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr(elem, key); + if (data !== undefined) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each(function () { + + // We always store the camelCased key + dataUser.set(this, key, value); + }); + }, null, value, arguments.length > 1, null, true); + }, + + removeData: function (key) { + return this.each(function () { + dataUser.remove(this, key); + }); + } + }); + + + jQuery.extend({ + queue: function (elem, type, data) { + var queue; + + if (elem) { + type = (type || "fx") + "queue"; + queue = dataPriv.get(elem, type); + + // Speed up dequeue by getting out quickly if this is just a lookup + if (data) { + if (!queue || Array.isArray(data)) { + queue = dataPriv.access(elem, type, jQuery.makeArray(data)); + } else { + queue.push(data); + } + } + return queue || []; + } + }, + + dequeue: function (elem, type) { + type = type || "fx"; + + var queue = jQuery.queue(elem, type), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks(elem, type), + next = function () { + jQuery.dequeue(elem, type); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if (fn === "inprogress") { + fn = queue.shift(); + startLength--; + } + + if (fn) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if (type === "fx") { + queue.unshift("inprogress"); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call(elem, next, hooks); + } + + if (!startLength && hooks) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function (elem, type) { + var key = type + "queueHooks"; + return dataPriv.get(elem, key) || dataPriv.access(elem, key, { + empty: jQuery.Callbacks("once memory").add(function () { + dataPriv.remove(elem, [type + "queue", key]); + }) + }); + } + }); + + jQuery.fn.extend({ + queue: function (type, data) { + var setter = 2; + + if (typeof type !== "string") { + data = type; + type = "fx"; + setter--; + } + + if (arguments.length < setter) { + return jQuery.queue(this[0], type); + } + + return data === undefined ? + this : + this.each(function () { + var queue = jQuery.queue(this, type, data); + + // Ensure a hooks for this queue + jQuery._queueHooks(this, type); + + if (type === "fx" && queue[0] !== "inprogress") { + jQuery.dequeue(this, type); + } + }); + }, + dequeue: function (type) { + return this.each(function () { + jQuery.dequeue(this, type); + }); + }, + clearQueue: function (type) { + return this.queue(type || "fx", []); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function (type, obj) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function () { + if (!(--count)) { + defer.resolveWith(elements, [elements]); + } + }; + + if (typeof type !== "string") { + obj = type; + type = undefined; + } + type = type || "fx"; + + while (i--) { + tmp = dataPriv.get(elements[i], type + "queueHooks"); + if (tmp && tmp.empty) { + count++; + tmp.empty.add(resolve); + } + } + resolve(); + return defer.promise(obj); + } + }); + var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source; + + var rcssNum = new RegExp("^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i"); + + + var cssExpand = ["Top", "Right", "Bottom", "Left"]; + + var isHiddenWithinTree = function (elem, el) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + jQuery.contains(elem.ownerDocument, elem) && + + jQuery.css(elem, "display") === "none"; + }; + + var swap = function (elem, options, callback, args) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for (name in options) { + old[name] = elem.style[name]; + elem.style[name] = options[name]; + } + + ret = callback.apply(elem, args || []); + + // Revert the old values + for (name in options) { + elem.style[name] = old[name]; + } + + return ret; + }; + + + function adjustCSS(elem, prop, valueParts, tween) { + var adjusted, scale, + maxIterations = 20, + currentValue = tween ? + function () { + return tween.cur(); + } : + function () { + return jQuery.css(elem, prop, ""); + }, + initial = currentValue(), + unit = valueParts && valueParts[3] || (jQuery.cssNumber[prop] ? "" : "px"), + + // Starting value computation is required for potential unit mismatches + initialInUnit = (jQuery.cssNumber[prop] || unit !== "px" && +initial) && + rcssNum.exec(jQuery.css(elem, prop)); + + if (initialInUnit && initialInUnit[3] !== unit) { + + // Support: Firefox <=54 + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[3]; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + while (maxIterations--) { + + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). + jQuery.style(elem, prop, initialInUnit + unit); + if ((1 - scale) * (1 - (scale = currentValue() / initial || 0.5)) <= 0) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; + + } + + initialInUnit = initialInUnit * 2; + jQuery.style(elem, prop, initialInUnit + unit); + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + } + + if (valueParts) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[1] ? + initialInUnit + (valueParts[1] + 1) * valueParts[2] : + +valueParts[2]; + if (tween) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; + } + + + var defaultDisplayMap = {}; + + function getDefaultDisplay(elem) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[nodeName]; + + if (display) { + return display; + } + + temp = doc.body.appendChild(doc.createElement(nodeName)); + display = jQuery.css(temp, "display"); + + temp.parentNode.removeChild(temp); + + if (display === "none") { + display = "block"; + } + defaultDisplayMap[nodeName] = display; + + return display; + } + + function showHide(elements, show) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for (; index < length; index++) { + elem = elements[index]; + if (!elem.style) { + continue; + } + + display = elem.style.display; + if (show) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if (display === "none") { + values[index] = dataPriv.get(elem, "display") || null; + if (!values[index]) { + elem.style.display = ""; + } + } + if (elem.style.display === "" && isHiddenWithinTree(elem)) { + values[index] = getDefaultDisplay(elem); + } + } else { + if (display !== "none") { + values[index] = "none"; + + // Remember what we're overwriting + dataPriv.set(elem, "display", display); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for (index = 0; index < length; index++) { + if (values[index] != null) { + elements[index].style.display = values[index]; + } + } + + return elements; + } + + jQuery.fn.extend({ + show: function () { + return showHide(this, true); + }, + hide: function () { + return showHide(this); + }, + toggle: function (state) { + if (typeof state === "boolean") { + return state ? this.show() : this.hide(); + } + + return this.each(function () { + if (isHiddenWithinTree(this)) { + jQuery(this).show(); + } else { + jQuery(this).hide(); + } + }); + } + }); + var rcheckableType = (/^(?:checkbox|radio)$/i); + + var rtagName = (/<([a-z][^\/\0>\x20\t\r\n\f]+)/i); + + var rscriptType = (/^$|^module$|\/(?:java|ecma)script/i); + + +// We have to close these tags to support XHTML (#13200) + var wrapMap = { + + // Support: IE <=9 only + option: [1, ""], + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [1, "", "
          "], + col: [2, "", "
          "], + tr: [2, "", "
          "], + td: [3, "", "
          "], + + _default: [0, "", ""] + }; + +// Support: IE <=9 only + wrapMap.optgroup = wrapMap.option; + + wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; + wrapMap.th = wrapMap.td; + + + function getAll(context, tag) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if (typeof context.getElementsByTagName !== "undefined") { + ret = context.getElementsByTagName(tag || "*"); + + } else if (typeof context.querySelectorAll !== "undefined") { + ret = context.querySelectorAll(tag || "*"); + + } else { + ret = []; + } + + if (tag === undefined || tag && nodeName(context, tag)) { + return jQuery.merge([context], ret); + } + + return ret; + } + + +// Mark scripts as having already been evaluated + function setGlobalEval(elems, refElements) { + var i = 0, + l = elems.length; + + for (; i < l; i++) { + dataPriv.set( + elems[i], + "globalEval", + !refElements || dataPriv.get(refElements[i], "globalEval") + ); + } + } + + + var rhtml = /<|&#?\w+;/; + + function buildFragment(elems, context, scripts, selection, ignored) { + var elem, tmp, tag, wrap, contains, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for (; i < l; i++) { + elem = elems[i]; + + if (elem || elem === 0) { + + // Add nodes directly + if (toType(elem) === "object") { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge(nodes, elem.nodeType ? [elem] : elem); + + // Convert non-html into a text node + } else if (!rhtml.test(elem)) { + nodes.push(context.createTextNode(elem)); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild(context.createElement("div")); + + // Deserialize a standard representation + tag = (rtagName.exec(elem) || ["", ""])[1].toLowerCase(); + wrap = wrapMap[tag] || wrapMap._default; + tmp.innerHTML = wrap[1] + jQuery.htmlPrefilter(elem) + wrap[2]; + + // Descend through wrappers to the right content + j = wrap[0]; + while (j--) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge(nodes, tmp.childNodes); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ((elem = nodes[i++])) { + + // Skip elements already in the context collection (trac-4087) + if (selection && jQuery.inArray(elem, selection) > -1) { + if (ignored) { + ignored.push(elem); + } + continue; + } + + contains = jQuery.contains(elem.ownerDocument, elem); + + // Append to fragment + tmp = getAll(fragment.appendChild(elem), "script"); + + // Preserve script evaluation history + if (contains) { + setGlobalEval(tmp); + } + + // Capture executables + if (scripts) { + j = 0; + while ((elem = tmp[j++])) { + if (rscriptType.test(elem.type || "")) { + scripts.push(elem); + } + } + } + } + + return fragment; + } + + + (function () { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild(document.createElement("div")), + input = document.createElement("input"); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute("type", "radio"); + input.setAttribute("checked", "checked"); + input.setAttribute("name", "t"); + + div.appendChild(input); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode(true).cloneNode(true).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode(true).lastChild.defaultValue; + })(); + var documentElement = document.documentElement; + + + var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + + function returnTrue() { + return true; + } + + function returnFalse() { + return false; + } + +// Support: IE <=9 only +// See #13393 for more info + function safeActiveElement() { + try { + return document.activeElement; + } catch (err) { + } + } + + function on(elem, types, selector, data, fn, one) { + var origFn, type; + + // Types can be a map of types/handlers + if (typeof types === "object") { + + // ( types-Object, selector, data ) + if (typeof selector !== "string") { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for (type in types) { + on(elem, type, selector, data, types[type], one); + } + return elem; + } + + if (data == null && fn == null) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if (fn == null) { + if (typeof selector === "string") { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if (fn === false) { + fn = returnFalse; + } else if (!fn) { + return elem; + } + + if (one === 1) { + origFn = fn; + fn = function (event) { + + // Can use an empty set, since event contains the info + jQuery().off(event); + return origFn.apply(this, arguments); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || (origFn.guid = jQuery.guid++); + } + return elem.each(function () { + jQuery.event.add(this, types, fn, data, selector); + }); + } + + /* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ + jQuery.event = { + + global: {}, + + add: function (elem, types, handler, data, selector) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get(elem); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if (!elemData) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if (handler.handler) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if (selector) { + jQuery.find.matchesSelector(documentElement, selector); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if (!handler.guid) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if (!(events = elemData.events)) { + events = elemData.events = {}; + } + if (!(eventHandle = elemData.handle)) { + eventHandle = elemData.handle = function (e) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply(elem, arguments) : undefined; + }; + } + + // Handle multiple events separated by a space + types = (types || "").match(rnothtmlwhite) || [""]; + t = types.length; + while (t--) { + tmp = rtypenamespace.exec(types[t]) || []; + type = origType = tmp[1]; + namespaces = (tmp[2] || "").split(".").sort(); + + // There *must* be a type, no attaching namespace-only handlers + if (!type) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[type] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = (selector ? special.delegateType : special.bindType) || type; + + // Update special based on newly reset type + special = jQuery.event.special[type] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test(selector), + namespace: namespaces.join(".") + }, handleObjIn); + + // Init the event handler queue if we're the first + if (!(handlers = events[type])) { + handlers = events[type] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if (!special.setup || + special.setup.call(elem, data, namespaces, eventHandle) === false) { + + if (elem.addEventListener) { + elem.addEventListener(type, eventHandle); + } + } + } + + if (special.add) { + special.add.call(elem, handleObj); + + if (!handleObj.handler.guid) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if (selector) { + handlers.splice(handlers.delegateCount++, 0, handleObj); + } else { + handlers.push(handleObj); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[type] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function (elem, types, handler, selector, mappedTypes) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData(elem) && dataPriv.get(elem); + + if (!elemData || !(events = elemData.events)) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = (types || "").match(rnothtmlwhite) || [""]; + t = types.length; + while (t--) { + tmp = rtypenamespace.exec(types[t]) || []; + type = origType = tmp[1]; + namespaces = (tmp[2] || "").split(".").sort(); + + // Unbind all events (on this namespace, if provided) for the element + if (!type) { + for (type in events) { + jQuery.event.remove(elem, type + types[t], handler, selector, true); + } + continue; + } + + special = jQuery.event.special[type] || {}; + type = (selector ? special.delegateType : special.bindType) || type; + handlers = events[type] || []; + tmp = tmp[2] && + new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)"); + + // Remove matching events + origCount = j = handlers.length; + while (j--) { + handleObj = handlers[j]; + + if ((mappedTypes || origType === handleObj.origType) && + (!handler || handler.guid === handleObj.guid) && + (!tmp || tmp.test(handleObj.namespace)) && + (!selector || selector === handleObj.selector || + selector === "**" && handleObj.selector)) { + handlers.splice(j, 1); + + if (handleObj.selector) { + handlers.delegateCount--; + } + if (special.remove) { + special.remove.call(elem, handleObj); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if (origCount && !handlers.length) { + if (!special.teardown || + special.teardown.call(elem, namespaces, elemData.handle) === false) { + + jQuery.removeEvent(elem, type, elemData.handle); + } + + delete events[type]; + } + } + + // Remove data and the expando if it's no longer used + if (jQuery.isEmptyObject(events)) { + dataPriv.remove(elem, "handle events"); + } + }, + + dispatch: function (nativeEvent) { + + // Make a writable jQuery.Event from the native event object + var event = jQuery.event.fix(nativeEvent); + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array(arguments.length), + handlers = (dataPriv.get(this, "events") || {})[event.type] || [], + special = jQuery.event.special[event.type] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + + for (i = 1; i < arguments.length; i++) { + args[i] = arguments[i]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if (special.preDispatch && special.preDispatch.call(this, event) === false) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call(this, event, handlers); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ((matched = handlerQueue[i++]) && !event.isPropagationStopped()) { + event.currentTarget = matched.elem; + + j = 0; + while ((handleObj = matched.handlers[j++]) && + !event.isImmediatePropagationStopped()) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if (!event.rnamespace || event.rnamespace.test(handleObj.namespace)) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ((jQuery.event.special[handleObj.origType] || {}).handle || + handleObj.handler).apply(matched.elem, args); + + if (ret !== undefined) { + if ((event.result = ret) === false) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if (special.postDispatch) { + special.postDispatch.call(this, event); + } + + return event.result; + }, + + handlers: function (event, handlers) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if (delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !(event.type === "click" && event.button >= 1)) { + + for (; cur !== this; cur = cur.parentNode || this) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if (cur.nodeType === 1 && !(event.type === "click" && cur.disabled === true)) { + matchedHandlers = []; + matchedSelectors = {}; + for (i = 0; i < delegateCount; i++) { + handleObj = handlers[i]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if (matchedSelectors[sel] === undefined) { + matchedSelectors[sel] = handleObj.needsContext ? + jQuery(sel, this).index(cur) > -1 : + jQuery.find(sel, this, null, [cur]).length; + } + if (matchedSelectors[sel]) { + matchedHandlers.push(handleObj); + } + } + if (matchedHandlers.length) { + handlerQueue.push({elem: cur, handlers: matchedHandlers}); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if (delegateCount < handlers.length) { + handlerQueue.push({elem: cur, handlers: handlers.slice(delegateCount)}); + } + + return handlerQueue; + }, + + addProp: function (name, hook) { + Object.defineProperty(jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: isFunction(hook) ? + function () { + if (this.originalEvent) { + return hook(this.originalEvent); + } + } : + function () { + if (this.originalEvent) { + return this.originalEvent[name]; + } + }, + + set: function (value) { + Object.defineProperty(this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + }); + } + }); + }, + + fix: function (originalEvent) { + return originalEvent[jQuery.expando] ? + originalEvent : + new jQuery.Event(originalEvent); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function () { + if (this !== safeActiveElement() && this.focus) { + this.focus(); + return false; + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function () { + if (this === safeActiveElement() && this.blur) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function () { + if (this.type === "checkbox" && this.click && nodeName(this, "input")) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function (event) { + return nodeName(event.target, "a"); + } + }, + + beforeunload: { + postDispatch: function (event) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if (event.result !== undefined && event.originalEvent) { + event.originalEvent.returnValue = event.result; + } + } + } + } + }; + + jQuery.removeEvent = function (elem, type, handle) { + + // This "if" is needed for plain objects + if (elem.removeEventListener) { + elem.removeEventListener(type, handle); + } + }; + + jQuery.Event = function (src, props) { + + // Allow instantiation without the 'new' keyword + if (!(this instanceof jQuery.Event)) { + return new jQuery.Event(src, props); + } + + // Event object + if (src && src.type) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = (src.target && src.target.nodeType === 3) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if (props) { + jQuery.extend(this, props); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || Date.now(); + + // Mark it as fixed + this[jQuery.expando] = true; + }; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html + jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function () { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if (e && !this.isSimulated) { + e.preventDefault(); + } + }, + stopPropagation: function () { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if (e && !this.isSimulated) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function () { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if (e && !this.isSimulated) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } + }; + +// Includes all common event props including KeyEvent and MouseEvent specific props + jQuery.each({ + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + + which: function (event) { + var button = event.button; + + // Add which for key events + if (event.which == null && rkeyEvent.test(event.type)) { + return event.charCode != null ? event.charCode : event.keyCode; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + if (!event.which && button !== undefined && rmouseEvent.test(event.type)) { + if (button & 1) { + return 1; + } + + if (button & 2) { + return 3; + } + + if (button & 4) { + return 2; + } + + return 0; + } + + return event.which; + } + }, jQuery.event.addProp); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). + jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" + }, function (orig, fix) { + jQuery.event.special[orig] = { + delegateType: fix, + bindType: fix, + + handle: function (event) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if (!related || (related !== target && !jQuery.contains(target, related))) { + event.type = handleObj.origType; + ret = handleObj.handler.apply(this, arguments); + event.type = fix; + } + return ret; + } + }; + }); + + jQuery.fn.extend({ + + on: function (types, selector, data, fn) { + return on(this, types, selector, data, fn); + }, + one: function (types, selector, data, fn) { + return on(this, types, selector, data, fn, 1); + }, + off: function (types, selector, fn) { + var handleObj, type; + if (types && types.preventDefault && types.handleObj) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery(types.delegateTarget).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if (typeof types === "object") { + + // ( types-object [, selector] ) + for (type in types) { + this.off(type, selector, types[type]); + } + return this; + } + if (selector === false || typeof selector === "function") { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if (fn === false) { + fn = returnFalse; + } + return this.each(function () { + jQuery.event.remove(this, types, fn, selector); + }); + } + }); + + + var + + /* eslint-disable max-len */ + + // See https://github.com/eslint/eslint/issues/3229 + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, + + /* eslint-enable */ + + // Support: IE <=10 - 11, Edge 12 - 13 only + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows + function manipulationTarget(elem, content) { + if (nodeName(elem, "table") && + nodeName(content.nodeType !== 11 ? content : content.firstChild, "tr")) { + + return jQuery(elem).children("tbody")[0] || elem; + } + + return elem; + } + +// Replace/restore the type attribute of script elements for safe DOM manipulation + function disableScript(elem) { + elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type; + return elem; + } + + function restoreScript(elem) { + if ((elem.type || "").slice(0, 5) === "true/") { + elem.type = elem.type.slice(5); + } else { + elem.removeAttribute("type"); + } + + return elem; + } + + function cloneCopyEvent(src, dest) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + + if (dest.nodeType !== 1) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if (dataPriv.hasData(src)) { + pdataOld = dataPriv.access(src); + pdataCur = dataPriv.set(dest, pdataOld); + events = pdataOld.events; + + if (events) { + delete pdataCur.handle; + pdataCur.events = {}; + + for (type in events) { + for (i = 0, l = events[type].length; i < l; i++) { + jQuery.event.add(dest, type, events[type][i]); + } + } + } + } + + // 2. Copy user data + if (dataUser.hasData(src)) { + udataOld = dataUser.access(src); + udataCur = jQuery.extend({}, udataOld); + + dataUser.set(dest, udataCur); + } + } + +// Fix IE bugs, see support tests + function fixInput(src, dest) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if (nodeName === "input" && rcheckableType.test(src.type)) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if (nodeName === "input" || nodeName === "textarea") { + dest.defaultValue = src.defaultValue; + } + } + + function domManip(collection, args, callback, ignored) { + + // Flatten any nested arrays + args = concat.apply([], args); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[0], + valueIsFunction = isFunction(value); + + // We can't cloneNode fragments that contain checked, in WebKit + if (valueIsFunction || + (l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test(value))) { + return collection.each(function (index) { + var self = collection.eq(index); + if (valueIsFunction) { + args[0] = value.call(this, index, self.html()); + } + domManip(self, args, callback, ignored); + }); + } + + if (l) { + fragment = buildFragment(args, collection[0].ownerDocument, false, collection, ignored); + first = fragment.firstChild; + + if (fragment.childNodes.length === 1) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if (first || ignored) { + scripts = jQuery.map(getAll(fragment, "script"), disableScript); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for (; i < l; i++) { + node = fragment; + + if (i !== iNoClone) { + node = jQuery.clone(node, true, true); + + // Keep references to cloned scripts for later restoration + if (hasScripts) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge(scripts, getAll(node, "script")); + } + } + + callback.call(collection[i], node, i); + } + + if (hasScripts) { + doc = scripts[scripts.length - 1].ownerDocument; + + // Reenable scripts + jQuery.map(scripts, restoreScript); + + // Evaluate executable scripts on first document insertion + for (i = 0; i < hasScripts; i++) { + node = scripts[i]; + if (rscriptType.test(node.type || "") && + !dataPriv.access(node, "globalEval") && + jQuery.contains(doc, node)) { + + if (node.src && (node.type || "").toLowerCase() !== "module") { + + // Optional AJAX dependency, but won't run scripts if not present + if (jQuery._evalUrl) { + jQuery._evalUrl(node.src); + } + } else { + DOMEval(node.textContent.replace(rcleanScript, ""), doc, node); + } + } + } + } + } + } + + return collection; + } + + function remove(elem, selector, keepData) { + var node, + nodes = selector ? jQuery.filter(selector, elem) : elem, + i = 0; + + for (; (node = nodes[i]) != null; i++) { + if (!keepData && node.nodeType === 1) { + jQuery.cleanData(getAll(node)); + } + + if (node.parentNode) { + if (keepData && jQuery.contains(node.ownerDocument, node)) { + setGlobalEval(getAll(node, "script")); + } + node.parentNode.removeChild(node); + } + } + + return elem; + } + + jQuery.extend({ + htmlPrefilter: function (html) { + return html.replace(rxhtmlTag, "<$1>"); + }, + + clone: function (elem, dataAndEvents, deepDataAndEvents) { + var i, l, srcElements, destElements, + clone = elem.cloneNode(true), + inPage = jQuery.contains(elem.ownerDocument, elem); + + // Fix IE cloning issues + if (!support.noCloneChecked && (elem.nodeType === 1 || elem.nodeType === 11) && + !jQuery.isXMLDoc(elem)) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll(clone); + srcElements = getAll(elem); + + for (i = 0, l = srcElements.length; i < l; i++) { + fixInput(srcElements[i], destElements[i]); + } + } + + // Copy the events from the original to the clone + if (dataAndEvents) { + if (deepDataAndEvents) { + srcElements = srcElements || getAll(elem); + destElements = destElements || getAll(clone); + + for (i = 0, l = srcElements.length; i < l; i++) { + cloneCopyEvent(srcElements[i], destElements[i]); + } + } else { + cloneCopyEvent(elem, clone); + } + } + + // Preserve script evaluation history + destElements = getAll(clone, "script"); + if (destElements.length > 0) { + setGlobalEval(destElements, !inPage && getAll(elem, "script")); + } + + // Return the cloned set + return clone; + }, + + cleanData: function (elems) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for (; (elem = elems[i]) !== undefined; i++) { + if (acceptData(elem)) { + if ((data = elem[dataPriv.expando])) { + if (data.events) { + for (type in data.events) { + if (special[type]) { + jQuery.event.remove(elem, type); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent(elem, type, data.handle); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[dataPriv.expando] = undefined; + } + if (elem[dataUser.expando]) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[dataUser.expando] = undefined; + } + } + } + } + }); + + jQuery.fn.extend({ + detach: function (selector) { + return remove(this, selector, true); + }, + + remove: function (selector) { + return remove(this, selector); + }, + + text: function (value) { + return access(this, function (value) { + return value === undefined ? + jQuery.text(this) : + this.empty().each(function () { + if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) { + this.textContent = value; + } + }); + }, null, value, arguments.length); + }, + + append: function () { + return domManip(this, arguments, function (elem) { + if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) { + var target = manipulationTarget(this, elem); + target.appendChild(elem); + } + }); + }, + + prepend: function () { + return domManip(this, arguments, function (elem) { + if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) { + var target = manipulationTarget(this, elem); + target.insertBefore(elem, target.firstChild); + } + }); + }, + + before: function () { + return domManip(this, arguments, function (elem) { + if (this.parentNode) { + this.parentNode.insertBefore(elem, this); + } + }); + }, + + after: function () { + return domManip(this, arguments, function (elem) { + if (this.parentNode) { + this.parentNode.insertBefore(elem, this.nextSibling); + } + }); + }, + + empty: function () { + var elem, + i = 0; + + for (; (elem = this[i]) != null; i++) { + if (elem.nodeType === 1) { + + // Prevent memory leaks + jQuery.cleanData(getAll(elem, false)); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function (dataAndEvents, deepDataAndEvents) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map(function () { + return jQuery.clone(this, dataAndEvents, deepDataAndEvents); + }); + }, + + html: function (value) { + return access(this, function (value) { + var elem = this[0] || {}, + i = 0, + l = this.length; + + if (value === undefined && elem.nodeType === 1) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if (typeof value === "string" && !rnoInnerhtml.test(value) && + !wrapMap[(rtagName.exec(value) || ["", ""])[1].toLowerCase()]) { + + value = jQuery.htmlPrefilter(value); + + try { + for (; i < l; i++) { + elem = this[i] || {}; + + // Remove element nodes and prevent memory leaks + if (elem.nodeType === 1) { + jQuery.cleanData(getAll(elem, false)); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch (e) { + } + } + + if (elem) { + this.empty().append(value); + } + }, null, value, arguments.length); + }, + + replaceWith: function () { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip(this, arguments, function (elem) { + var parent = this.parentNode; + + if (jQuery.inArray(this, ignored) < 0) { + jQuery.cleanData(getAll(this)); + if (parent) { + parent.replaceChild(elem, this); + } + } + + // Force callback invocation + }, ignored); + } + }); + + jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" + }, function (name, original) { + jQuery.fn[name] = function (selector) { + var elems, + ret = [], + insert = jQuery(selector), + last = insert.length - 1, + i = 0; + + for (; i <= last; i++) { + elems = i === last ? this : this.clone(true); + jQuery(insert[i])[original](elems); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply(ret, elems.get()); + } + + return this.pushStack(ret); + }; + }); + var rnumnonpx = new RegExp("^(" + pnum + ")(?!px)[a-z%]+$", "i"); + + var getStyles = function (elem) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if (!view || !view.opener) { + view = window; + } + + return view.getComputedStyle(elem); + }; + + var rboxStyle = new RegExp(cssExpand.join("|"), "i"); + + + (function () { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if (!div) { + return; + } + + container.style.cssText = "position:absolute;left:-11111px;width:60px;" + + "margin-top:1px;padding:0;border:0"; + div.style.cssText = + "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + + "margin:auto;border:1px;padding:1px;" + + "width:60%;top:1%"; + documentElement.appendChild(container).appendChild(div); + + var divStyle = window.getComputedStyle(div); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = roundPixelMeasures(divStyle.marginLeft) === 12; + + // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 + // Some styles come back with percentage values, even though they shouldn't + div.style.right = "60%"; + pixelBoxStylesVal = roundPixelMeasures(divStyle.right) === 36; + + // Support: IE 9 - 11 only + // Detect misreporting of content dimensions for box-sizing:border-box elements + boxSizingReliableVal = roundPixelMeasures(divStyle.width) === 36; + + // Support: IE 9 only + // Detect overflow:scroll screwiness (gh-3699) + div.style.position = "absolute"; + scrollboxSizeVal = div.offsetWidth === 36 || "absolute"; + + documentElement.removeChild(container); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + function roundPixelMeasures(measure) { + return Math.round(parseFloat(measure)); + } + + var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, + reliableMarginLeftVal, + container = document.createElement("div"), + div = document.createElement("div"); + + // Finish early in limited (non-browser) environments + if (!div.style) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode(true).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + jQuery.extend(support, { + boxSizingReliable: function () { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelBoxStyles: function () { + computeStyleTests(); + return pixelBoxStylesVal; + }, + pixelPosition: function () { + computeStyleTests(); + return pixelPositionVal; + }, + reliableMarginLeft: function () { + computeStyleTests(); + return reliableMarginLeftVal; + }, + scrollboxSize: function () { + computeStyleTests(); + return scrollboxSizeVal; + } + }); + })(); + + + function curCSS(elem, name, computed) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles(elem); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if (computed) { + ret = computed.getPropertyValue(name) || computed[name]; + + if (ret === "" && !jQuery.contains(elem.ownerDocument, elem)) { + ret = jQuery.style(elem, name); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if (!support.pixelBoxStyles() && rnumnonpx.test(ret) && rboxStyle.test(name)) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; + } + + + function addGetHookIf(conditionFn, hookFn) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function () { + if (conditionFn()) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return (this.get = hookFn).apply(this, arguments); + } + }; + } + + + var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = {position: "absolute", visibility: "hidden", display: "block"}, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }, + + cssPrefixes = ["Webkit", "Moz", "ms"], + emptyStyle = document.createElement("div").style; + +// Return a css property mapped to a potentially vendor prefixed property + function vendorPropName(name) { + + // Shortcut for names that are not vendor prefixed + if (name in emptyStyle) { + return name; + } + + // Check for vendor prefixed names + var capName = name[0].toUpperCase() + name.slice(1), + i = cssPrefixes.length; + + while (i--) { + name = cssPrefixes[i] + capName; + if (name in emptyStyle) { + return name; + } + } + } + +// Return a property mapped along what jQuery.cssProps suggests or to +// a vendor prefixed property. + function finalPropName(name) { + var ret = jQuery.cssProps[name]; + if (!ret) { + ret = jQuery.cssProps[name] = vendorPropName(name) || name; + } + return ret; + } + + function setPositiveNumber(elem, value, subtract) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec(value); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max(0, matches[2] - (subtract || 0)) + (matches[3] || "px") : + value; + } + + function boxModelAdjustment(elem, dimension, box, isBorderBox, styles, computedVal) { + var i = dimension === "width" ? 1 : 0, + extra = 0, + delta = 0; + + // Adjustment may not be necessary + if (box === (isBorderBox ? "border" : "content")) { + return 0; + } + + for (; i < 4; i += 2) { + + // Both box models exclude margin + if (box === "margin") { + delta += jQuery.css(elem, box + cssExpand[i], true, styles); + } + + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if (!isBorderBox) { + + // Add padding + delta += jQuery.css(elem, "padding" + cssExpand[i], true, styles); + + // For "border" or "margin", add border + if (box !== "padding") { + delta += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles); + + // But still keep track of it otherwise + } else { + extra += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles); + } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" + } else { + + // For "content", subtract padding + if (box === "content") { + delta -= jQuery.css(elem, "padding" + cssExpand[i], true, styles); + } + + // For "content" or "padding", subtract border + if (box !== "margin") { + delta -= jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles); + } + } + } + + // Account for positive content-box scroll gutter when requested by providing computedVal + if (!isBorderBox && computedVal >= 0) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max(0, Math.ceil( + elem["offset" + dimension[0].toUpperCase() + dimension.slice(1)] - + computedVal - + delta - + extra - + 0.5 + )); + } + + return delta; + } + + function getWidthOrHeight(elem, dimension, extra) { + + // Start with computed style + var styles = getStyles(elem), + val = curCSS(elem, dimension, styles), + isBorderBox = jQuery.css(elem, "boxSizing", false, styles) === "border-box", + valueIsBorderBox = isBorderBox; + + // Support: Firefox <=54 + // Return a confounding non-pixel value or feign ignorance, as appropriate. + if (rnumnonpx.test(val)) { + if (!extra) { + return val; + } + val = "auto"; + } + + // Check for style in case a browser which returns unreliable values + // for getComputedStyle silently falls back to the reliable elem.style + valueIsBorderBox = valueIsBorderBox && + (support.boxSizingReliable() || val === elem.style[dimension]); + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + if (val === "auto" || + !parseFloat(val) && jQuery.css(elem, "display", false, styles) === "inline") { + + val = elem["offset" + dimension[0].toUpperCase() + dimension.slice(1)]; + + // offsetWidth/offsetHeight provide border-box values + valueIsBorderBox = true; + } + + // Normalize "" and auto + val = parseFloat(val) || 0; + + // Adjust for the element's box model + return (val + + boxModelAdjustment( + elem, + dimension, + extra || (isBorderBox ? "border" : "content"), + valueIsBorderBox, + styles, + + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val + ) + ) + "px"; + } + + jQuery.extend({ + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function (elem, computed) { + if (computed) { + + // We should always get a number back from opacity + var ret = curCSS(elem, "opacity"); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: {}, + + // Get and set the style property on a DOM Node + style: function (elem, name, value, extra) { + + // Don't set styles on text and comment nodes + if (!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = camelCase(name), + isCustomProp = rcustomProp.test(name), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if (!isCustomProp) { + name = finalPropName(origName); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName]; + + // Check if we're setting a value + if (value !== undefined) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if (type === "string" && (ret = rcssNum.exec(value)) && ret[1]) { + value = adjustCSS(elem, name, ret); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if (value == null || value !== value) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + if (type === "number") { + value += ret && ret[3] || (jQuery.cssNumber[origName] ? "" : "px"); + } + + // background-* props affect original clone's values + if (!support.clearCloneStyle && value === "" && name.indexOf("background") === 0) { + style[name] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if (!hooks || !("set" in hooks) || + (value = hooks.set(elem, value, extra)) !== undefined) { + + if (isCustomProp) { + style.setProperty(name, value); + } else { + style[name] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if (hooks && "get" in hooks && + (ret = hooks.get(elem, false, extra)) !== undefined) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[name]; + } + }, + + css: function (elem, name, extra, styles) { + var val, num, hooks, + origName = camelCase(name), + isCustomProp = rcustomProp.test(name); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if (!isCustomProp) { + name = finalPropName(origName); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName]; + + // If a hook was provided get the computed value from there + if (hooks && "get" in hooks) { + val = hooks.get(elem, true, extra); + } + + // Otherwise, if a way to get the computed value exists, use that + if (val === undefined) { + val = curCSS(elem, name, styles); + } + + // Convert "normal" to computed value + if (val === "normal" && name in cssNormalTransform) { + val = cssNormalTransform[name]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if (extra === "" || extra) { + num = parseFloat(val); + return extra === true || isFinite(num) ? num || 0 : val; + } + + return val; + } + }); + + jQuery.each(["height", "width"], function (i, dimension) { + jQuery.cssHooks[dimension] = { + get: function (elem, computed, extra) { + if (computed) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test(jQuery.css(elem, "display")) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + (!elem.getClientRects().length || !elem.getBoundingClientRect().width) ? + swap(elem, cssShow, function () { + return getWidthOrHeight(elem, dimension, extra); + }) : + getWidthOrHeight(elem, dimension, extra); + } + }, + + set: function (elem, value, extra) { + var matches, + styles = getStyles(elem), + isBorderBox = jQuery.css(elem, "boxSizing", false, styles) === "border-box", + subtract = extra && boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ); + + // Account for unreliable border-box dimensions by comparing offset* to computed and + // faking a content-box to get border and padding (gh-3699) + if (isBorderBox && support.scrollboxSize() === styles.position) { + subtract -= Math.ceil( + elem["offset" + dimension[0].toUpperCase() + dimension.slice(1)] - + parseFloat(styles[dimension]) - + boxModelAdjustment(elem, dimension, "border", false, styles) - + 0.5 + ); + } + + // Convert to pixels if value adjustment is needed + if (subtract && (matches = rcssNum.exec(value)) && + (matches[3] || "px") !== "px") { + + elem.style[dimension] = value; + value = jQuery.css(elem, dimension); + } + + return setPositiveNumber(elem, value, subtract); + } + }; + }); + + jQuery.cssHooks.marginLeft = addGetHookIf(support.reliableMarginLeft, + function (elem, computed) { + if (computed) { + return (parseFloat(curCSS(elem, "marginLeft")) || + elem.getBoundingClientRect().left - + swap(elem, {marginLeft: 0}, function () { + return elem.getBoundingClientRect().left; + }) + ) + "px"; + } + } + ); + +// These hooks are used by animate to expand properties + jQuery.each({ + margin: "", + padding: "", + border: "Width" + }, function (prefix, suffix) { + jQuery.cssHooks[prefix + suffix] = { + expand: function (value) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split(" ") : [value]; + + for (; i < 4; i++) { + expanded[prefix + cssExpand[i] + suffix] = + parts[i] || parts[i - 2] || parts[0]; + } + + return expanded; + } + }; + + if (prefix !== "margin") { + jQuery.cssHooks[prefix + suffix].set = setPositiveNumber; + } + }); + + jQuery.fn.extend({ + css: function (name, value) { + return access(this, function (elem, name, value) { + var styles, len, + map = {}, + i = 0; + + if (Array.isArray(name)) { + styles = getStyles(elem); + len = name.length; + + for (; i < len; i++) { + map[name[i]] = jQuery.css(elem, name[i], false, styles); + } + + return map; + } + + return value !== undefined ? + jQuery.style(elem, name, value) : + jQuery.css(elem, name); + }, name, value, arguments.length > 1); + } + }); + + + function Tween(elem, options, prop, end, easing) { + return new Tween.prototype.init(elem, options, prop, end, easing); + } + + jQuery.Tween = Tween; + + Tween.prototype = { + constructor: Tween, + init: function (elem, options, prop, end, easing, unit) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || (jQuery.cssNumber[prop] ? "" : "px"); + }, + cur: function () { + var hooks = Tween.propHooks[this.prop]; + + return hooks && hooks.get ? + hooks.get(this) : + Tween.propHooks._default.get(this); + }, + run: function (percent) { + var eased, + hooks = Tween.propHooks[this.prop]; + + if (this.options.duration) { + this.pos = eased = jQuery.easing[this.easing]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = (this.end - this.start) * eased + this.start; + + if (this.options.step) { + this.options.step.call(this.elem, this.now, this); + } + + if (hooks && hooks.set) { + hooks.set(this); + } else { + Tween.propHooks._default.set(this); + } + return this; + } + }; + + Tween.prototype.init.prototype = Tween.prototype; + + Tween.propHooks = { + _default: { + get: function (tween) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if (tween.elem.nodeType !== 1 || + tween.elem[tween.prop] != null && tween.elem.style[tween.prop] == null) { + return tween.elem[tween.prop]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css(tween.elem, tween.prop, ""); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function (tween) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if (jQuery.fx.step[tween.prop]) { + jQuery.fx.step[tween.prop](tween); + } else if (tween.elem.nodeType === 1 && + (tween.elem.style[jQuery.cssProps[tween.prop]] != null || + jQuery.cssHooks[tween.prop])) { + jQuery.style(tween.elem, tween.prop, tween.now + tween.unit); + } else { + tween.elem[tween.prop] = tween.now; + } + } + } + }; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes + Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function (tween) { + if (tween.elem.nodeType && tween.elem.parentNode) { + tween.elem[tween.prop] = tween.now; + } + } + }; + + jQuery.easing = { + linear: function (p) { + return p; + }, + swing: function (p) { + return 0.5 - Math.cos(p * Math.PI) / 2; + }, + _default: "swing" + }; + + jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point + jQuery.fx.step = {}; + + + var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + + function schedule() { + if (inProgress) { + if (document.hidden === false && window.requestAnimationFrame) { + window.requestAnimationFrame(schedule); + } else { + window.setTimeout(schedule, jQuery.fx.interval); + } + + jQuery.fx.tick(); + } + } + +// Animations created synchronously will run synchronously + function createFxNow() { + window.setTimeout(function () { + fxNow = undefined; + }); + return (fxNow = Date.now()); + } + +// Generate parameters to create a standard animation + function genFx(type, includeWidth) { + var which, + i = 0, + attrs = {height: type}; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for (; i < 4; i += 2 - includeWidth) { + which = cssExpand[i]; + attrs["margin" + which] = attrs["padding" + which] = type; + } + + if (includeWidth) { + attrs.opacity = attrs.width = type; + } + + return attrs; + } + + function createTween(value, prop, animation) { + var tween, + collection = (Animation.tweeners[prop] || []).concat(Animation.tweeners["*"]), + index = 0, + length = collection.length; + for (; index < length; index++) { + if ((tween = collection[index].call(animation, prop, value))) { + + // We're done with this property + return tween; + } + } + } + + function defaultPrefilter(elem, props, opts) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree(elem), + dataShow = dataPriv.get(elem, "fxshow"); + + // Queue-skipping animations hijack the fx hooks + if (!opts.queue) { + hooks = jQuery._queueHooks(elem, "fx"); + if (hooks.unqueued == null) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function () { + if (!hooks.unqueued) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always(function () { + + // Ensure the complete handler is called before this completes + anim.always(function () { + hooks.unqueued--; + if (!jQuery.queue(elem, "fx").length) { + hooks.empty.fire(); + } + }); + }); + } + + // Detect show/hide animations + for (prop in props) { + value = props[prop]; + if (rfxtypes.test(value)) { + delete props[prop]; + toggle = toggle || value === "toggle"; + if (value === (hidden ? "hide" : "show")) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if (value === "show" && dataShow && dataShow[prop] !== undefined) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[prop] = dataShow && dataShow[prop] || jQuery.style(elem, prop); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject(props); + if (!propTween && jQuery.isEmptyObject(orig)) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if (isBox && elem.nodeType === 1) { + + // Support: IE <=9 - 11, Edge 12 - 15 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY and Edge just mirrors + // the overflowX value there. + opts.overflow = [style.overflow, style.overflowX, style.overflowY]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if (restoreDisplay == null) { + restoreDisplay = dataPriv.get(elem, "display"); + } + display = jQuery.css(elem, "display"); + if (display === "none") { + if (restoreDisplay) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide([elem], true); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css(elem, "display"); + showHide([elem]); + } + } + + // Animate inline elements as inline-block + if (display === "inline" || display === "inline-block" && restoreDisplay != null) { + if (jQuery.css(elem, "float") === "none") { + + // Restore the original display value at the end of pure show/hide animations + if (!propTween) { + anim.done(function () { + style.display = restoreDisplay; + }); + if (restoreDisplay == null) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if (opts.overflow) { + style.overflow = "hidden"; + anim.always(function () { + style.overflow = opts.overflow[0]; + style.overflowX = opts.overflow[1]; + style.overflowY = opts.overflow[2]; + }); + } + + // Implement show/hide animations + propTween = false; + for (prop in orig) { + + // General show/hide setup for this element animation + if (!propTween) { + if (dataShow) { + if ("hidden" in dataShow) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access(elem, "fxshow", {display: restoreDisplay}); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if (toggle) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if (hidden) { + showHide([elem], true); + } + + /* eslint-disable no-loop-func */ + + anim.done(function () { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if (!hidden) { + showHide([elem]); + } + dataPriv.remove(elem, "fxshow"); + for (prop in orig) { + jQuery.style(elem, prop, orig[prop]); + } + }); + } + + // Per-property setup + propTween = createTween(hidden ? dataShow[prop] : 0, prop, anim); + if (!(prop in dataShow)) { + dataShow[prop] = propTween.start; + if (hidden) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } + } + + function propFilter(props, specialEasing) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for (index in props) { + name = camelCase(index); + easing = specialEasing[name]; + value = props[index]; + if (Array.isArray(value)) { + easing = value[1]; + value = props[index] = value[0]; + } + + if (index !== name) { + props[name] = value; + delete props[index]; + } + + hooks = jQuery.cssHooks[name]; + if (hooks && "expand" in hooks) { + value = hooks.expand(value); + delete props[name]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for (index in value) { + if (!(index in props)) { + props[index] = value[index]; + specialEasing[index] = easing; + } + } + } else { + specialEasing[name] = easing; + } + } + } + + function Animation(elem, properties, options) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always(function () { + + // Don't match elem in the :animated selector + delete tick.elem; + }), + tick = function () { + if (stopped) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max(0, animation.startTime + animation.duration - currentTime), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for (; index < length; index++) { + animation.tweens[index].run(percent); + } + + deferred.notifyWith(elem, [animation, percent, remaining]); + + // If there's more to do, yield + if (percent < 1 && length) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if (!length) { + deferred.notifyWith(elem, [animation, 1, 0]); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith(elem, [animation]); + return false; + }, + animation = deferred.promise({ + elem: elem, + props: jQuery.extend({}, properties), + opts: jQuery.extend(true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function (prop, end) { + var tween = jQuery.Tween(elem, animation.opts, prop, end, + animation.opts.specialEasing[prop] || animation.opts.easing); + animation.tweens.push(tween); + return tween; + }, + stop: function (gotoEnd) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if (stopped) { + return this; + } + stopped = true; + for (; index < length; index++) { + animation.tweens[index].run(1); + } + + // Resolve when we played the last frame; otherwise, reject + if (gotoEnd) { + deferred.notifyWith(elem, [animation, 1, 0]); + deferred.resolveWith(elem, [animation, gotoEnd]); + } else { + deferred.rejectWith(elem, [animation, gotoEnd]); + } + return this; + } + }), + props = animation.props; + + propFilter(props, animation.opts.specialEasing); + + for (; index < length; index++) { + result = Animation.prefilters[index].call(animation, elem, props, animation.opts); + if (result) { + if (isFunction(result.stop)) { + jQuery._queueHooks(animation.elem, animation.opts.queue).stop = + result.stop.bind(result); + } + return result; + } + } + + jQuery.map(props, createTween, animation); + + if (isFunction(animation.opts.start)) { + animation.opts.start.call(elem, animation); + } + + // Attach callbacks from options + animation + .progress(animation.opts.progress) + .done(animation.opts.done, animation.opts.complete) + .fail(animation.opts.fail) + .always(animation.opts.always); + + jQuery.fx.timer( + jQuery.extend(tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + }) + ); + + return animation; + } + + jQuery.Animation = jQuery.extend(Animation, { + + tweeners: { + "*": [function (prop, value) { + var tween = this.createTween(prop, value); + adjustCSS(tween.elem, prop, rcssNum.exec(value), tween); + return tween; + }] + }, + + tweener: function (props, callback) { + if (isFunction(props)) { + callback = props; + props = ["*"]; + } else { + props = props.match(rnothtmlwhite); + } + + var prop, + index = 0, + length = props.length; + + for (; index < length; index++) { + prop = props[index]; + Animation.tweeners[prop] = Animation.tweeners[prop] || []; + Animation.tweeners[prop].unshift(callback); + } + }, + + prefilters: [defaultPrefilter], + + prefilter: function (callback, prepend) { + if (prepend) { + Animation.prefilters.unshift(callback); + } else { + Animation.prefilters.push(callback); + } + } + }); + + jQuery.speed = function (speed, easing, fn) { + var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : { + complete: fn || !fn && easing || + isFunction(speed) && speed, + duration: speed, + easing: fn && easing || easing && !isFunction(easing) && easing + }; + + // Go to the end state if fx are off + if (jQuery.fx.off) { + opt.duration = 0; + + } else { + if (typeof opt.duration !== "number") { + if (opt.duration in jQuery.fx.speeds) { + opt.duration = jQuery.fx.speeds[opt.duration]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if (opt.queue == null || opt.queue === true) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function () { + if (isFunction(opt.old)) { + opt.old.call(this); + } + + if (opt.queue) { + jQuery.dequeue(this, opt.queue); + } + }; + + return opt; + }; + + jQuery.fn.extend({ + fadeTo: function (speed, to, easing, callback) { + + // Show any hidden elements after setting opacity to 0 + return this.filter(isHiddenWithinTree).css("opacity", 0).show() + + // Animate to the value specified + .end().animate({opacity: to}, speed, easing, callback); + }, + animate: function (prop, speed, easing, callback) { + var empty = jQuery.isEmptyObject(prop), + optall = jQuery.speed(speed, easing, callback), + doAnimation = function () { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation(this, jQuery.extend({}, prop), optall); + + // Empty animations, or finishing resolves immediately + if (empty || dataPriv.get(this, "finish")) { + anim.stop(true); + } + }; + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each(doAnimation) : + this.queue(optall.queue, doAnimation); + }, + stop: function (type, clearQueue, gotoEnd) { + var stopQueue = function (hooks) { + var stop = hooks.stop; + delete hooks.stop; + stop(gotoEnd); + }; + + if (typeof type !== "string") { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if (clearQueue && type !== false) { + this.queue(type || "fx", []); + } + + return this.each(function () { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get(this); + + if (index) { + if (data[index] && data[index].stop) { + stopQueue(data[index]); + } + } else { + for (index in data) { + if (data[index] && data[index].stop && rrun.test(index)) { + stopQueue(data[index]); + } + } + } + + for (index = timers.length; index--;) { + if (timers[index].elem === this && + (type == null || timers[index].queue === type)) { + + timers[index].anim.stop(gotoEnd); + dequeue = false; + timers.splice(index, 1); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if (dequeue || !gotoEnd) { + jQuery.dequeue(this, type); + } + }); + }, + finish: function (type) { + if (type !== false) { + type = type || "fx"; + } + return this.each(function () { + var index, + data = dataPriv.get(this), + queue = data[type + "queue"], + hooks = data[type + "queueHooks"], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue(this, type, []); + + if (hooks && hooks.stop) { + hooks.stop.call(this, true); + } + + // Look for any active animations, and finish them + for (index = timers.length; index--;) { + if (timers[index].elem === this && timers[index].queue === type) { + timers[index].anim.stop(true); + timers.splice(index, 1); + } + } + + // Look for any animations in the old queue and finish them + for (index = 0; index < length; index++) { + if (queue[index] && queue[index].finish) { + queue[index].finish.call(this); + } + } + + // Turn off finishing flag + delete data.finish; + }); + } + }); + + jQuery.each(["toggle", "show", "hide"], function (i, name) { + var cssFn = jQuery.fn[name]; + jQuery.fn[name] = function (speed, easing, callback) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply(this, arguments) : + this.animate(genFx(name, true), speed, easing, callback); + }; + }); + +// Generate shortcuts for custom animations + jQuery.each({ + slideDown: genFx("show"), + slideUp: genFx("hide"), + slideToggle: genFx("toggle"), + fadeIn: {opacity: "show"}, + fadeOut: {opacity: "hide"}, + fadeToggle: {opacity: "toggle"} + }, function (name, props) { + jQuery.fn[name] = function (speed, easing, callback) { + return this.animate(props, speed, easing, callback); + }; + }); + + jQuery.timers = []; + jQuery.fx.tick = function () { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = Date.now(); + + for (; i < timers.length; i++) { + timer = timers[i]; + + // Run the timer and safely remove it when done (allowing for external removal) + if (!timer() && timers[i] === timer) { + timers.splice(i--, 1); + } + } + + if (!timers.length) { + jQuery.fx.stop(); + } + fxNow = undefined; + }; + + jQuery.fx.timer = function (timer) { + jQuery.timers.push(timer); + jQuery.fx.start(); + }; + + jQuery.fx.interval = 13; + jQuery.fx.start = function () { + if (inProgress) { + return; + } + + inProgress = true; + schedule(); + }; + + jQuery.fx.stop = function () { + inProgress = null; + }; + + jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 + }; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ + jQuery.fn.delay = function (time, type) { + time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; + type = type || "fx"; + + return this.queue(type, function (next, hooks) { + var timeout = window.setTimeout(next, time); + hooks.stop = function () { + window.clearTimeout(timeout); + }; + }); + }; + + + (function () { + var input = document.createElement("input"), + select = document.createElement("select"), + opt = select.appendChild(document.createElement("option")); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement("input"); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; + })(); + + + var boolHook, + attrHandle = jQuery.expr.attrHandle; + + jQuery.fn.extend({ + attr: function (name, value) { + return access(this, jQuery.attr, name, value, arguments.length > 1); + }, + + removeAttr: function (name) { + return this.each(function () { + jQuery.removeAttr(this, name); + }); + } + }); + + jQuery.extend({ + attr: function (elem, name, value) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if (nType === 3 || nType === 8 || nType === 2) { + return; + } + + // Fallback to prop when attributes are not supported + if (typeof elem.getAttribute === "undefined") { + return jQuery.prop(elem, name, value); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if (nType !== 1 || !jQuery.isXMLDoc(elem)) { + hooks = jQuery.attrHooks[name.toLowerCase()] || + (jQuery.expr.match.bool.test(name) ? boolHook : undefined); + } + + if (value !== undefined) { + if (value === null) { + jQuery.removeAttr(elem, name); + return; + } + + if (hooks && "set" in hooks && + (ret = hooks.set(elem, value, name)) !== undefined) { + return ret; + } + + elem.setAttribute(name, value + ""); + return value; + } + + if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) { + return ret; + } + + ret = jQuery.find.attr(elem, name); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function (elem, value) { + if (!support.radioValue && value === "radio" && + nodeName(elem, "input")) { + var val = elem.value; + elem.setAttribute("type", value); + if (val) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function (elem, value) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match(rnothtmlwhite); + + if (attrNames && elem.nodeType === 1) { + while ((name = attrNames[i++])) { + elem.removeAttribute(name); + } + } + } + }); + +// Hooks for boolean attributes + boolHook = { + set: function (elem, value, name) { + if (value === false) { + + // Remove boolean attributes when set to false + jQuery.removeAttr(elem, name); + } else { + elem.setAttribute(name, name); + } + return name; + } + }; + + jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g), function (i, name) { + var getter = attrHandle[name] || jQuery.find.attr; + + attrHandle[name] = function (elem, name, isXML) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if (!isXML) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[lowercaseName]; + attrHandle[lowercaseName] = ret; + ret = getter(elem, name, isXML) != null ? + lowercaseName : + null; + attrHandle[lowercaseName] = handle; + } + return ret; + }; + }); + + + var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + + jQuery.fn.extend({ + prop: function (name, value) { + return access(this, jQuery.prop, name, value, arguments.length > 1); + }, + + removeProp: function (name) { + return this.each(function () { + delete this[jQuery.propFix[name] || name]; + }); + } + }); + + jQuery.extend({ + prop: function (elem, name, value) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if (nType === 3 || nType === 8 || nType === 2) { + return; + } + + if (nType !== 1 || !jQuery.isXMLDoc(elem)) { + + // Fix name and attach hooks + name = jQuery.propFix[name] || name; + hooks = jQuery.propHooks[name]; + } + + if (value !== undefined) { + if (hooks && "set" in hooks && + (ret = hooks.set(elem, value, name)) !== undefined) { + return ret; + } + + return (elem[name] = value); + } + + if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) { + return ret; + } + + return elem[name]; + }, + + propHooks: { + tabIndex: { + get: function (elem) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr(elem, "tabindex"); + + if (tabindex) { + return parseInt(tabindex, 10); + } + + if ( + rfocusable.test(elem.nodeName) || + rclickable.test(elem.nodeName) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } + }); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop + if (!support.optSelected) { + jQuery.propHooks.selected = { + get: function (elem) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if (parent && parent.parentNode) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function (elem) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if (parent) { + parent.selectedIndex; + + if (parent.parentNode) { + parent.parentNode.selectedIndex; + } + } + } + }; + } + + jQuery.each([ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" + ], function () { + jQuery.propFix[this.toLowerCase()] = this; + }); + + + // Strip and collapse whitespace according to HTML spec + // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace + function stripAndCollapse(value) { + var tokens = value.match(rnothtmlwhite) || []; + return tokens.join(" "); + } + + + function getClass(elem) { + return elem.getAttribute && elem.getAttribute("class") || ""; + } + + function classesToArray(value) { + if (Array.isArray(value)) { + return value; + } + if (typeof value === "string") { + return value.match(rnothtmlwhite) || []; + } + return []; + } + + jQuery.fn.extend({ + addClass: function (value) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if (isFunction(value)) { + return this.each(function (j) { + jQuery(this).addClass(value.call(this, j, getClass(this))); + }); + } + + classes = classesToArray(value); + + if (classes.length) { + while ((elem = this[i++])) { + curValue = getClass(elem); + cur = elem.nodeType === 1 && (" " + stripAndCollapse(curValue) + " "); + + if (cur) { + j = 0; + while ((clazz = classes[j++])) { + if (cur.indexOf(" " + clazz + " ") < 0) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse(cur); + if (curValue !== finalValue) { + elem.setAttribute("class", finalValue); + } + } + } + } + + return this; + }, + + removeClass: function (value) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if (isFunction(value)) { + return this.each(function (j) { + jQuery(this).removeClass(value.call(this, j, getClass(this))); + }); + } + + if (!arguments.length) { + return this.attr("class", ""); + } + + classes = classesToArray(value); + + if (classes.length) { + while ((elem = this[i++])) { + curValue = getClass(elem); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && (" " + stripAndCollapse(curValue) + " "); + + if (cur) { + j = 0; + while ((clazz = classes[j++])) { + + // Remove *all* instances + while (cur.indexOf(" " + clazz + " ") > -1) { + cur = cur.replace(" " + clazz + " ", " "); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse(cur); + if (curValue !== finalValue) { + elem.setAttribute("class", finalValue); + } + } + } + } + + return this; + }, + + toggleClass: function (value, stateVal) { + var type = typeof value, + isValidValue = type === "string" || Array.isArray(value); + + if (typeof stateVal === "boolean" && isValidValue) { + return stateVal ? this.addClass(value) : this.removeClass(value); + } + + if (isFunction(value)) { + return this.each(function (i) { + jQuery(this).toggleClass( + value.call(this, i, getClass(this), stateVal), + stateVal + ); + }); + } + + return this.each(function () { + var className, i, self, classNames; + + if (isValidValue) { + + // Toggle individual class names + i = 0; + self = jQuery(this); + classNames = classesToArray(value); + + while ((className = classNames[i++])) { + + // Check each className given, space separated list + if (self.hasClass(className)) { + self.removeClass(className); + } else { + self.addClass(className); + } + } + + // Toggle whole class name + } else if (value === undefined || type === "boolean") { + className = getClass(this); + if (className) { + + // Store className if set + dataPriv.set(this, "__className__", className); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if (this.setAttribute) { + this.setAttribute("class", + className || value === false ? + "" : + dataPriv.get(this, "__className__") || "" + ); + } + } + }); + }, + + hasClass: function (selector) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ((elem = this[i++])) { + if (elem.nodeType === 1 && + (" " + stripAndCollapse(getClass(elem)) + " ").indexOf(className) > -1) { + return true; + } + } + + return false; + } + }); + + + var rreturn = /\r/g; + + jQuery.fn.extend({ + val: function (value) { + var hooks, ret, valueIsFunction, + elem = this[0]; + + if (!arguments.length) { + if (elem) { + hooks = jQuery.valHooks[elem.type] || + jQuery.valHooks[elem.nodeName.toLowerCase()]; + + if (hooks && + "get" in hooks && + (ret = hooks.get(elem, "value")) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if (typeof ret === "string") { + return ret.replace(rreturn, ""); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + valueIsFunction = isFunction(value); + + return this.each(function (i) { + var val; + + if (this.nodeType !== 1) { + return; + } + + if (valueIsFunction) { + val = value.call(this, i, jQuery(this).val()); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if (val == null) { + val = ""; + + } else if (typeof val === "number") { + val += ""; + + } else if (Array.isArray(val)) { + val = jQuery.map(val, function (value) { + return value == null ? "" : value + ""; + }); + } + + hooks = jQuery.valHooks[this.type] || jQuery.valHooks[this.nodeName.toLowerCase()]; + + // If set returns undefined, fall back to normal setting + if (!hooks || !("set" in hooks) || hooks.set(this, val, "value") === undefined) { + this.value = val; + } + }); + } + }); + + jQuery.extend({ + valHooks: { + option: { + get: function (elem) { + + var val = jQuery.find.attr(elem, "value"); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse(jQuery.text(elem)); + } + }, + select: { + get: function (elem) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if (index < 0) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for (; i < max; i++) { + option = options[i]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ((option.selected || i === index) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + (!option.parentNode.disabled || + !nodeName(option.parentNode, "optgroup"))) { + + // Get the specific value for the option + value = jQuery(option).val(); + + // We don't need an array for one selects + if (one) { + return value; + } + + // Multi-Selects return an array + values.push(value); + } + } + + return values; + }, + + set: function (elem, value) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray(value), + i = options.length; + + while (i--) { + option = options[i]; + + /* eslint-disable no-cond-assign */ + + if (option.selected = + jQuery.inArray(jQuery.valHooks.option.get(option), values) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if (!optionSet) { + elem.selectedIndex = -1; + } + return values; + } + } + } + }); + +// Radios and checkboxes getter/setter + jQuery.each(["radio", "checkbox"], function () { + jQuery.valHooks[this] = { + set: function (elem, value) { + if (Array.isArray(value)) { + return (elem.checked = jQuery.inArray(jQuery(elem).val(), value) > -1); + } + } + }; + if (!support.checkOn) { + jQuery.valHooks[this].get = function (elem) { + return elem.getAttribute("value") === null ? "on" : elem.value; + }; + } + }); + + +// Return jQuery for attributes-only inclusion + + + support.focusin = "onfocusin" in window; + + + var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + stopPropagationCallback = function (e) { + e.stopPropagation(); + }; + + jQuery.extend(jQuery.event, { + + trigger: function (event, data, elem, onlyHandlers) { + + var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, + eventPath = [elem || document], + type = hasOwn.call(event, "type") ? event.type : event, + namespaces = hasOwn.call(event, "namespace") ? event.namespace.split(".") : []; + + cur = lastElement = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if (elem.nodeType === 3 || elem.nodeType === 8) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if (rfocusMorph.test(type + jQuery.event.triggered)) { + return; + } + + if (type.indexOf(".") > -1) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf(":") < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[jQuery.expando] ? + event : + new jQuery.Event(type, typeof event === "object" && event); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join("."); + event.rnamespace = event.namespace ? + new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if (!event.target) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [event] : + jQuery.makeArray(data, [event]); + + // Allow special events to draw outside the lines + special = jQuery.event.special[type] || {}; + if (!onlyHandlers && special.trigger && special.trigger.apply(elem, data) === false) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if (!onlyHandlers && !special.noBubble && !isWindow(elem)) { + + bubbleType = special.delegateType || type; + if (!rfocusMorph.test(bubbleType + type)) { + cur = cur.parentNode; + } + for (; cur; cur = cur.parentNode) { + eventPath.push(cur); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if (tmp === (elem.ownerDocument || document)) { + eventPath.push(tmp.defaultView || tmp.parentWindow || window); + } + } + + // Fire handlers on the event path + i = 0; + while ((cur = eventPath[i++]) && !event.isPropagationStopped()) { + lastElement = cur; + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = (dataPriv.get(cur, "events") || {})[event.type] && + dataPriv.get(cur, "handle"); + if (handle) { + handle.apply(cur, data); + } + + // Native handler + handle = ontype && cur[ontype]; + if (handle && handle.apply && acceptData(cur)) { + event.result = handle.apply(cur, data); + if (event.result === false) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if (!onlyHandlers && !event.isDefaultPrevented()) { + + if ((!special._default || + special._default.apply(eventPath.pop(), data) === false) && + acceptData(elem)) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if (ontype && isFunction(elem[type]) && !isWindow(elem)) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ontype]; + + if (tmp) { + elem[ontype] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + + if (event.isPropagationStopped()) { + lastElement.addEventListener(type, stopPropagationCallback); + } + + elem[type](); + + if (event.isPropagationStopped()) { + lastElement.removeEventListener(type, stopPropagationCallback); + } + + jQuery.event.triggered = undefined; + + if (tmp) { + elem[ontype] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function (type, elem, event) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger(e, null, elem); + } + + }); + + jQuery.fn.extend({ + + trigger: function (type, data) { + return this.each(function () { + jQuery.event.trigger(type, data, this); + }); + }, + triggerHandler: function (type, data) { + var elem = this[0]; + if (elem) { + return jQuery.event.trigger(type, data, elem, true); + } + } + }); + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 + if (!support.focusin) { + jQuery.each({focus: "focusin", blur: "focusout"}, function (orig, fix) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function (event) { + jQuery.event.simulate(fix, event.target, jQuery.event.fix(event)); + }; + + jQuery.event.special[fix] = { + setup: function () { + var doc = this.ownerDocument || this, + attaches = dataPriv.access(doc, fix); + + if (!attaches) { + doc.addEventListener(orig, handler, true); + } + dataPriv.access(doc, fix, (attaches || 0) + 1); + }, + teardown: function () { + var doc = this.ownerDocument || this, + attaches = dataPriv.access(doc, fix) - 1; + + if (!attaches) { + doc.removeEventListener(orig, handler, true); + dataPriv.remove(doc, fix); + + } else { + dataPriv.access(doc, fix, attaches); + } + } + }; + }); + } + var location = window.location; + + var nonce = Date.now(); + + var rquery = (/\?/); + + +// Cross-browser xml parsing + jQuery.parseXML = function (data) { + var xml; + if (!data || typeof data !== "string") { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = (new window.DOMParser()).parseFromString(data, "text/xml"); + } catch (e) { + xml = undefined; + } + + if (!xml || xml.getElementsByTagName("parsererror").length) { + jQuery.error("Invalid XML: " + data); + } + return xml; + }; + + + var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + + function buildParams(prefix, obj, traditional, add) { + var name; + + if (Array.isArray(obj)) { + + // Serialize array item. + jQuery.each(obj, function (i, v) { + if (traditional || rbracket.test(prefix)) { + + // Treat each array item as a scalar. + add(prefix, v); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + (typeof v === "object" && v != null ? i : "") + "]", + v, + traditional, + add + ); + } + }); + + } else if (!traditional && toType(obj) === "object") { + + // Serialize object item. + for (name in obj) { + buildParams(prefix + "[" + name + "]", obj[name], traditional, add); + } + + } else { + + // Serialize scalar item. + add(prefix, obj); + } + } + +// Serialize an array of form elements or a set of +// key/values into a query string + jQuery.param = function (a, traditional) { + var prefix, + s = [], + add = function (key, valueOrFunction) { + + // If value is a function, invoke it and use its return value + var value = isFunction(valueOrFunction) ? + valueOrFunction() : + valueOrFunction; + + s[s.length] = encodeURIComponent(key) + "=" + + encodeURIComponent(value == null ? "" : value); + }; + + // If an array was passed in, assume that it is an array of form elements. + if (Array.isArray(a) || (a.jquery && !jQuery.isPlainObject(a))) { + + // Serialize the form elements + jQuery.each(a, function () { + add(this.name, this.value); + }); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for (prefix in a) { + buildParams(prefix, a[prefix], traditional, add); + } + } + + // Return the resulting serialization + return s.join("&"); + }; + + jQuery.fn.extend({ + serialize: function () { + return jQuery.param(this.serializeArray()); + }, + serializeArray: function () { + return this.map(function () { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop(this, "elements"); + return elements ? jQuery.makeArray(elements) : this; + }) + .filter(function () { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery(this).is(":disabled") && + rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(type) && + (this.checked || !rcheckableType.test(type)); + }) + .map(function (i, elem) { + var val = jQuery(this).val(); + + if (val == null) { + return null; + } + + if (Array.isArray(val)) { + return jQuery.map(val, function (val) { + return {name: elem.name, value: val.replace(rCRLF, "\r\n")}; + }); + } + + return {name: elem.name, value: val.replace(rCRLF, "\r\n")}; + }).get(); + } + }); + + + var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat("*"), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement("a"); + originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport + function addToPrefiltersOrTransports(structure) { + + // dataTypeExpression is optional and defaults to "*" + return function (dataTypeExpression, func) { + + if (typeof dataTypeExpression !== "string") { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match(rnothtmlwhite) || []; + + if (isFunction(func)) { + + // For each dataType in the dataTypeExpression + while ((dataType = dataTypes[i++])) { + + // Prepend if requested + if (dataType[0] === "+") { + dataType = dataType.slice(1) || "*"; + (structure[dataType] = structure[dataType] || []).unshift(func); + + // Otherwise append + } else { + (structure[dataType] = structure[dataType] || []).push(func); + } + } + } + }; + } + +// Base inspection function for prefilters and transports + function inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR) { + + var inspected = {}, + seekingTransport = (structure === transports); + + function inspect(dataType) { + var selected; + inspected[dataType] = true; + jQuery.each(structure[dataType] || [], function (_, prefilterOrFactory) { + var dataTypeOrTransport = prefilterOrFactory(options, originalOptions, jqXHR); + if (typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[dataTypeOrTransport]) { + + options.dataTypes.unshift(dataTypeOrTransport); + inspect(dataTypeOrTransport); + return false; + } else if (seekingTransport) { + return !(selected = dataTypeOrTransport); + } + }); + return selected; + } + + return inspect(options.dataTypes[0]) || !inspected["*"] && inspect("*"); + } + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 + function ajaxExtend(target, src) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for (key in src) { + if (src[key] !== undefined) { + (flatOptions[key] ? target : (deep || (deep = {})))[key] = src[key]; + } + } + if (deep) { + jQuery.extend(true, target, deep); + } + + return target; + } + + /* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ + function ajaxHandleResponses(s, jqXHR, responses) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while (dataTypes[0] === "*") { + dataTypes.shift(); + if (ct === undefined) { + ct = s.mimeType || jqXHR.getResponseHeader("Content-Type"); + } + } + + // Check if we're dealing with a known content-type + if (ct) { + for (type in contents) { + if (contents[type] && contents[type].test(ct)) { + dataTypes.unshift(type); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if (dataTypes[0] in responses) { + finalDataType = dataTypes[0]; + } else { + + // Try convertible dataTypes + for (type in responses) { + if (!dataTypes[0] || s.converters[type + " " + dataTypes[0]]) { + finalDataType = type; + break; + } + if (!firstDataType) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if (finalDataType) { + if (finalDataType !== dataTypes[0]) { + dataTypes.unshift(finalDataType); + } + return responses[finalDataType]; + } + } + + /* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ + function ajaxConvert(s, response, jqXHR, isSuccess) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if (dataTypes[1]) { + for (conv in s.converters) { + converters[conv.toLowerCase()] = s.converters[conv]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while (current) { + + if (s.responseFields[current]) { + jqXHR[s.responseFields[current]] = response; + } + + // Apply the dataFilter if provided + if (!prev && isSuccess && s.dataFilter) { + response = s.dataFilter(response, s.dataType); + } + + prev = current; + current = dataTypes.shift(); + + if (current) { + + // There's only work to do if current dataType is non-auto + if (current === "*") { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if (prev !== "*" && prev !== current) { + + // Seek a direct converter + conv = converters[prev + " " + current] || converters["* " + current]; + + // If none found, seek a pair + if (!conv) { + for (conv2 in converters) { + + // If conv2 outputs current + tmp = conv2.split(" "); + if (tmp[1] === current) { + + // If prev can be converted to accepted input + conv = converters[prev + " " + tmp[0]] || + converters["* " + tmp[0]]; + if (conv) { + + // Condense equivalence converters + if (conv === true) { + conv = converters[conv2]; + + // Otherwise, insert the intermediate dataType + } else if (converters[conv2] !== true) { + current = tmp[0]; + dataTypes.unshift(tmp[1]); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if (conv !== true) { + + // Unless errors are allowed to bubble, catch and return them + if (conv && s.throws) { + response = conv(response); + } else { + try { + response = conv(response); + } catch (e) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return {state: "success", data: response}; + } + + jQuery.extend({ + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test(location.protocol), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function (target, settings) { + return settings ? + + // Building a settings object + ajaxExtend(ajaxExtend(target, jQuery.ajaxSettings), settings) : + + // Extending ajaxSettings + ajaxExtend(jQuery.ajaxSettings, target); + }, + + ajaxPrefilter: addToPrefiltersOrTransports(prefilters), + ajaxTransport: addToPrefiltersOrTransports(transports), + + // Main method + ajax: function (url, options) { + + // If url is an object, simulate pre-1.5 signature + if (typeof url === "object") { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup({}, options), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + (callbackContext.nodeType || callbackContext.jquery) ? + jQuery(callbackContext) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks("once memory"), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function (key) { + var match; + if (completed) { + if (!responseHeaders) { + responseHeaders = {}; + while ((match = rheaders.exec(responseHeadersString))) { + responseHeaders[match[1].toLowerCase()] = match[2]; + } + } + match = responseHeaders[key.toLowerCase()]; + } + return match == null ? null : match; + }, + + // Raw string + getAllResponseHeaders: function () { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function (name, value) { + if (completed == null) { + name = requestHeadersNames[name.toLowerCase()] = + requestHeadersNames[name.toLowerCase()] || name; + requestHeaders[name] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function (type) { + if (completed == null) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function (map) { + var code; + if (map) { + if (completed) { + + // Execute the appropriate callbacks + jqXHR.always(map[jqXHR.status]); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for (code in map) { + statusCode[code] = [statusCode[code], map[code]]; + } + } + } + return this; + }, + + // Cancel the request + abort: function (statusText) { + var finalText = statusText || strAbort; + if (transport) { + transport.abort(finalText); + } + done(0, finalText); + return this; + } + }; + + // Attach deferreds + deferred.promise(jqXHR); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ((url || s.url || location.href) + "") + .replace(rprotocol, location.protocol + "//"); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = (s.dataType || "*").toLowerCase().match(rnothtmlwhite) || [""]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if (s.crossDomain == null) { + urlAnchor = document.createElement("a"); + + // Support: IE <=8 - 11, Edge 12 - 15 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch (e) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if (s.data && s.processData && typeof s.data !== "string") { + s.data = jQuery.param(s.data, s.traditional); + } + + // Apply prefilters + inspectPrefiltersOrTransports(prefilters, s, options, jqXHR); + + // If request was aborted inside a prefilter, stop there + if (completed) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if (fireGlobals && jQuery.active++ === 0) { + jQuery.event.trigger("ajaxStart"); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test(s.type); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace(rhash, ""); + + // More options handling for requests with no content + if (!s.hasContent) { + + // Remember the hash so we can put it back + uncached = s.url.slice(cacheURL.length); + + // If data is available and should be processed, append data to url + if (s.data && (s.processData || typeof s.data === "string")) { + cacheURL += (rquery.test(cacheURL) ? "&" : "?") + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if (s.cache === false) { + cacheURL = cacheURL.replace(rantiCache, "$1"); + uncached = (rquery.test(cacheURL) ? "&" : "?") + "_=" + (nonce++) + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if (s.data && s.processData && + (s.contentType || "").indexOf("application/x-www-form-urlencoded") === 0) { + s.data = s.data.replace(r20, "+"); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if (s.ifModified) { + if (jQuery.lastModified[cacheURL]) { + jqXHR.setRequestHeader("If-Modified-Since", jQuery.lastModified[cacheURL]); + } + if (jQuery.etag[cacheURL]) { + jqXHR.setRequestHeader("If-None-Match", jQuery.etag[cacheURL]); + } + } + + // Set the correct header, if data is being sent + if (s.data && s.hasContent && s.contentType !== false || options.contentType) { + jqXHR.setRequestHeader("Content-Type", s.contentType); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[0] && s.accepts[s.dataTypes[0]] ? + s.accepts[s.dataTypes[0]] + + (s.dataTypes[0] !== "*" ? ", " + allTypes + "; q=0.01" : "") : + s.accepts["*"] + ); + + // Check for headers option + for (i in s.headers) { + jqXHR.setRequestHeader(i, s.headers[i]); + } + + // Allow custom headers/mimetypes and early abort + if (s.beforeSend && + (s.beforeSend.call(callbackContext, jqXHR, s) === false || completed)) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add(s.complete); + jqXHR.done(s.success); + jqXHR.fail(s.error); + + // Get transport + transport = inspectPrefiltersOrTransports(transports, s, options, jqXHR); + + // If no transport, we auto-abort + if (!transport) { + done(-1, "No Transport"); + } else { + jqXHR.readyState = 1; + + // Send global event + if (fireGlobals) { + globalEventContext.trigger("ajaxSend", [jqXHR, s]); + } + + // If request was aborted inside ajaxSend, stop there + if (completed) { + return jqXHR; + } + + // Timeout + if (s.async && s.timeout > 0) { + timeoutTimer = window.setTimeout(function () { + jqXHR.abort("timeout"); + }, s.timeout); + } + + try { + completed = false; + transport.send(requestHeaders, done); + } catch (e) { + + // Rethrow post-completion exceptions + if (completed) { + throw e; + } + + // Propagate others as results + done(-1, e); + } + } + + // Callback for when everything is done + function done(status, nativeStatusText, responses, headers) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if (completed) { + return; + } + + completed = true; + + // Clear timeout if it exists + if (timeoutTimer) { + window.clearTimeout(timeoutTimer); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if (responses) { + response = ajaxHandleResponses(s, jqXHR, responses); + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert(s, response, jqXHR, isSuccess); + + // If successful, handle type chaining + if (isSuccess) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if (s.ifModified) { + modified = jqXHR.getResponseHeader("Last-Modified"); + if (modified) { + jQuery.lastModified[cacheURL] = modified; + } + modified = jqXHR.getResponseHeader("etag"); + if (modified) { + jQuery.etag[cacheURL] = modified; + } + } + + // if no content + if (status === 204 || s.type === "HEAD") { + statusText = "nocontent"; + + // if not modified + } else if (status === 304) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if (status || !statusText) { + statusText = "error"; + if (status < 0) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = (nativeStatusText || statusText) + ""; + + // Success/Error + if (isSuccess) { + deferred.resolveWith(callbackContext, [success, statusText, jqXHR]); + } else { + deferred.rejectWith(callbackContext, [jqXHR, statusText, error]); + } + + // Status-dependent callbacks + jqXHR.statusCode(statusCode); + statusCode = undefined; + + if (fireGlobals) { + globalEventContext.trigger(isSuccess ? "ajaxSuccess" : "ajaxError", + [jqXHR, s, isSuccess ? success : error]); + } + + // Complete + completeDeferred.fireWith(callbackContext, [jqXHR, statusText]); + + if (fireGlobals) { + globalEventContext.trigger("ajaxComplete", [jqXHR, s]); + + // Handle the global AJAX counter + if (!(--jQuery.active)) { + jQuery.event.trigger("ajaxStop"); + } + } + } + + return jqXHR; + }, + + getJSON: function (url, data, callback) { + return jQuery.get(url, data, callback, "json"); + }, + + getScript: function (url, callback) { + return jQuery.get(url, undefined, callback, "script"); + } + }); + + jQuery.each(["get", "post"], function (i, method) { + jQuery[method] = function (url, data, callback, type) { + + // Shift arguments if data argument was omitted + if (isFunction(data)) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax(jQuery.extend({ + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject(url) && url)); + }; + }); + + + jQuery._evalUrl = function (url) { + return jQuery.ajax({ + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + "throws": true + }); + }; + + + jQuery.fn.extend({ + wrapAll: function (html) { + var wrap; + + if (this[0]) { + if (isFunction(html)) { + html = html.call(this[0]); + } + + // The elements to wrap the target around + wrap = jQuery(html, this[0].ownerDocument).eq(0).clone(true); + + if (this[0].parentNode) { + wrap.insertBefore(this[0]); + } + + wrap.map(function () { + var elem = this; + + while (elem.firstElementChild) { + elem = elem.firstElementChild; + } + + return elem; + }).append(this); + } + + return this; + }, + + wrapInner: function (html) { + if (isFunction(html)) { + return this.each(function (i) { + jQuery(this).wrapInner(html.call(this, i)); + }); + } + + return this.each(function () { + var self = jQuery(this), + contents = self.contents(); + + if (contents.length) { + contents.wrapAll(html); + + } else { + self.append(html); + } + }); + }, + + wrap: function (html) { + var htmlIsFunction = isFunction(html); + + return this.each(function (i) { + jQuery(this).wrapAll(htmlIsFunction ? html.call(this, i) : html); + }); + }, + + unwrap: function (selector) { + this.parent(selector).not("body").each(function () { + jQuery(this).replaceWith(this.childNodes); + }); + return this; + } + }); + + + jQuery.expr.pseudos.hidden = function (elem) { + return !jQuery.expr.pseudos.visible(elem); + }; + jQuery.expr.pseudos.visible = function (elem) { + return !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length); + }; + + + jQuery.ajaxSettings.xhr = function () { + try { + return new window.XMLHttpRequest(); + } catch (e) { + } + }; + + var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + + support.cors = !!xhrSupported && ("withCredentials" in xhrSupported); + support.ajax = xhrSupported = !!xhrSupported; + + jQuery.ajaxTransport(function (options) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if (support.cors || xhrSupported && !options.crossDomain) { + return { + send: function (headers, complete) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if (options.xhrFields) { + for (i in options.xhrFields) { + xhr[i] = options.xhrFields[i]; + } + } + + // Override mime type if needed + if (options.mimeType && xhr.overrideMimeType) { + xhr.overrideMimeType(options.mimeType); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if (!options.crossDomain && !headers["X-Requested-With"]) { + headers["X-Requested-With"] = "XMLHttpRequest"; + } + + // Set headers + for (i in headers) { + xhr.setRequestHeader(i, headers[i]); + } + + // Callback + callback = function (type) { + return function () { + if (callback) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.ontimeout = + xhr.onreadystatechange = null; + + if (type === "abort") { + xhr.abort(); + } else if (type === "error") { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if (typeof xhr.status !== "number") { + complete(0, "error"); + } else { + complete( + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[xhr.status] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + (xhr.responseType || "text") !== "text" || + typeof xhr.responseText !== "string" ? + {binary: xhr.response} : + {text: xhr.responseText}, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = xhr.ontimeout = callback("error"); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if (xhr.onabort !== undefined) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function () { + + // Check readyState before timeout as it changes + if (xhr.readyState === 4) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout(function () { + if (callback) { + errorCallback(); + } + }); + } + }; + } + + // Create the abort callback + callback = callback("abort"); + + try { + + // Do send the request (this may raise an exception) + xhr.send(options.hasContent && options.data || null); + } catch (e) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if (callback) { + throw e; + } + } + }, + + abort: function () { + if (callback) { + callback(); + } + } + }; + } + }); + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) + jQuery.ajaxPrefilter(function (s) { + if (s.crossDomain) { + s.contents.script = false; + } + }); + +// Install script dataType + jQuery.ajaxSetup({ + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function (text) { + jQuery.globalEval(text); + return text; + } + } + }); + +// Handle cache's special case and crossDomain + jQuery.ajaxPrefilter("script", function (s) { + if (s.cache === undefined) { + s.cache = false; + } + if (s.crossDomain) { + s.type = "GET"; + } + }); + +// Bind script tag hack transport + jQuery.ajaxTransport("script", function (s) { + + // This transport only deals with cross domain requests + if (s.crossDomain) { + var script, callback; + return { + send: function (_, complete) { + script = jQuery("